IGNITE-5552: ServiceProcessor recalculates all service assignments even if 
there is a pending topology change. This closes #2182.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1cf402f3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1cf402f3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1cf402f3

Branch: refs/heads/ignite-2.1
Commit: 1cf402f379516b01ef7317a50c820bf0dec25d81
Parents: c396b0b
Author: Andrey V. Mashenkov <[email protected]>
Authored: Wed Jun 21 19:30:27 2017 +0300
Committer: Andrey V. Mashenkov <[email protected]>
Committed: Thu Jul 6 14:26:31 2017 +0300

----------------------------------------------------------------------
 .../processors/service/GridServiceProcessor.java  | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/1cf402f3/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
index 87db72a..d67f2d1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
@@ -1530,6 +1530,9 @@ public class GridServiceProcessor extends 
GridProcessorAdapter implements Ignite
      * Topology listener.
      */
     private class TopologyListener implements DiscoveryEventListener {
+        /** */
+        private volatile AffinityTopologyVersion currTopVer = null;
+
         /** {@inheritDoc} */
         @Override public void onEvent(DiscoveryEvent evt, final DiscoCache 
discoCache) {
             GridSpinBusyLock busyLock = GridServiceProcessor.this.busyLock;
@@ -1562,6 +1565,8 @@ public class GridServiceProcessor extends 
GridProcessorAdapter implements Ignite
                 else
                     topVer = new 
AffinityTopologyVersion((evt).topologyVersion(), 0);
 
+                currTopVer = topVer;
+
                 depExe.execute(new DepRunnable() {
                     @Override public void run0() {
                         // In case the cache instance isn't tracked by 
DiscoveryManager anymore.
@@ -1582,6 +1587,19 @@ public class GridServiceProcessor extends 
GridProcessorAdapter implements Ignite
                                 boolean firstTime = true;
 
                                 while (it.hasNext()) {
+                                    // If topology changed again, let next 
event handle it.
+                                    AffinityTopologyVersion currTopVer0 = 
currTopVer;
+
+                                    if (currTopVer0 != topVer) {
+                                        if (log.isInfoEnabled())
+                                            log.info("Service processor 
detected a topology change during " +
+                                                "assignments calculation (will 
abort current iteration and " +
+                                                "re-calculate on the newer 
version): " +
+                                                "[topVer=" + topVer + ", 
newTopVer=" + currTopVer + ']');
+
+                                        return;
+                                    }
+
                                     Cache.Entry<Object, Object> e = it.next();
 
                                     if (firstTime) {

Reply via email to