public Digest copy() { return new Digest(members, Arrays.copyOf(seqnos, seqnos.length)); }
public boolean hasNext() { return index < capacity(); }
/** Creates a new digest from an existing map by copying the keys and values from map */ public Digest(Map<Address, long[]> map) { createArrays(map); checkPostcondition(); }
public void readFrom(DataInput in) throws Exception { byte flags=in.readByte(); // 1. view if((flags & VIEW_PRESENT) == VIEW_PRESENT) { view=new View(); view.readFrom(in); } // 2. digest if((flags & DIGEST_PRESENT) == DIGEST_PRESENT) { digest=new Digest(view.getMembersRaw()); digest.readFrom(in, false); } // 3. fail_reason if((flags & FAIL_REASON_PRESENT) == FAIL_REASON_PRESENT) fail_reason=in.readUTF(); }
protected boolean isJoinResponseValid(final JoinRsp rsp) { if(rsp.getFailReason() != null) throw new SecurityException(rsp.getFailReason()); Digest tmp_digest=rsp.getDigest(); if(tmp_digest == null || tmp_digest.capacity() == 0) { log.warn("%s: digest is empty: digest=%s", gms.local_addr, rsp.getDigest()); return false; } if(!tmp_digest.contains(gms.local_addr)) { log.error("%s: digest in JOIN_RSP does not contain myself; join response: %s", gms.local_addr, rsp); return false; } if(rsp.getView() == null) { log.error("%s: JoinRsp has a null view, skipping it", gms.local_addr); return false; } return true; }
public String toString(final Address[] order, boolean print_highest_received) { StringBuilder sb=new StringBuilder(); boolean first=true; if(capacity() == 0) return "[]"; int count=0, capacity=capacity(); for(Address key: order) { long[] tmp_seqnos=key != null? get(key) : null; if(key == null || tmp_seqnos == null) continue; if(!first) sb.append(", "); else first=false; sb.append(key).append(": ").append('[').append(tmp_seqnos[0]); if(print_highest_received) sb.append(" (").append(tmp_seqnos[1]).append(")"); sb.append("]"); if(Util.MAX_LIST_PRINT_SIZE > 0 && ++count >= Util.MAX_LIST_PRINT_SIZE) { if(capacity > count) sb.append(", ..."); break; } } return sb.toString(); }
/** Only used for testing */ public Digest(Digest digest) { if(digest == null) return; this.members=digest.members; // the members list is immutable this.seqnos=(digest instanceof MutableDigest || this instanceof MutableDigest)? Arrays.copyOf((digest).seqnos, digest.seqnos.length) : digest.seqnos; checkPostcondition(); }
/** * Returns true if all senders of the current digest have their seqnos >= the ones from other */ protected static boolean isGreaterThanOrEqual(Digest first, Digest other) { if(other == null) return true; for(Digest.Entry entry: first) { Address sender=entry.getMember(); long[] their_entry=other.get(sender); if(their_entry == null) continue; long my_highest=entry.getHighest(); long their_highest=Math.max(their_entry[0],their_entry[1]); if(my_highest < their_highest) return false; } return true; }
/** * Returns the highest delivered and received seqnos associated with a member. * @param member * @return An array of 2 elements: highest_delivered and highest_received seqnos */ public long[] get(Address member) { int index=find(member); if(index < 0) return null; return new long[]{seqnos[index * 2], seqnos[index * 2 +1]}; }
public boolean containsAll(Address ... members) { for(Address member: members) if(!contains(member)) return false; return true; }
protected static boolean same(final List<Digest> digests) { if(digests == null) return false; Digest first=digests.get(0); for(int i=1; i < digests.size(); i++) { Digest current=digests.get(i); if(!first.equals(current)) return false; } return true; }
protected static boolean writeAddresses(final View view, final Digest digest) { return digest == null || view == null || !Arrays.equals(view.getMembersRaw(),digest.getMembersRaw()); }
public void readFrom(DataInput in) throws Exception { byte flags=in.readByte(); // 1. view if((flags & VIEW_PRESENT) == VIEW_PRESENT) { view=new View(); view.readFrom(in); } // 2. digest if((flags & DIGEST_PRESENT) == DIGEST_PRESENT) { digest=new Digest(view.getMembersRaw()); digest.readFrom(in, false); } // 3. fail_reason if((flags & FAIL_REASON_PRESENT) == FAIL_REASON_PRESENT) fail_reason=in.readUTF(); }
protected boolean isJoinResponseValid(final JoinRsp rsp) { if(rsp.getFailReason() != null) throw new SecurityException(rsp.getFailReason()); Digest tmp_digest=rsp.getDigest(); if(tmp_digest == null || tmp_digest.capacity() == 0) { log.warn("%s: digest is empty: digest=%s", gms.local_addr, rsp.getDigest()); return false; } if(!tmp_digest.contains(gms.local_addr)) { log.error("%s: digest in JOIN_RSP does not contain myself; join response: %s", gms.local_addr, rsp); return false; } if(rsp.getView() == null) { log.error("%s: JoinRsp has a null view, skipping it", gms.local_addr); return false; } return true; }
public String toString(final Address[] order, boolean print_highest_received) { StringBuilder sb=new StringBuilder(); boolean first=true; if(capacity() == 0) return "[]"; int count=0, capacity=capacity(); for(Address key: order) { long[] tmp_seqnos=key != null? get(key) : null; if(key == null || tmp_seqnos == null) continue; if(!first) sb.append(", "); else first=false; sb.append(key).append(": ").append('[').append(tmp_seqnos[0]); if(print_highest_received) sb.append(" (").append(tmp_seqnos[1]).append(")"); sb.append("]"); if(Util.MAX_LIST_PRINT_SIZE > 0 && ++count >= Util.MAX_LIST_PRINT_SIZE) { if(capacity > count) sb.append(", ..."); break; } } return sb.toString(); }
/** Only used for testing */ public Digest(Digest digest) { if(digest == null) return; this.members=digest.members; // the members list is immutable this.seqnos=(digest instanceof MutableDigest || this instanceof MutableDigest)? Arrays.copyOf((digest).seqnos, digest.seqnos.length) : digest.seqnos; checkPostcondition(); }
/** * Returns true if all senders of the current digest have their seqnos >= the ones from other */ protected static boolean isGreaterThanOrEqual(Digest first, Digest other) { if(other == null) return true; for(Digest.Entry entry: first) { Address sender=entry.getMember(); long[] their_entry=other.get(sender); if(their_entry == null) continue; long my_highest=entry.getHighest(); long their_highest=Math.max(their_entry[0],their_entry[1]); if(my_highest < their_highest) return false; } return true; }
/** * Returns the highest delivered and received seqnos associated with a member. * @param member * @return An array of 2 elements: highest_delivered and highest_received seqnos */ public long[] get(Address member) { int index=find(member); if(index < 0) return null; return new long[]{seqnos[index * 2], seqnos[index * 2 +1]}; }