public void run() { // 1. Generate merge_id final MergeId new_merge_id=MergeId.create(gms.local_addr); final Collection<Address> coordsCopy=new ArrayList<>(coords.keySet()); long start=System.currentTimeMillis(); try { _run(new_merge_id, coordsCopy); // might remove members from coordsCopy } catch(Throwable ex) { if(ex instanceof Error || ex instanceof RuntimeException) log.warn(gms.local_addr + ": merge is cancelled", ex); else log.warn("%s: merge is cancelled: %s", gms.local_addr, ex.getMessage()); sendMergeCancelledMessage(coordsCopy, new_merge_id); cancelMerge(new_merge_id); // the message above cancels the merge, too, but this is a 2nd line of defense } finally { /* 5. if flush is in stack stop the flush for entire cluster [JGRP-700] - FLUSH: flushing should span merge */ if(gms.flushProtocolInStack) gms.stopFlush(); thread=null; } long diff=System.currentTimeMillis() - start; log.debug("%s: merge %s took %d ms", gms.local_addr, new_merge_id, diff); }
MutableDigest new_digest=consolidateDigests(new_view, merge_rsps); if(new_digest == null || !new_digest.allSet()) return null;
success=getMergeDataFromSubgroupCoordinators(coords, new_merge_id, gms.merge_timeout); List<Address> missing=null; if(!success) { removeRejectedMergeRequests(coords.keySet()); if(merge_rsps.size() == 0) throw new Exception("did not get any merge responses from partition coordinators"); MergeData combined_merge_data=consolidateMergeData(merge_data, new ArrayList<>(subviews)); if(combined_merge_data == null) throw new Exception("could not consolidate merge");
MutableDigest new_digest=consolidateDigests(new_view, merge_rsps); if(new_digest == null || !new_digest.allSet()) return null;
success=getMergeDataFromSubgroupCoordinators(coords, new_merge_id, gms.merge_timeout); List<Address> missing=null; if(!success) { removeRejectedMergeRequests(coords.keySet()); if(merge_rsps.size() == 0) throw new Exception("did not get any merge responses from partition coordinators"); MergeData combined_merge_data=consolidateMergeData(merge_data, new ArrayList<>(subviews)); if(combined_merge_data == null) throw new Exception("could not consolidate merge");
/** * 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, keyed by sender */ public void merge(Map<Address, View> views) { if(views == null || views.isEmpty()) { log.warn("the views passed with the MERGE event were empty (or null); ignoring MERGE event"); return; } if(View.sameViews(views.values())) { log.debug("MERGE event is ignored because of identical views: %s", Util.printListWithDelimiter(views.values(), ", ")); return; } if(isMergeInProgress()) { log.trace("%s: merge is already running (merge_id=%s)", gms.local_addr, merge_id); return; } Address merge_leader=determineMergeLeader(views); if(merge_leader == null) return; if(merge_leader.equals(gms.local_addr)) { log.debug("%s: I will be the merge leader. Starting the merge task. Views: %s", gms.local_addr, views); merge_task.start(views); } else log.trace("%s: I'm not the merge leader, waiting for merge leader (%s) to start merge", gms.local_addr, merge_leader); }
public void run() { // 1. Generate merge_id final MergeId new_merge_id=MergeId.create(gms.local_addr); final Collection<Address> coordsCopy=new ArrayList<>(coords.keySet()); long start=System.currentTimeMillis(); try { _run(new_merge_id, coordsCopy); // might remove members from coordsCopy } catch(Throwable ex) { if(ex instanceof Error || ex instanceof RuntimeException) log.warn(gms.local_addr + ": merge is cancelled", ex); else log.warn("%s: merge is cancelled: %s", gms.local_addr, ex.getMessage()); sendMergeCancelledMessage(coordsCopy, new_merge_id); cancelMerge(new_merge_id); // the message above cancels the merge, too, but this is a 2nd line of defense } finally { /* 5. if flush is in stack stop the flush for entire cluster [JGRP-700] - FLUSH: flushing should span merge */ if(gms.flushProtocolInStack) gms.stopFlush(); thread=null; } long diff=System.currentTimeMillis() - start; log.debug("%s: merge %s took %d ms", gms.local_addr, new_merge_id, diff); }
public boolean isMergeTaskRunning() {return merge_task.isRunning();} public boolean isMergeKillerTaskRunning() {return merge_killer != null && !merge_killer.isDone();}
protected void stop() { merge_task.stop(); }
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)); } }
/** * 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, keyed by sender */ public void merge(Map<Address, View> views) { if(views == null || views.isEmpty()) { log.warn("the views passed with the MERGE event were empty (or null); ignoring MERGE event"); return; } if(View.sameViews(views.values())) { log.debug("MERGE event is ignored because of identical views: %s", Util.printListWithDelimiter(views.values(), ", ")); return; } if(isMergeInProgress()) { log.trace("%s: merge is already running (merge_id=%s)", gms.local_addr, merge_id); return; } Address merge_leader=determineMergeLeader(views); if(merge_leader == null) return; if(merge_leader.equals(gms.local_addr)) { log.debug("%s: I will be the merge leader. Starting the merge task. Views: %s", gms.local_addr, views); merge_task.start(views); } else log.trace("%s: I'm not the merge leader, waiting for merge leader (%s) to start merge", gms.local_addr, merge_leader); }
public boolean isMergeTaskRunning() {return merge_task.isRunning();} public boolean isMergeKillerTaskRunning() {return merge_killer != null && !merge_killer.isDone();}
protected void stop() { merge_task.stop(); }
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)); } }