public boolean containsResponseFrom(Address mbr) { if(mbr == null) return false; for(int i=0; i < index; i++) { if(ping_rsps[i] != null && mbr.equals(ping_rsps[i].getAddress())) return true; } return false; }
public PingData findResponseFrom(Address mbr) { if(mbr == null) return null; for(int i=0; i < index; i++) { if(ping_rsps[i] != null && mbr.equals(ping_rsps[i].getAddress())) return ping_rsps[i]; } return null; }
protected static String print(List<PingData> rsps) { StringBuilder sb=new StringBuilder(); for(PingData rsp: rsps) sb.append(rsp.getAddress() + " "); return sb.toString(); }
protected static String print(Responses rsps) { StringBuilder sb=new StringBuilder(); for(PingData rsp: rsps) sb.append(rsp.getAddress() + " "); return sb.toString(); }
/** Returns all members whose PingData is flagged as coordinator */ private static List<Address> getCoords(Iterable<PingData> mbrs) { if(mbrs == null) return null; List<Address> coords=null; for(PingData mbr: mbrs) { if(mbr.isCoord()) { if(coords == null) coords=new ArrayList<>(); if(!coords.contains(mbr.getAddress())) coords.add(mbr.getAddress()); } } return coords; }
protected void handleDiscoveryResponse(PingData data, Address sender) { // add physical address (if available) to transport's cache Address logical_addr=data.getAddress() != null? data.getAddress() : sender; addDiscoveryResponseToCaches(logical_addr, data.getLogicalName(), data.getPhysicalAddr()); boolean overwrite=Objects.equals(logical_addr, sender); addResponse(data, overwrite); }
@Override public void findMembers(List<Address> members, boolean initial_discovery, Responses responses) { num_discovery_requests++; List<PingData> retval=(List<PingData>)down_prot.down(new Event(Event.GET_PING_DATA, cluster_name)); if(retval != null) retval.stream().filter(data -> !data.getAddress().equals(local_addr)).forEach(data -> responses.addResponse(data, false)); responses.done(); // so waitFor() doesn't block at all }
protected void write(List<PingData> list, OutputStream out) throws Exception { try { for(PingData data: list) { String logical_name=data.getLogicalName(); Address addr=data.getAddress(); PhysicalAddress phys_addr=data.getPhysicalAddr(); if(logical_name == null || addr == null || phys_addr == null) continue; out.write(logical_name.getBytes()); out.write(WHITESPACE); out.write(addressAsString(addr).getBytes()); out.write(WHITESPACE); out.write(phys_addr.toString().getBytes()); out.write(WHITESPACE); out.write(data.isCoord()? String.format("T%n").getBytes() : String.format("F%n").getBytes()); } } finally { Util.close(out); } }
if(members == null || members.contains(data.getAddress())) responses.addResponse(data, true); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr());
/** Handles the case where no coord responses were received. Returns true if we became the coord * (caller needs to terminate the join() call), or false when the caller needs to continue */ protected boolean firstOfAllClients(final Address joiner, final Responses rsps) { log.trace("%s: could not determine coordinator from rsps %s", gms.local_addr, rsps); // so the member to become singleton member (and thus coord) is the first of all clients SortedSet<Address> clients=new TreeSet<>(); clients.add(joiner); // add myself again (was removed by findInitialMembers()) for(PingData response: rsps) clients.add(response.getAddress()); log.trace("%s: nodes to choose new coord from are: %s", gms.local_addr, clients); Address new_coord=clients.first(); if(new_coord.equals(joiner)) { log.trace("%s: I (%s) am the first of the nodes, will become coordinator", gms.local_addr, joiner); becomeSingletonMember(joiner); return true; } log.trace("%s: I (%s) am not the first of the nodes, waiting for another client to become coordinator", gms.local_addr, joiner); // Util.sleep(500); return false; }
protected void readResponse(GetResponse rsp, List<Address> mbrs, Responses responses) { if(rsp.object == null) return; byte[] buf=rsp.object.data; List<PingData> list; if(buf != null && buf.length > 0) { try { list=read(new ByteArrayInputStream(buf)); if(list != null) { for(PingData data : list) { if(mbrs == null || mbrs.contains(data.getAddress())) responses.addResponse(data, data.isCoord()); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr()); } } } catch(Throwable e) { log.error(Util.getMessage("FailedUnmarshallingResponse"), e); } } }
@Override protected void readAll(List<Address> members, String clustername, Responses responses) { try { List<String> objects = rackspaceClient.listObjects(container); for(String object: objects) { List<PingData> list=null; byte[] bytes = rackspaceClient.readObject(container, object); if((list=read(new ByteArrayInputStream(bytes))) == null) { log.warn("failed reading " + object); continue; } for(PingData data: list) { if(members == null || members.contains(data.getAddress())) responses.addResponse(data, data.isCoord()); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr()); } } } catch (Exception e) { log.error(Util.getMessage("ErrorUnmarshallingObject"), e); } }
PingData data=deserialize(bytes); reads++; if(data == null || (members != null && !members.contains(data.getAddress()))) continue; rsps.addResponse(data, false); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr());
@Override protected void readAll(List<Address> members, String clustername, Responses responses) { try { List<String> objects = swiftClient.listObjects(container); for(String object: objects) { List<PingData> list=null; byte[] bytes = swiftClient.readObject(container, object); if((list=read(new ByteArrayInputStream(bytes))) == null) { log.warn("failed reading " + object); continue; } for(PingData data: list) { if(members == null || members.contains(data.getAddress())) responses.addResponse(data, data.isCoord()); if(local_addr != null && !local_addr.equals(data.getAddress())) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr()); } } } catch (Exception e) { log.error(Util.getMessage("ErrorUnmarshallingObject"), e); } }
protected void sendToSingleMember(final Address dest, byte[] buf, int offset, int length) throws Exception { if(dest instanceof PhysicalAddress) { sendUnicast((PhysicalAddress)dest, buf, offset, length); return; } PhysicalAddress physical_dest; if((physical_dest=getPhysicalAddressFromCache(dest)) != null) { sendUnicast(physical_dest,buf,offset,length); return; } if(who_has_cache.addIfAbsentOrExpired(dest)) { // true if address was added // FIND_MBRS must return quickly Responses responses=fetchResponsesFromDiscoveryProtocol(Collections.singletonList(dest)); try { for(PingData data : responses) { if(data.getAddress() != null && data.getAddress().equals(dest)) { if((physical_dest=data.getPhysicalAddr()) != null) { sendUnicast(physical_dest, buf, offset, length); return; } } } log.warn(Util.getMessage("PhysicalAddrMissing"), local_addr, dest); } finally { responses.done(); } } }
@ManagedOperation(description="Reads logical-physical address mappings and logical name mappings from a " + "file (or URL) and adds them to the local caches") public void addToCache(String filename) throws Exception { InputStream in=ConfiguratorFactory.getConfigStream(filename); List<PingData> list=read(in); if(list != null) for(PingData data: list) addDiscoveryResponseToCaches(data.getAddress(), data.getLogicalName(), data.getPhysicalAddr()); }
protected void sendInfoMessage(PingData data) { if(data == null) return; Address target=data.getAddress(); if(local_addr.equals(target)) return; Address dest=data.getPhysicalAddr(); if(dest == null) { log.warn("%s: physical address for %s not found; dropping INFO message to %s", local_addr, target, target); return; } MergeHeader hdr=createInfo(); Message info=new Message(dest).setFlag(Message.Flag.INTERNAL).putHeader(getId(), hdr); down_prot.down(info); }
protected synchronized void writeToDB(PingData data, String clustername, boolean overwrite) { final String ownAddress = addressAsString(data.getAddress()); final Connection connection = getConnection(); if (connection != null) { try { if(overwrite) delete(connection, clustername, ownAddress); else { if(contains(clustername, data.getAddress())) return; } insert(connection, data, clustername, ownAddress); } catch (SQLException e) { log.error(Util.getMessage("ErrorUpdatingJDBCPINGTable"), e); } finally { closeConnection(connection); } } else { log.error(Util.getMessage("FailedToStorePingDataInDatabase")); } }
/** * Creates a byte[] representation of the PingData, but DISCARDING the view it contains. * @param data the PingData instance to serialize. * @return */ protected byte[] serializeWithoutView(PingData data) { final PingData clone = new PingData(data.getAddress(), data.isServer(), data.getLogicalName(), data.getPhysicalAddr()).coord(data.isCoord()); try { return Util.streamableToByteBuffer(clone); } catch(Exception e) { log.error(Util.getMessage("ErrorSerializingPingData"), e); return null; } }
Address logical_addr=data != null? data.getAddress() : msg.src();