public int compareTo(Address other) { if(other instanceof SiteMaster) { SiteMaster tmp=(SiteMaster)other; return Util.compare(get(SITE_NAME), tmp.get(SITE_NAME)); } return super.compareTo(other); }
protected void deliverLocally(SiteAddress dest, SiteAddress sender, Message msg) { Address local_dest; boolean send_to_coord=false; if(dest instanceof SiteUUID) { if(dest instanceof SiteMaster) { local_dest=pickSiteMaster(sender); if(local_dest == null) throw new IllegalStateException("site master was null"); send_to_coord=true; } else { SiteUUID tmp=(SiteUUID)dest; local_dest=new UUID(tmp.getMostSignificantBits(), tmp.getLeastSignificantBits()); } } else local_dest=dest; if(log.isTraceEnabled()) log.trace(local_addr + ": delivering message to " + dest + " in local cluster"); long start=stats? System.nanoTime() : 0; forwardTo(local_dest, dest, sender, msg, send_to_coord); if(stats) { forward_to_local_mbr_time.add(System.nanoTime() - start); forward_to_local_mbr.increment(); } }
public String print(boolean detailed) { String name=getName(); String retval=name != null? name : NameCache.get(this); return retval + ":" + getSite() + (detailed? printOthers() : ""); }
/** Called to handle a message received by the relayer */ protected void handleRelayMessage(Relay2Header hdr, Message msg) { if(hdr.final_dest != null) { Message message=msg; Relay2Header header=hdr; if(header.type == Relay2Header.DATA && can_forward_local_cluster) { SiteUUID site_uuid=(SiteUUID)hdr.final_dest; // If configured to do so, we want to load-balance these messages, UUID tmp=(UUID)Util.pickRandomElement(members); SiteAddress final_dest=new SiteUUID(tmp, site_uuid.getName(), site_uuid.getSite()); // If we select a different address to handle this message, we handle it here. if(!final_dest.equals(hdr.final_dest)) { message=copy(msg); header=new Relay2Header(Relay2Header.DATA, final_dest, hdr.original_sender ); message.putHeader(id, header); } } handleMessage(header, message); } else { Message copy=copy(msg).dest(null).src(null).putHeader(id, hdr); down_prot.down(copy); // multicast locally // Don't forward: https://issues.jboss.org/browse/JGRP-1519 // sendToBridges(msg.getSrc(), buf, from_site, site_id); // forward to all bridges except self and from } }
public Object up(Message msg) { Relay2Header hdr=msg.getHeader(id); Address dest=msg.getDest(); if(hdr == null) { // forward a multicast message to all bridges except myself, then pass up if(dest == null && is_site_master && relay_multicasts && !msg.isFlagSet(Message.Flag.NO_RELAY)) { Address src=msg.getSrc(); Address sender=new SiteUUID((UUID)msg.getSrc(), NameCache.get(msg.getSrc()), site); if(src instanceof ExtendedUUID) ((SiteUUID)sender).addContents((ExtendedUUID)src); sendToBridges(sender, msg, site); } return up_prot.up(msg); // pass up } else { // header is not null if(dest != null) handleMessage(hdr, msg); else deliver(null, hdr.original_sender, msg); } return null; }
Address src=msg.getSrc(); SiteAddress sender=src instanceof SiteMaster? new SiteMaster(((SiteMaster)src).getSite()) : new SiteUUID((UUID)local_addr, NameCache.get(local_addr), site); if(local_addr instanceof ExtendedUUID) ((ExtendedUUID)sender).addContents((ExtendedUUID)local_addr);
public String getName() { return Util.bytesToString(get(NAME)); }
protected static boolean isExcluded(Route route, String... excluded_sites) { if(excluded_sites == null) return false; String site=((SiteUUID)route.site_master).getSite(); for(String excluded_site: excluded_sites) if(site.equals(excluded_site)) return true; return false; }
@Override public String toString() { return print(false); }
public String print(boolean detailed) { String name=getName(); String retval=name != null? name : NameCache.get(this); return retval + ":" + getSite() + (detailed? printOthers() : ""); }
/** Called to handle a message received by the relayer */ protected void handleRelayMessage(Relay2Header hdr, Message msg) { if(hdr.final_dest != null) { Message message=msg; Relay2Header header=hdr; if(header.type == Relay2Header.DATA && can_forward_local_cluster) { SiteUUID site_uuid=(SiteUUID)hdr.final_dest; // If configured to do so, we want to load-balance these messages, UUID tmp=(UUID)Util.pickRandomElement(members); SiteAddress final_dest=new SiteUUID(tmp, site_uuid.getName(), site_uuid.getSite()); // If we select a different address to handle this message, we handle it here. if(!final_dest.equals(hdr.final_dest)) { message=copy(msg); header=new Relay2Header(Relay2Header.DATA, final_dest, hdr.original_sender ); message.putHeader(id, header); } } handleMessage(header, message); } else { Message copy=copy(msg).dest(null).src(null).putHeader(id, hdr); down_prot.down(copy); // multicast locally // Don't forward: https://issues.jboss.org/browse/JGRP-1519 // sendToBridges(msg.getSrc(), buf, from_site, site_id); // forward to all bridges except self and from } }
public void up(MessageBatch batch) { for(Message msg: batch) { Relay2Header hdr=msg.getHeader(id); Address dest=msg.getDest(); if(hdr == null) { // forward a multicast message to all bridges except myself, then pass up if(dest == null && is_site_master && relay_multicasts && !msg.isFlagSet(Message.Flag.NO_RELAY)) { Address src=msg.getSrc(); Address sender=new SiteUUID((UUID)msg.getSrc(), NameCache.get(msg.getSrc()), site); if(src instanceof ExtendedUUID) ((SiteUUID)sender).addContents((ExtendedUUID)src); sendToBridges(sender, msg, site); } } else { // header is not null batch.remove(msg); // message is consumed if(dest != null) handleMessage(hdr, msg); else deliver(null, hdr.original_sender, msg); } } if(!batch.isEmpty()) up_prot.up(batch); }
for(RelayConfig.BridgeConfig bridge_config: bridge_configs) { Bridge bridge=new Bridge(bridge_config.createChannel(), bridge_config.getClusterName(), bridge_name, () -> new SiteUUID(UUID.randomUUID(), null, my_site_id)); bridges.add(bridge);
public String getSite() { return Util.bytesToString(get(SITE_NAME)); }
protected static boolean isExcluded(Route route, String... excluded_sites) { if(excluded_sites == null) return false; String site=((SiteUUID)route.site_master).getSite(); for(String excluded_site: excluded_sites) if(site.equals(excluded_site)) return true; return false; }
@Override public String toString() { return print(false); }
public Object up(Message msg) { Relay2Header hdr=msg.getHeader(id); Address dest=msg.getDest(); if(hdr == null) { // forward a multicast message to all bridges except myself, then pass up if(dest == null && is_site_master && relay_multicasts && !msg.isFlagSet(Message.Flag.NO_RELAY)) { Address src=msg.getSrc(); Address sender=new SiteUUID((UUID)msg.getSrc(), NameCache.get(msg.getSrc()), site); if(src instanceof ExtendedUUID) ((SiteUUID)sender).addContents((ExtendedUUID)src); sendToBridges(sender, msg, site); } return up_prot.up(msg); // pass up } else { // header is not null if(dest != null) handleMessage(hdr, msg); else deliver(null, hdr.original_sender, msg); } return null; }
/** * Sends a SITE-UNREACHABLE message to the sender of the message. Because the sender is always local (we're the * relayer), no routing needs to be done * @param dest * @param target_site */ protected void sendSiteUnreachableTo(Address dest, String target_site) { Message msg=new Message(dest).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .src(new SiteUUID((UUID)local_addr, NameCache.get(local_addr), site)) .putHeader(id,new Relay2Header(Relay2Header.SITE_UNREACHABLE,new SiteMaster(target_site),null)); down_prot.down(msg); }