public void handleMembershipChange(Collection<Request> requests) { Collection<Address> leaving_mbrs=new LinkedHashSet<>(requests.size()); requests.forEach(r -> { if(r.type == Request.SUSPECT) suspected_mbrs.add(r.mbr); else if(r.type == Request.LEAVE) leaving_mbrs.add(r.mbr); }); if(suspected_mbrs.isEmpty() && leaving_mbrs.isEmpty()) return; if(wouldIBeCoordinator(leaving_mbrs)) { log.debug("%s: members are %s, coord=%s: I'm the new coordinator", gms.local_addr, gms.members, gms.local_addr); gms.becomeCoordinator(); Collection<Request> leavingOrSuspectedMembers=new LinkedHashSet<>(); leaving_mbrs.forEach(mbr -> leavingOrSuspectedMembers.add(new Request(Request.LEAVE, mbr))); suspected_mbrs.forEach(mbr -> { leavingOrSuspectedMembers.add(new Request(Request.SUSPECT, mbr)); gms.ack_collector.suspect(mbr); }); suspected_mbrs.clear(); gms.getViewHandler().add(leavingOrSuspectedMembers); } }
/** The coordinator itself wants to leave the group */ public void leave(Address mbr) { if(mbr == null) { if(log.isErrorEnabled()) log.error(Util.getMessage("MemberSAddressIsNull")); return; } leaving=true; Address next_coord=gms.determineNextCoordinator(); if(next_coord != null) sendLeaveReqTo(next_coord); else { gms.getViewHandler().add(new Request(Request.LEAVE, mbr)); // If we're the coord leaving, ignore gms.leave_timeout: https://issues.jboss.org/browse/JGRP-1509 long timeout=(long)(Math.max(gms.leave_timeout, gms.view_ack_collection_timeout) * 1.10); gms.getViewHandler().waitUntilComplete(timeout); } gms.becomeClient(); }
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)); } }
public synchronized boolean setMergeId(MergeId expected, MergeId new_value) { boolean match=Util.match(this.merge_id, expected); if(match) { if(new_value != null && merge_id_history.contains(new_value)) return false; else merge_id_history.add(new_value); this.merge_id=new_value; if(this.merge_id != null) { // Clears the view handler queue and discards all JOIN/LEAVE/MERGE requests until after the MERGE gms.getViewHandler().suspend(); gms.getDownProtocol().down(new Event(Event.SUSPEND_STABLE, 20000)); startMergeKiller(); } } return match; }
/** The coordinator itself wants to leave the group */ public void leave(Address mbr) { if(mbr == null) { if(log.isErrorEnabled()) log.error("member's address is null !"); return; } if(mbr.equals(gms.local_addr)) leaving=true; gms.getViewHandler().add(new GMS.Request(GMS.Request.LEAVE, mbr, false, null)); gms.getViewHandler().stop(true); // wait until all requests have been processed, then close the queue and leave gms.getViewHandler().waitUntilCompleted(gms.leave_timeout); }
private void cancelMerge() { Object tmp=merge_id; if(merge_id != null && log.isDebugEnabled()) log.debug("cancelling merge (merge_id=" + merge_id + ')'); setMergeId(null); this.merge_leader=null; stopMergeTask(); merging=false; synchronized(merge_rsps) { merge_rsps.clear(); } gms.getViewHandler().resume(tmp); }
public void handleMembershipChange(Collection newMembers, Collection leavingMembers, Collection suspectedMembers) { if(suspectedMembers == null || suspectedMembers.isEmpty()) return; for(Iterator i=suspectedMembers.iterator(); i.hasNext();) { Address mbr=(Address)i.next(); if(!suspected_mbrs.contains(mbr)) suspected_mbrs.addElement(mbr); } if(log.isDebugEnabled()) log.debug("suspected members=" + suspectedMembers + ", suspected_mbrs=" + suspected_mbrs); if(wouldIBeCoordinator()) { if(log.isDebugEnabled()) log.debug("members are " + gms.members + ", coord=" + gms.local_addr + ": I'm the new coord !"); suspected_mbrs.removeAllElements(); gms.becomeCoordinator(); for(Iterator i=suspectedMembers.iterator(); i.hasNext();) { Address mbr=(Address)i.next(); gms.getViewHandler().add(new GMS.Request(GMS.Request.SUSPECT, mbr, true, null)); gms.ack_collector.suspect(mbr); } } }
public void handleMergeCancelled(ViewId merge_id) { if(merge_id != null && this.merge_id != null && this.merge_id.equals(merge_id)) { if(log.isDebugEnabled()) log.debug("merge was cancelled (merge_id=" + merge_id + ", local_addr=" + gms.local_addr +")"); setMergeId(null); this.merge_leader=null; merging=false; gms.getViewHandler().resume(merge_id); } }
gms.getViewHandler().suspend(merge_id);
public void handleMembershipChange(Collection<Request> requests) { Collection<Address> leaving_mbrs=new LinkedHashSet<>(requests.size()); requests.forEach(r -> { if(r.type == Request.SUSPECT) suspected_mbrs.add(r.mbr); else if(r.type == Request.LEAVE) leaving_mbrs.add(r.mbr); }); if(suspected_mbrs.isEmpty() && leaving_mbrs.isEmpty()) return; if(wouldIBeCoordinator(leaving_mbrs)) { log.debug("%s: members are %s, coord=%s: I'm the new coordinator", gms.local_addr, gms.members, gms.local_addr); gms.becomeCoordinator(); Collection<Request> leavingOrSuspectedMembers=new LinkedHashSet<>(); leaving_mbrs.forEach(mbr -> leavingOrSuspectedMembers.add(new Request(Request.LEAVE, mbr))); suspected_mbrs.forEach(mbr -> { leavingOrSuspectedMembers.add(new Request(Request.SUSPECT, mbr)); gms.ack_collector.suspect(mbr); }); suspected_mbrs.clear(); gms.getViewHandler().add(leavingOrSuspectedMembers); } }
/** * 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(MergeData data, ViewId merge_id) { if(merge_id == null || this.merge_id == null || !this.merge_id.equals(merge_id)) { if(log.isErrorEnabled()) log.error("merge_ids don't match (or are null); merge view discarded"); return; } java.util.List my_members=gms.view != null? gms.view.getMembers() : null; // only send to our *current* members, if we have A and B being merged (we are B), then we would *not* // receive a VIEW_ACK from A because A doesn't see us in the pre-merge view yet and discards the view GMS.Request req=new GMS.Request(GMS.Request.VIEW); req.view=data.view; req.digest=data.digest; req.target_members=my_members; gms.getViewHandler().add(req, true, // at head so it is processed next true); // un-suspend the queue merging=false; }
/** * 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); }
/** The coordinator itself wants to leave the group */ public void leave(Address mbr) { if(mbr == null) { if(log.isErrorEnabled()) log.error(Util.getMessage("MemberSAddressIsNull")); return; } leaving=true; Address next_coord=gms.determineNextCoordinator(); if(next_coord != null) sendLeaveReqTo(next_coord); else { gms.getViewHandler().add(new Request(Request.LEAVE, mbr)); // If we're the coord leaving, ignore gms.leave_timeout: https://issues.jboss.org/browse/JGRP-1509 long timeout=(long)(Math.max(gms.leave_timeout, gms.view_ack_collection_timeout) * 1.10); gms.getViewHandler().waitUntilComplete(timeout); } gms.becomeClient(); }
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)); } }
public synchronized boolean setMergeId(MergeId expected, MergeId new_value) { boolean match=Util.match(this.merge_id, expected); if(match) { if(new_value != null && merge_id_history.contains(new_value)) return false; else merge_id_history.add(new_value); this.merge_id=new_value; if(this.merge_id != null) { // Clears the view handler queue and discards all JOIN/LEAVE/MERGE requests until after the MERGE gms.getViewHandler().suspend(); gms.getDownProtocol().down(new Event(Event.SUSPEND_STABLE, 20000)); startMergeKiller(); } } return match; }