/** Returns the current view and digest. Try to find a matching digest twice (if not found on the first try) */ public Tuple<View,Digest> getViewAndDigest() { MutableDigest digest=new MutableDigest(view.getMembersRaw()).set(getDigest()); return digest.allSet() || digest.set(getDigest()).allSet()? new Tuple<View,Digest>(view, digest) : null; }
/** Returns an array of members whose seqno is not set. Returns an empty array if all are set. */ public Address[] getNonSetMembers() { Address[] retval=new Address[countNonSetMembers()]; if(retval.length == 0) return retval; int index=0; for(int i=0; i < members.length; i++) if(seqnos[i*2] == -1) retval[index++]=members[i]; return retval; }
public MutableDigest(Address[] members) { super(members, createEmptyArray(members.length *2)); }
/** * Similar to set(), but if the sender already exists, its seqnos will be modified (no new entry) as follows: * <ol> * <li>this.highest_delivered_seqno=max(this.highest_delivered_seqno, highest_delivered_seqno) * <li>this.highest_received_seqno=max(this.highest_received_seqno, highest_received_seqno) * </ol> */ public MutableDigest merge(final Address member, final long highest_delivered_seqno, final long highest_received_seqno) { if(member == null) return this; long[] entry=get(member); long hd=entry == null? highest_delivered_seqno : Math.max(entry[0],highest_delivered_seqno); long hr=entry == null? highest_received_seqno : Math.max(entry[1],highest_received_seqno); return set(member, hd, hr); }
/** Returns a digest which contains, for all members of view, the highest delivered and received * seqno of all digests */ protected static Digest maxSeqnos(final View view, List<Digest> digests) { if(view == null || digests == null) return null; MutableDigest digest=new MutableDigest(view.getMembersRaw()); for(Digest dig: digests) digest.merge(dig); return digest; }
final MutableDigest d=new MutableDigest(current_view.getMembersRaw()).set(getDigest()); Address dest=send_stable_msgs_to_coord_only? coordinator : null; if(d.allSet() || d.set(getDigest()).allSet()) // try once more if the first digest didn't match log.trace("%s: sending stable msg to %s: %s", local_addr, (send_stable_msgs_to_coord_only? coordinator : "cluster"), printDigest(d)); else { log.trace("%s: could not find matching digest for view %s, missing members: %s", local_addr, current_view, d.getNonSetMembers()); return;
return new MutableDigest(view.getMembersRaw()) .set((Digest)gms.getDownProtocol().down(new Event(Event.GET_DIGEST, gms.local_addr))); MutableDigest retval=new MutableDigest(tmp); Map<Address,Digest> responses=new HashMap<>(digest_collector.getResults()); for(Digest dig: responses.values()) retval.set(dig); return retval;
public MutableDigest set(Digest digest) { if(digest == null) return this; for(Entry entry: digest) set(entry.getMember(), entry.getHighestDeliveredSeqno(), entry.getHighestReceivedSeqno()); return this; }
@GuardedBy("lock") protected void resetDigest() { if(view == null) return; digest=new MutableDigest(view.getMembersRaw()); // .set(getDigest()); log.trace("%s: reset digest to %s", local_addr, printDigest(digest)); votes=new FixedSizeBitSet(view.size()); // all 0's initially }
public MutableDigest set(Address member, long highest_delivered_seqno, long highest_received_seqno) { if(member == null) return this; int index=find(member); if(index >= 0) { seqnos[index * 2]=highest_delivered_seqno; seqnos[index * 2 +1]=highest_received_seqno; } return this; }
/** * Adds a digest to this digest. For each sender in the other digest, the merge() method will be called. */ public MutableDigest merge(Digest digest) { if(digest == null) return this; for(Entry entry: digest) merge(entry.getMember(), entry.getHighestDeliveredSeqno(), entry.getHighestReceivedSeqno()); return this; }
if(new_digest == null || !new_digest.allSet()) return null;
final MutableDigest d=new MutableDigest(current_view.getMembersRaw()).set(getDigest()); Address dest=send_stable_msgs_to_coord_only? coordinator : null; if(d.allSet() || d.set(getDigest()).allSet()) // try once more if the first digest didn't match log.trace("%s: sending stable msg to %s: %s", local_addr, (send_stable_msgs_to_coord_only? coordinator : "cluster"), printDigest(d)); else { log.trace("%s: could not find matching digest for view %s, missing members: %s", local_addr, current_view, d.getNonSetMembers()); return;
/** Returns a digest which contains, for all members of view, the highest delivered and received * seqno of all digests */ protected static Digest maxSeqnos(final View view, List<Digest> digests) { if(view == null || digests == null) return null; MutableDigest digest=new MutableDigest(view.getMembersRaw()); for(Digest dig: digests) digest.merge(dig); return digest; }
/** * Similar to set(), but if the sender already exists, its seqnos will be modified (no new entry) as follows: * <ol> * <li>this.highest_delivered_seqno=max(this.highest_delivered_seqno, highest_delivered_seqno) * <li>this.highest_received_seqno=max(this.highest_received_seqno, highest_received_seqno) * </ol> */ public MutableDigest merge(final Address member, final long highest_delivered_seqno, final long highest_received_seqno) { if(member == null) return this; long[] entry=get(member); long hd=entry == null? highest_delivered_seqno : Math.max(entry[0],highest_delivered_seqno); long hr=entry == null? highest_received_seqno : Math.max(entry[1],highest_received_seqno); return set(member, hd, hr); }
return new MutableDigest(view.getMembersRaw()) .set((Digest)gms.getDownProtocol().down(new Event(Event.GET_DIGEST, gms.local_addr))); MutableDigest retval=new MutableDigest(tmp); Map<Address,Digest> responses=new HashMap<>(digest_collector.getResults()); for(Digest dig: responses.values()) retval.set(dig); return retval;
public MutableDigest set(Digest digest) { if(digest == null) return this; for(Entry entry: digest) set(entry.getMember(), entry.getHighestDeliveredSeqno(), entry.getHighestReceivedSeqno()); return this; }
@GuardedBy("lock") protected void resetDigest() { if(view == null) return; digest=new MutableDigest(view.getMembersRaw()); // .set(getDigest()); log.trace("%s: reset digest to %s", local_addr, printDigest(digest)); votes=new FixedSizeBitSet(view.size()); // all 0's initially }
public MutableDigest set(Address member, long highest_delivered_seqno, long highest_received_seqno) { if(member == null) return this; int index=find(member); if(index >= 0) { seqnos[index * 2]=highest_delivered_seqno; seqnos[index * 2 +1]=highest_received_seqno; } return this; }
/** * Adds a digest to this digest. For each sender in the other digest, the merge() method will be called. */ public MutableDigest merge(Digest digest) { if(digest == null) return this; for(Entry entry: digest) merge(entry.getMember(), entry.getHighestDeliveredSeqno(), entry.getHighestReceivedSeqno()); return this; }