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; }
/** * Get the view and digest and send back both (MergeData) in the form of a MERGE_RSP to the sender. * If a merge is already in progress, send back a MergeData with the merge_rejected field set to true. */ public void handleMergeRequest(Address sender, ViewId merge_id) { Digest digest; View view; if(sender == null) { if(log.isErrorEnabled()) log.error("sender == null; cannot send back a response"); return; } if(merging) { if(log.isErrorEnabled()) log.error("merge already in progress"); sendMergeRejectedResponse(sender, merge_id); return; } merging=true; /* Clears the view handler queue and discards all JOIN/LEAVE/MERGE requests until after the MERGE */ gms.getViewHandler().suspend(merge_id); setMergeId(merge_id); if(log.isDebugEnabled()) log.debug("sender=" + sender + ", merge_id=" + merge_id); digest=gms.getDigest(); view=new View(gms.view_id.copy(), gms.members.getMembers()); sendMergeResponse(sender, view, digest); }
viewId = view.getViewId().copy(); Address[] oldMembers = members; members = ArrayUtils.copySortAndFilter(view.getMembersRaw());
else view=new_view; view_id=vid.copy();