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 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); } } }
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 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); } } }
sendToAllMembersInGroup(dest_group, msg, sender);