/** * Loop: determine coord. If coord is me --> handleLeave(). * Else send handleLeave() to coord until success */ public void leave(Address mbr) { Address coord=gms.determineCoordinator(); if(coord != null) sendLeaveReqTo(coord); gms.becomeClient(); }
protected void handleStateReq(Address requester) { if(spawner == null || !spawner.isRunning()) spawner=createAcceptor(); super.handleStateReq(requester); }
protected synchronized void cancelMerge(MergeId id) { if(setMergeId(id, null)) { merge_task.stop(); stopMergeKiller(); merge_rsps.reset(); gms.getViewHandler().resume(); gms.getDownProtocol().down(new Event(Event.RESUME_STABLE)); } }
/** * Fetches the digests from all members and installs them again. Used only for diagnosis and support; don't * use this otherwise ! */ protected void fixDigests() { Digest digest=fetchDigestsFromAllMembersInSubPartition(gms.view, null); Message msg=new Message().putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.INSTALL_DIGEST)) .setBuffer(GMS.marshal(null, digest)); gms.getDownProtocol().down(msg); }
protected void sendJoinRejectionMessage(Address dest, String error_msg) { if (dest == null) return; JoinRsp joinRes = new JoinRsp(error_msg); // specify the error message on the JoinRsp Message msg = new Message(dest).putHeader(GMS_ID, new GmsHeader(GmsHeader.JOIN_RSP)).setBuffer( GMS.marshal(joinRes)); down_prot.down(msg); }
public void init() throws Exception { super.init(); merger.cancelMerge(null); }
protected void createStreamToRequester(Address requester) { OutputStream bos=new StateOutputStream(requester); getStateFromApplication(requester, bos, false); }
final void initState() { becomeClient(); view=null; first_view_sent=false; }
protected GmsImpl(GMS gms) { this.gms=gms; merger=gms.merger; log=gms.getLog(); }
/** * Invoked upon receiving a MERGE event from the MERGE layer. Starts the merge protocol. * See description of protocol in DESIGN. * @param views A List of <em>different</em> views detected by the merge protocol */ public void merge(Map<Address, View> views) { merger.merge(views); }
protected static boolean isJoinOrInstallViewMessage(GMS.GmsHeader hdr) { if(hdr == null) return false; switch(hdr.getType()) { case GMS.GmsHeader.JOIN_RSP: case GMS.GmsHeader.INSTALL_MERGE_VIEW: return true; } return false; }
/** * 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) { merger.handleMergeView(data, merge_id); }
/** * 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. * @param sender The address of the merge leader * @param merge_id The merge ID * @param mbrs The set of members from which we expect responses */ public void handleMergeRequest(Address sender, MergeId merge_id, Collection<? extends Address> mbrs) { merger.handleMergeRequest(sender, merge_id, mbrs); }
public NakAckHeader2 copy() { NakAckHeader2 ret=new NakAckHeader2(); ret.type=type; ret.seqno=seqno; ret.sender=sender; return ret; }
/** * Fetches the digests from all members and installs them again. Used only for diagnosis and support; don't * use this otherwise ! */ void fixDigests() { merger.fixDigests(); }
/** * Creates a retransmit buffer for each sender in the digest according to the sender's seqno. * If a buffer already exists, it resets it. */ protected void setDigest(Digest digest) { setDigest(digest,false); }