if(log.isInfoEnabled()) log.info("sending stability msg " + printStabilityDigest(digest));
if(log.isDebugEnabled()) log.debug("sending stability msg " + printStabilityDigest(digest));
    void handleStableGossip(Address sender, Digest d) {        Address mbr;        long highest_seqno, my_highest_seqno;        long highest_seen_seqno, my_highest_seen_seqno;        if(d == null || sender == null) {            if(log.isErrorEnabled()) log.error("digest or sender is null");            return;        }        if(log.isInfoEnabled()) log.info("received digest " + printStabilityDigest(d) + " from " + sender);        if(!heard_from.contains(sender)) {  // already received gossip from sender; discard it            if(log.isInfoEnabled()) log.info("already received gossip from " + sender);            return;        }        for(int i=0; i < d.size(); i++) {            mbr=d.senderAt(i);            highest_seqno=d.highSeqnoAt(i);            highest_seen_seqno=d.highSeqnoSeenAt(i);            if(digest.getIndex(mbr) == -1) {                if(log.isInfoEnabled()) log.info("sender " + mbr + " not found in stability vector");                continue;            }            // compute the minimum of the highest seqnos deliverable (for garbage collection)            my_highest_seqno=digest.highSeqnoAt(mbr);            if(my_highest_seqno < 0) {                if(highest_seqno >= 0)                    digest.setHighSeqnoAt(mbr, highest_seqno);            }            else {                digest.setHighSeqnoAt(mbr, Math.min(my_highest_seqno, highest_seqno));            }            // compute the maximum of the highest seqnos seen (for retransmission of last missing message)            my_highest_seen_seqno=digest.highSeqnoSeenAt(mbr);            if(my_highest_seen_seqno < 0) {                if(highest_seen_seqno >= 0)                    digest.setHighSeqnoSeenAt(mbr, highest_seen_seqno);            }            else {                digest.setHighSeqnoSeenAt(mbr, Math.max(my_highest_seen_seqno, highest_seen_seqno));            }        }        heard_from.removeElement(sender);        if(heard_from.size() == 0) {            if(log.isInfoEnabled()) log.info("sending stability msg " + printStabilityDigest(digest));            sendStabilityMessage(digest.copy());            initialize();        }    }