/** * 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); }
public MutableDigest set(Digest digest) { if(digest == null) return this; for(Entry entry: digest) set(entry.getMember(), entry.getHighestDeliveredSeqno(), entry.getHighestReceivedSeqno()); return this; }
/** Update my own digest from a digest received by somebody else. Returns whether the update was successful. * Needs to be called with a lock on digest */ @GuardedBy("lock") protected void updateLocalDigest(Digest d, Address sender) { StringBuilder sb=null; if(log.isTraceEnabled()) sb=new StringBuilder().append(local_addr).append(": handling digest from ").append(sender).append(":\nmine: ") .append(printDigest(digest)).append("\nother: ").append(printDigest(d)); for(Digest.Entry entry: d) { Address mbr=entry.getMember(); long hd=entry.getHighestDeliveredSeqno(), hr=entry.getHighestReceivedSeqno(); // compute the minimum of the highest seqnos deliverable (for garbage collection) long[] seqnos=digest.get(mbr); if(seqnos == null) continue; long my_hd=seqnos[0]; long my_hr=seqnos[1]; // (for retransmission of last missing message) if(my_hd == -1) // -1 means the seqno hasn't been set yet my_hd=hd; long new_hd=Math.min(my_hd, hd); long new_hr=Math.max(my_hr, hr); digest.set(mbr, new_hd, new_hr); } if(sb != null) // implies log.isTraceEnabled() == true log.trace(sb.append("\nresult: ").append(printDigest(digest)).append("\n")); }
/** 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) : null; }
gms.getDownProtocol().down(new Event(Event.SUSPEND_STABLE, MAX_SUSPEND_TIMEOUT)); MutableDigest join_digest=new MutableDigest(new_view.getMembersRaw()).set(gms.getDigest()); for(Address member: new_mbrs) join_digest.set(member,0,0); // ... and set the new members. their first seqno will be 1 if(join_digest.allSet() || join_digest.set(gms.getDigest()).allSet()) join_rsp=new JoinRsp(new_view, join_digest); else
.set((Digest)gms.getDownProtocol().down(new Event(Event.GET_DIGEST, gms.local_addr)));
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));
/** * 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); }
public MutableDigest set(Digest digest) { if(digest == null) return this; for(Entry entry: digest) set(entry.getMember(), entry.getHighestDeliveredSeqno(), entry.getHighestReceivedSeqno()); return this; }
/** Update my own digest from a digest received by somebody else. Returns whether the update was successful. * Needs to be called with a lock on digest */ @GuardedBy("lock") protected void updateLocalDigest(Digest d, Address sender) { StringBuilder sb=null; if(log.isTraceEnabled()) sb=new StringBuilder().append(local_addr).append(": handling digest from ").append(sender).append(":\nmine: ") .append(printDigest(digest)).append("\nother: ").append(printDigest(d)); for(Digest.Entry entry: d) { Address mbr=entry.getMember(); long hd=entry.getHighestDeliveredSeqno(), hr=entry.getHighestReceivedSeqno(); // compute the minimum of the highest seqnos deliverable (for garbage collection) long[] seqnos=digest.get(mbr); if(seqnos == null) continue; long my_hd=seqnos[0]; long my_hr=seqnos[1]; // (for retransmission of last missing message) if(my_hd == -1) // -1 means the seqno hasn't been set yet my_hd=hd; long new_hd=Math.min(my_hd, hd); long new_hr=Math.max(my_hr, hr); digest.set(mbr, new_hd, new_hr); } if(sb != null) // implies log.isTraceEnabled() == true log.trace(sb.append("\nresult: ").append(printDigest(digest)).append("\n")); }
/** 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) : null; }
gms.getDownProtocol().down(new Event(Event.SUSPEND_STABLE, MAX_SUSPEND_TIMEOUT)); MutableDigest join_digest=new MutableDigest(new_view.getMembersRaw()).set(gms.getDigest()); for(Address member: new_mbrs) join_digest.set(member,0,0); // ... and set the new members. their first seqno will be 1 if(join_digest.allSet() || join_digest.set(gms.getDigest()).allSet()) join_rsp=new JoinRsp(new_view, join_digest); else
.set((Digest)gms.getDownProtocol().down(new Event(Event.GET_DIGEST, gms.local_addr)));
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));