protected int[] numResponses() { lock.lock(); try { int[] num={0,0}; for(int i=0; i < index; i++) { PingData data=ping_rsps[i]; num[0]++; if(data.isCoord()) num[1]++; } return num; } finally { lock.unlock(); } }
public String toString() { StringBuilder sb=new StringBuilder(); sb.append(sender); if(logical_name != null) sb.append(", name=").append(logical_name); if(physical_addr != null) sb.append(", addr=").append(physical_addr); if(isCoord()) sb.append(", coord"); else if(isServer()) sb.append(", server"); if(mbrs != null) sb.append(", mbrs=" + mbrs.size()); return sb.toString(); }
public static String printPingData(List<PingData> rsps) { StringBuilder sb=new StringBuilder(); if(rsps != null) { int total=rsps.size(); int servers=0, clients=0, coords=0; for(PingData rsp : rsps) { if(rsp.isCoord()) coords++; if(rsp.isServer()) servers++; else clients++; } sb.append(total + " total (" + servers + " servers (" + coords + " coord), " + clients + " clients)"); } 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; }
public void addResponse(PingData rsp, boolean overwrite) { if(rsp == null) return; boolean is_coord_rsp=rsp.isCoord(), changed=false; lock.lock(); try { // https://jira.jboss.org/jira/browse/JGRP-1179 int ind=find(rsp); if(ind == -1) { // new addition add(rsp); changed=true; } else { PingData existing=ping_rsps[ind]; // cannot be null if(overwrite || (is_coord_rsp && !existing.isCoord())) { ping_rsps[ind]=rsp; changed=true; } } if(changed && ((num_expected_rsps > 0 && index >= num_expected_rsps) || break_on_coord_rsp && is_coord_rsp)) _done(); } finally { lock.unlock(); } }
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); } }
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 = 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); } }
@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); } }
/** * 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; } }
protected int[] numResponses() { lock.lock(); try { int[] num={0,0}; for(int i=0; i < index; i++) { PingData data=ping_rsps[i]; num[0]++; if(data.isCoord()) num[1]++; } return num; } finally { lock.unlock(); } }
public String toString() { StringBuilder sb=new StringBuilder(); sb.append(sender); if(logical_name != null) sb.append(", name=").append(logical_name); if(physical_addr != null) sb.append(", addr=").append(physical_addr); if(isCoord()) sb.append(", coord"); else if(isServer()) sb.append(", server"); if(mbrs != null) sb.append(", mbrs=" + mbrs.size()); return sb.toString(); }
public static String printPingData(List<PingData> rsps) { StringBuilder sb=new StringBuilder(); if(rsps != null) { int total=rsps.size(); int servers=0, clients=0, coords=0; for(PingData rsp : rsps) { if(rsp.isCoord()) coords++; if(rsp.isServer()) servers++; else clients++; } sb.append(total + " total (" + servers + " servers (" + coords + " coord), " + clients + " clients)"); } 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 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); } }
protected void parsePingData(final byte[] pingBytes, final List<Address> members, final Responses responses) { if (pingBytes == null || pingBytes.length <= 0) { return; } List<PingData> list; try { list = read(new ByteArrayInputStream(pingBytes)); if (list != null) { // This is a common piece of logic for all PING protocols copied from org/jgroups/protocols/FILE_PING.java:245 // Maybe could be extracted for all PING impls to share this logic? 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()); } } // end copied block } } catch (Exception e) { log.error("Error unmarshalling ping data.", e); } }
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); } } }
protected void readResponse(S3ObjectSummary summary, List<Address> members, Responses responses) { S3Object object = amazonS3.getObject(summary.getBucketName(), summary.getKey()); List<PingData> list; try { list = read(object.getObjectContent()); if (list != null) { 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 (Throwable e) { log.error("failed unmarshalling response", e); } }
/** * 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; } }