public void configure() throws Exception { timer=getTransport().getTimer(); if(site == null) throw new IllegalArgumentException("site cannot be null"); TP tp=getTransport(); if(tp.getUseIpAddresses()) throw new IllegalArgumentException(String.format("%s cannot be used if %s.use_ip_addrs is true", parseSiteConfiguration(sites); "with hierarchical routing (https://issues.jboss.org/browse/JGRP-1506)"); List<Integer> available_down_services=getDownServices(); forwarding_protocol_present=available_down_services != null && available_down_services.contains(Event.FORWARD_TO_COORD); if(!forwarding_protocol_present && warn_when_ftc_missing && log.isWarnEnabled()) JChannel ch=getProtocolStack().getChannel(); ch.addAddressGenerator(() -> { ExtendedUUID retval=ExtendedUUID.randomUUID(); prots_above=getIdsAbove();
relay.setRouteStatusListener(new RouteStatusListener() { public void sitesUp(String... sites) { System.out.printf("-- %s: site(s) %s came up\n",
protected Message createMessage(Address target, Address final_destination, Address original_sender, final Message msg) { Message copy=relay.copy(msg).dest(target).src(null); RELAY2.Relay2Header hdr=new RELAY2.Relay2Header(RELAY2.Relay2Header.DATA, final_destination, original_sender); copy.putHeader(relay.getId(), hdr); return copy; } }
List<Address> new_site_masters=determineSiteMasters(view); final Relayer tmp=relayer; if(async_relay_creation) timer.execute(() -> startRelayer(tmp, bridge_name)); else startRelayer(relayer, bridge_name); notifySiteMasterListener(true); notifySiteMasterListener(false); log.trace(local_addr + ": ceased to be site master; closing bridges"); if(relayer != null)
/** * Routes the message to the target destination, used by a site master (coordinator) * @param dest * @param sender the address of the sender * @param msg The message */ protected void route(SiteAddress dest, SiteAddress sender, Message msg) { String target_site=dest.getSite(); if(target_site.equals(site)) { if(local_addr.equals(dest) || ((dest instanceof SiteMaster) && is_site_master)) { deliver(dest, sender, msg); } else deliverLocally(dest, sender, msg); // send to member in same local site return; } Relayer tmp=relayer; if(tmp == null) { log.warn(local_addr + ": not site master; dropping message"); return; } Route route=tmp.getRoute(target_site, sender); if(route == null) { log.error(local_addr + ": no route to " + target_site + ": dropping message"); sendSiteUnreachableTo(sender, target_site); } else route.send(dest,sender,msg); }
bridges.put(clusterName, bridge); RELAY2 relay = new RELAY2().site(localSite); relay.setRouteStatusListener(new DefaultRouteStatusListener()); for (String site: sites) { RelayConfig.SiteConfig siteConfig = new RelayConfig.SiteConfig(site); relay.addSite(site, siteConfig); if (site.equals(localSite)) { for (RelayConfig.BridgeConfig bridge: bridges.values()) { Configurator.resolveAndInvokePropertyMethods(relay, relayConfig.getProperties()); stack.addProtocol(relay); relay.init();
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; }
forwardTo(local_addr, target, sender, msg, false); if(stats) { local_delivery_time.add(System.nanoTime() - start); deliverLocally(target, sender, msg); return null; Address site_master=pickSiteMaster(sender); if(site_master == null) throw new IllegalStateException("site master is null"); forwardTo(site_master, target, sender, msg, max_site_masters == 1); if(stats) { forward_sm_time.add(System.nanoTime() - start); route(target, sender, msg); return null;
public void send(Address final_destination, Address original_sender, final Message msg) { if(log.isTraceEnabled()) log.trace("routing message to " + final_destination + " via " + site_master); long start=stats? System.nanoTime() : 0; try { Message copy=createMessage(site_master, final_destination, original_sender, msg); bridge.send(copy); if(stats) { relay.addToRelayedTime(System.nanoTime() - start); relay.incrementRelayed(); } } catch(Exception e) { log.error(Util.getMessage("FailureRelayingMessage"), e); } }
/** 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 } }
@Override protected void parseSiteConfiguration(Map<String, RelayConfig.SiteConfig> map) throws Exception { super.parseSiteConfiguration(map); String testName = TestResourceTracker.getCurrentTestName(); map.forEach((s, siteConfig) -> { List<RelayConfig.BridgeConfig> bridges = siteConfig.getBridges(); for (int i = 0; i < bridges.size(); i++) { RelayConfig.BridgeConfig bridgeConfig = bridges.get(i); String config = (String) TestingUtil.extractField(RelayConfig.PropertiesBridgeConfig.class, bridgeConfig, "config"); // Keep the same ports for all the tests, just change the cluster name String clusterName = "bridge-" + (testName != null ? testName : "namenotset"); bridges.set(i, new RelayConfig.PropertiesBridgeConfig(clusterName, config)); } }); } }
protected void deliver(Address dest, Address sender, final Message msg) { try { Message copy=copy(msg).dest(dest).src(sender); if(log.isTraceEnabled()) log.trace(local_addr + ": delivering message from " + sender); long start=stats? System.nanoTime() : 0; up_prot.up(copy); if(stats) { local_delivery_time.add(System.nanoTime() - start); local_deliveries.increment(); } } catch(Exception e) { log.error(Util.getMessage("FailedDeliveringMessage"), e); } }
public void init() throws Exception { super.init(); configure(); if(site_master_picker == null) { site_master_picker=new SiteMasterPicker() { public Address pickSiteMaster(List<Address> site_masters, Address original_sender) { return Util.pickRandomElement(site_masters); } public Route pickRoute(String site, List<Route> routes, Address original_sender) { return Util.pickRandomElement(routes); } }; } }
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); }
forwardTo(local_addr, target, sender, msg, false); if(stats) { local_delivery_time.add(System.nanoTime() - start); deliverLocally(target, sender, msg); return null; Address site_master=pickSiteMaster(sender); if(site_master == null) throw new IllegalStateException("site master is null"); forwardTo(site_master, target, sender, msg, max_site_masters == 1); if(stats) { forward_sm_time.add(System.nanoTime() - start); route(target, sender, msg); return null;
/** * Routes the message to the target destination, used by a site master (coordinator) * @param dest * @param sender the address of the sender * @param msg The message */ protected void route(SiteAddress dest, SiteAddress sender, Message msg) { String target_site=dest.getSite(); if(target_site.equals(site)) { if(local_addr.equals(dest) || ((dest instanceof SiteMaster) && is_site_master)) { deliver(dest, sender, msg); } else deliverLocally(dest, sender, msg); // send to member in same local site return; } Relayer tmp=relayer; if(tmp == null) { log.warn(local_addr + ": not site master; dropping message"); return; } Route route=tmp.getRoute(target_site, sender); if(route == null) { log.error(local_addr + ": no route to " + target_site + ": dropping message"); sendSiteUnreachableTo(sender, target_site); } else route.send(dest,sender,msg); }
List<Address> new_site_masters=determineSiteMasters(view); final Relayer tmp=relayer; if(async_relay_creation) timer.execute(() -> startRelayer(tmp, bridge_name)); else startRelayer(relayer, bridge_name); notifySiteMasterListener(true); notifySiteMasterListener(false); log.trace(local_addr + ": ceased to be site master; closing bridges"); if(relayer != null)
protected Message createMessage(Address target, Address final_destination, Address original_sender, final Message msg) { Message copy=relay.copy(msg).dest(target).src(null); RELAY2.Relay2Header hdr=new RELAY2.Relay2Header(RELAY2.Relay2Header.DATA, final_destination, original_sender); copy.putHeader(relay.getId(), hdr); return copy; } }
public void send(Address final_destination, Address original_sender, final Message msg) { if(log.isTraceEnabled()) log.trace("routing message to " + final_destination + " via " + site_master); long start=stats? System.nanoTime() : 0; try { Message copy=createMessage(site_master, final_destination, original_sender, msg); bridge.send(copy); if(stats) { relay.addToRelayedTime(System.nanoTime() - start); relay.incrementRelayed(); } } catch(Exception e) { log.error(Util.getMessage("FailureRelayingMessage"), e); } }