continue; help(); return; router=new GossipRouter(bind_addr, port) .jmx(jmx).expiryTime(expiry_time) .useNio(nio) .backlog(backlog) .socketReadTimeout(soTimeout) .lingerTimeout(soLinger) .emitSuspectEvents(suspects) .dumpMessages(dump_msgs); router.start(); IpAddress local=(IpAddress)router.localAddress(); System.out.printf("\nGossipRouter listening on %s:%s\n", bind_addr != null? bind_addr : "0.0.0.0", local.getPort());
protected void route(String group, Address dest, byte[] msg, int offset, int length) { ConcurrentMap<Address,Entry> map=address_mappings.get(group); if(map == null) return; if(dest != null) { // unicast Entry entry=map.get(dest); if(entry != null) sendToMember(entry.client_addr, msg, offset, length); else log.warn("dest %s in cluster %s not found", dest, group); } else { // multicast - send to all members in group Set<Map.Entry<Address,Entry>> dests=map.entrySet(); sendToAllMembersInGroup(dests, msg, offset, length); } }
protected void handleRegister(Address sender, DataInput in) { GossipData req=readRequest(in, GossipType.REGISTER); if(req != null) { String group=req.getGroup(); Address addr=req.getAddress(); PhysicalAddress phys_addr=req.getPhysicalAddress(); String logical_name=req.getLogicalName(); addAddressMapping(sender, group, addr, phys_addr, logical_name); } }
switch(type) { case REGISTER: handleRegister(sender, in); break; if((request=readRequest(in, type)) != null) { ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(request.serializedSize()); request.writeTo(out); route(request.group, request.addr, out.buffer(), 0, out.position()); dump(request); handleGetMembersRequest(sender, in); break; handleUnregister(in); break;
continue; help(); return; router=new GossipRouter(port, bind_addr, expiry, timeout, routingTimeout); router.start();
sendToAllMembersInGroup(dest_group, msg, sender); AddressEntry ae=findAddressEntry(dest_group, dest); if(ae == null) { if(log.isTraceEnabled()) log.trace("cannot find " + dest + " in the routing table, \nrouting table=\n" + dumpRoutingTable()); return; sendToMember(dest, ae.output, msg, sender); removeEntry(dest_group, dest); // will close socket
gossipRouterPort); res = new GossipRouter(gossipRouterPort, null, true);
logger.debug("Trying to start Gossiper"); try { this.gossiper.start(); logger.info("Started GossipRouter"); } catch (Exception e) {
protected void removeFromAddressMappings(Address client_addr) { if(client_addr == null) return; Set<Tuple<String,Address>> suspects=null; // group/address pairs for(Map.Entry<String,ConcurrentMap<Address,Entry>> entry: address_mappings.entrySet()) { ConcurrentMap<Address,Entry> map=entry.getValue(); for(Map.Entry<Address,Entry> entry2: map.entrySet()) { Entry e=entry2.getValue(); if(client_addr.equals(e.client_addr)) { map.remove(entry2.getKey()); log.debug("connection to %s closed", client_addr); if(map.isEmpty()) address_mappings.remove(entry.getKey()); if(suspects == null) suspects=new HashSet<>(); suspects.add(new Tuple<>(entry.getKey(), entry2.getKey())); break; } } } if(emit_suspect_events && suspects != null && !suspects.isEmpty()) { for(Tuple<String,Address> suspect: suspects) { String group=suspect.getVal1(); Address addr=suspect.getVal2(); ConcurrentMap<Address,Entry> map=address_mappings.get(group); if(map == null) continue; GossipData data=new GossipData(GossipType.SUSPECT, group, addr); sendToAllMembersInGroup(map.entrySet(), data); } } }
private void sendToAllMembersInGroup(String groupname, byte[] msg, Address sender) { Map val; val=routingTable.get(groupname); if(val == null || val.isEmpty()) return; Map.Entry tmp; AddressEntry entry; synchronized(val) { for(Iterator i=val.entrySet().iterator(); i.hasNext();) { tmp=(Map.Entry)i.next(); entry=(GossipRouter.AddressEntry)tmp.getValue(); DataOutputStream dos=entry.output; if(dos != null) { // send only to 'connected' members try { sendToMember(null, dos, msg, sender); } catch(Exception e) { if(log.isWarnEnabled()) log.warn("cannot send to " + entry.logical_addr + ": " + e.getMessage()); entry.destroy(); // this closes the socket i.remove(); } } } } }
handleRegister(sender, in); break; String group=Bits.readString(in); Address dest=Util.readAddress(in); route(group, dest, buf, offset, length); GossipData data=new GossipData(); data.readFrom(input); dump(data); handleGetMembersRequest(sender, in); break; handleUnregister(in); break;
protected void removeFromAddressMappings(Address client_addr) { if(client_addr == null) return; Set<Tuple<String,Address>> suspects=null; // group/address pairs for(Map.Entry<String,ConcurrentMap<Address,Entry>> entry: address_mappings.entrySet()) { ConcurrentMap<Address,Entry> map=entry.getValue(); for(Map.Entry<Address,Entry> entry2: map.entrySet()) { Entry e=entry2.getValue(); if(client_addr.equals(e.client_addr)) { map.remove(entry2.getKey()); log.debug("connection to %s closed", client_addr); if(map.isEmpty()) address_mappings.remove(entry.getKey()); if(suspects == null) suspects=new HashSet<>(); suspects.add(new Tuple<>(entry.getKey(), entry2.getKey())); break; } } } if(emit_suspect_events && suspects != null && !suspects.isEmpty()) { for(Tuple<String,Address> suspect: suspects) { String group=suspect.getVal1(); Address addr=suspect.getVal2(); ConcurrentMap<Address,Entry> map=address_mappings.get(group); if(map == null) continue; GossipData data=new GossipData(GossipType.SUSPECT, group, addr); sendToAllMembersInGroup(map.entrySet(), data); } } }
continue; help(); return; router=new GossipRouter(bind_addr, port) .jmx(jmx).expiryTime(expiry_time) .useNio(nio) .backlog(backlog) .socketReadTimeout(soTimeout) .lingerTimeout(soLinger) .emitSuspectEvents(suspects) .dumpMessages(dump_msgs); router.start(); IpAddress local=(IpAddress)router.localAddress(); System.out.printf("\nGossipRouter listening on %s:%s\n", bind_addr != null? bind_addr : "0.0.0.0", local.getPort());
switch(type) { case REGISTER: handleRegister(sender, in); break; if((request=readRequest(in, type)) != null) { ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(request.serializedSize()); request.writeTo(out); route(request.group, request.addr, out.buffer(), 0, out.position()); dump(request); handleGetMembersRequest(sender, in); break; handleUnregister(in); break;
protected void route(String group, Address dest, byte[] msg, int offset, int length) { ConcurrentMap<Address,Entry> map=address_mappings.get(group); if(map == null) return; if(dest != null) { // unicast Entry entry=map.get(dest); if(entry != null) sendToMember(entry.client_addr, msg, offset, length); else log.warn("dest %s in cluster %s not found", dest, group); } else { // multicast - send to all members in group Set<Map.Entry<Address,Entry>> dests=map.entrySet(); sendToAllMembersInGroup(dests, msg, offset, length); } }
protected void handleRegister(Address sender, DataInput in) { GossipData req=readRequest(in, GossipType.REGISTER); if(req != null) { String group=req.getGroup(); Address addr=req.getAddress(); PhysicalAddress phys_addr=req.getPhysicalAddress(); String logical_name=req.getLogicalName(); addAddressMapping(sender, group, addr, phys_addr, logical_name); } }
handleRegister(sender, in); break; String group=Bits.readString(in); Address dest=Util.readAddress(in); route(group, dest, buf, offset, length); GossipData data=new GossipData(); data.readFrom(input); dump(data); handleGetMembersRequest(sender, in); break; handleUnregister(in); break;