public void run() { if(suspended) { if(log.isTraceEnabled()) log.trace("stable task will not run as suspended=" + suspended); return; } // asks the NAKACK protocol for the current digest Digest my_digest=getDigest(); if(my_digest == null) { if(log.isWarnEnabled()) log.warn("received null digest, skipped sending of stable message"); return; } if(log.isTraceEnabled()) log.trace("setting latest_local_digest from NAKACK: " + my_digest.printHighestDeliveredSeqnos()); sendStableMessage(my_digest); }
/** Schedules a stability message to be mcast after a random number of milliseconds (range 1-5 secs). The reason for waiting a random amount of time is that, in the worst case, all members receive a STABLE_GOSSIP message from the last outstanding member at the same time and would therefore mcast the STABILITY message at the same time too. To avoid this, each member waits random N msecs. If, before N elapses, some other member sent the STABILITY message, we just cancel our own message. If, during waiting for N msecs to send STABILITY message S1, another STABILITY message S2 is to be sent, we just discard S2. @param tmp A copy of te stability digest, so we don't need to copy it again */ private void sendStabilityMessage(Digest tmp) { long delay; if(suspended) { if(log.isTraceEnabled()) log.trace("STABILITY message will not be sent as I'm suspended"); return; } // give other members a chance to mcast STABILITY message. if we receive STABILITY by the end of // our random sleep, we will not send the STABILITY msg. this prevents that all mbrs mcast a // STABILITY msg at the same time delay=Util.random(stability_delay); if(log.isTraceEnabled()) log.trace("sending stability msg (in " + delay + " ms) " + tmp.printHighestDeliveredSeqnos() + " (copy=" + tmp.hashCode() + ")"); startStabilityTask(tmp, delay); }
log.trace("setting latest_local_digest from NAKACK: " + my_digest.printHighestDeliveredSeqnos()); sendStableMessage(my_digest);
log.trace(new StringBuffer("received stability msg from ").append(sender).append(": ").append(stable_digest.printHighestDeliveredSeqnos())); stopStabilityTask();
public void run() { Message msg; StableHeader hdr; if(suspended) { if(log.isDebugEnabled()) { log.debug("STABILITY message will not be sent as suspended=" + suspended); } return; } if(stability_digest != null) { msg=new Message(); msg.setFlag(Message.OOB); hdr=new StableHeader(StableHeader.STABILITY, stability_digest); msg.putHeader(STABLE.name, hdr); if(log.isTraceEnabled()) log.trace("sending stability msg " + stability_digest.printHighestDeliveredSeqnos() + " (copy=" + stability_digest.hashCode() + ")"); num_stability_msgs_sent++; down_prot.down(new Event(Event.MSG, msg)); } } }
sb=new StringBuilder("[").append(local_addr).append("] handling digest from ").append(sender).append(" ("). append(votes.size()).append(" votes):\nmine: ").append(digest.printHighestDeliveredSeqnos()) .append("\nother: ").append(d.printHighestDeliveredSeqnos());
/** * Bcasts a STABLE message of the current digest to all members. Message contains highest seqnos of all members * seen by this member. Highest seqnos are retrieved from the NAKACK layer below. * @param d A <em>copy</em> of this.digest */ private void sendStableMessage(Digest d) { if(suspended) { if(log.isTraceEnabled()) log.trace("will not send STABLE message as I'm suspended"); return; } if(d != null && d.size() > 0) { if(log.isTraceEnabled()) log.trace("sending stable msg " + d.printHighestDeliveredSeqnos()); num_stable_msgs_sent++; final Message msg=new Message(); // mcast message msg.setFlag(Message.OOB); StableHeader hdr=new StableHeader(StableHeader.STABLE_GOSSIP, d); msg.putHeader(name, hdr); Runnable r=new Runnable() { public void run() { down_prot.down(new Event(Event.MSG, msg)); } }; // Run in a separate thread so we don't potentially block (http://jira.jboss.com/jira/browse/JGRP-532) timer.execute(r); // down_prot.down(new Event(Event.MSG, msg)); } }