/** Removed rejected merge requests from merge_rsps and coords. This method has a lock on merge_rsps */ protected void removeRejectedMergeRequests(Collection<Address> coords) { int num_removed=0; for(Iterator<Map.Entry<Address,MergeData>> it=merge_rsps.getResults().entrySet().iterator(); it.hasNext();) { Map.Entry<Address,MergeData> entry=it.next(); MergeData data=entry.getValue(); if(data.merge_rejected) { if(data.getSender() != null) coords.remove(data.getSender()); it.remove(); num_removed++; } } if(num_removed > 0) log.trace("%s: removed %d rejected merge responses", gms.local_addr, num_removed); }
if(tuple == null) return null; MergeData merge_data=new MergeData(msg.getSrc(), tuple.getVal1(), tuple.getVal2(), hdr.merge_rejected); log.trace("%s: got merge response from %s, merge_id=%s, merge data is %s", local_addr, msg.getSrc(), hdr.merge_id, merge_data); if(tuple == null) return null; impl.handleMergeView(new MergeData(msg.getSrc(), tuple.getVal1(), tuple.getVal2()), hdr.merge_id); break;
/** * Merge all digests into one. For each sender, the new value is max(highest_delivered), * max(highest_received). This method has a lock on merge_rsps */ protected MutableDigest consolidateDigests(final View new_view, final List<MergeData> merge_rsps) { MutableDigest retval=new MutableDigest(new_view.getMembersRaw()); for(MergeData data: merge_rsps) { Digest tmp_digest=data.getDigest(); if(tmp_digest != null) retval.merge(tmp_digest); } return retval; } }
private MergeData getMergeResponse(Address sender, ViewId merge_id) { Digest digest; View view; MergeData retval; if(sender == null) { if(log.isErrorEnabled()) log.error("sender == null; cannot send back a response"); return null; } if(merging) { if(log.isErrorEnabled()) log.error("merge already in progress"); retval=new MergeData(sender, null, null); retval.merge_rejected=true; return retval; } merging=true; setMergeId(merge_id); if(log.isDebugEnabled()) log.debug("sender=" + sender + ", merge_id=" + merge_id); try { digest=gms.getDigest(); view=new View(gms.view_id.copy(), gms.members.getMembers()); retval=new MergeData(sender, view, digest); retval.view=view; retval.digest=digest; } catch(NullPointerException null_ex) { return null; } return retval; }
/** * Merge all digests into one. For each sender, the new value is min(low_seqno), max(high_seqno), * max(high_seqno_seen) */ private Digest consolidateDigests(Vector<MergeData> merge_rsps, int num_mbrs) { MergeData data; Digest tmp_digest; MutableDigest retval=new MutableDigest(num_mbrs); for(int i=0; i < merge_rsps.size(); i++) { data=merge_rsps.elementAt(i); tmp_digest=data.getDigest(); if(tmp_digest == null) { if(log.isErrorEnabled()) log.error("tmp_digest == null; skipping"); continue; } retval.merge(tmp_digest); } return retval.copy(); }
public void handleMergeResponse(MergeData data, MergeId merge_id) { if(!matchMergeId(merge_id)) { log.trace("%s: this.merge_id (%s) is different from merge_id %s sent by %s as merge response, discarding it", gms.local_addr, this.merge_id, merge_id, data.getSender()); return; } merge_rsps.add(data.getSender(), data); }
MergeData merge_data=new MergeData(msg.getSrc(), hdr.view, hdr.my_digest); merge_data.merge_rejected=hdr.merge_rejected; impl.handleMergeResponse(merge_data, hdr.merge_id); impl.handleMergeView(new MergeData(msg.getSrc(), hdr.view, hdr.my_digest), hdr.merge_id); down_prot.down(new Event(Event.RESUME_STABLE)); break;
/** * Merge all digests into one. For each sender, the new value is max(highest_delivered), * max(highest_received). This method has a lock on merge_rsps */ protected MutableDigest consolidateDigests(final View new_view, final List<MergeData> merge_rsps) { MutableDigest retval=new MutableDigest(new_view.getMembersRaw()); for(MergeData data: merge_rsps) { Digest tmp_digest=data.getDigest(); if(tmp_digest != null) retval.merge(tmp_digest); } return retval; } }
/** * If merge_id is not equal to this.merge_id then discard. Else cast the view/digest to all members of this group. */ public void handleMergeView(final MergeData data, final MergeId merge_id) { if(!matchMergeId(merge_id)) { log.trace("%s: merge_ids (mine: %s, received: %s) don't match; merge view %s is discarded", gms.local_addr, this.merge_id, merge_id, data.view.getViewId()); return; } // only send to our *current* members, if we have A and B being merged (we are B), then we would *not* // want to block on a VIEW_ACK from A because A doesn't see us in the pre-merge view yet and discards the view List<Address> expected_acks=gms.members.getMembers(); try { gms.castViewChangeAndSendJoinRsps(data.view, data.digest, expected_acks, null, null); // if we have flush in stack send ack back to merge coordinator if(gms.flushProtocolInStack) { //[JGRP-700] - FLUSH: flushing should span merge Message ack=new Message(data.getSender()).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.INSTALL_MERGE_VIEW_OK)); gms.getDownProtocol().down(ack); } } finally { cancelMerge(merge_id); } }
if(tuple == null) return null; MergeData merge_data=new MergeData(msg.getSrc(), tuple.getVal1(), tuple.getVal2(), hdr.merge_rejected); log.trace("%s: got merge response from %s, merge_id=%s, merge data is %s", local_addr, msg.getSrc(), hdr.merge_id, merge_data); if(tuple == null) return null; impl.handleMergeView(new MergeData(msg.getSrc(), tuple.getVal1(), tuple.getVal2()), hdr.merge_id); break;
/** Removed rejected merge requests from merge_rsps and coords */ private void removeRejectedMergeRequests(Vector coords) { MergeData data; for(Iterator it=merge_rsps.iterator(); it.hasNext();) { data=(MergeData)it.next(); if(data.merge_rejected) { if(data.getSender() != null && coords != null) coords.removeElement(data.getSender()); it.remove(); if(log.isDebugEnabled()) log.debug("removed element " + data); } } }
/** Removed rejected merge requests from merge_rsps and coords. This method has a lock on merge_rsps */ protected void removeRejectedMergeRequests(Collection<Address> coords) { int num_removed=0; for(Iterator<Map.Entry<Address,MergeData>> it=merge_rsps.getResults().entrySet().iterator(); it.hasNext();) { Map.Entry<Address,MergeData> entry=it.next(); MergeData data=entry.getValue(); if(data.merge_rejected) { if(data.getSender() != null) coords.remove(data.getSender()); it.remove(); num_removed++; } } if(num_removed > 0) log.trace("%s: removed %d rejected merge responses", gms.local_addr, num_removed); }
public void handleMergeResponse(MergeData data, MergeId merge_id) { if(!matchMergeId(merge_id)) { log.trace("%s: this.merge_id (%s) is different from merge_id %s sent by %s as merge response, discarding it", gms.local_addr, this.merge_id, merge_id, data.getSender()); return; } merge_rsps.add(data.getSender(), data); }
+ this.merge_id + ") is null (sender=" + data.getSender() + ")."); return;
/** * If merge_id is not equal to this.merge_id then discard. Else cast the view/digest to all members of this group. */ public void handleMergeView(final MergeData data, final MergeId merge_id) { if(!matchMergeId(merge_id)) { log.trace("%s: merge_ids (mine: %s, received: %s) don't match; merge view %s is discarded", gms.local_addr, this.merge_id, merge_id, data.view.getViewId()); return; } // only send to our *current* members, if we have A and B being merged (we are B), then we would *not* // want to block on a VIEW_ACK from A because A doesn't see us in the pre-merge view yet and discards the view List<Address> expected_acks=gms.members.getMembers(); try { gms.castViewChangeAndSendJoinRsps(data.view, data.digest, expected_acks, null, null); // if we have flush in stack send ack back to merge coordinator if(gms.flushProtocolInStack) { //[JGRP-700] - FLUSH: flushing should span merge Message ack=new Message(data.getSender()).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.INSTALL_MERGE_VIEW_OK)); gms.getDownProtocol().down(ack); } } finally { cancelMerge(merge_id); } }