Repository: ignite
Updated Branches:
  refs/heads/master 567a8750e -> 1d10e6ad4


IGNITE-9178 Partition lost event are not triggered if multiple nodes left 
cluster - Fixes #4495.

Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com>


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

Branch: refs/heads/master
Commit: 1d10e6ad47bd56a652274f7f2b3f733679c5ab79
Parents: 567a875
Author: pvinokurov <vinokurov.pa...@gmail.com>
Authored: Fri Aug 10 18:54:29 2018 +0300
Committer: Alexey Goncharuk <alexey.goncha...@gmail.com>
Committed: Fri Aug 10 18:54:29 2018 +0300

----------------------------------------------------------------------
 .../dht/GridDhtPartitionTopologyImpl.java       |  2 +
 .../IgniteCachePartitionLossPolicySelfTest.java | 46 ++++++++++++++++----
 2 files changed, 39 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/1d10e6ad/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index c5c574f..8fde345 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -1429,6 +1429,8 @@ public class GridDhtPartitionTopologyImpl implements 
GridDhtPartitionTopology {
                                 log.debug("Removing left node from full map 
update [grp=" + grp.cacheOrGroupName() +
                                     ", nodeId=" + nodeId + ", partMap=" + 
partMap + ']');
 
+                            leftNode2Part.put(nodeId, partMap.get(nodeId));
+
                             it.remove();
                         }
                     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1d10e6ad/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
index 7cefc67..8f7d122 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
@@ -22,6 +22,8 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -78,7 +80,7 @@ public class IgniteCachePartitionLossPolicySelfTest extends 
GridCommonAbstractTe
     private final AtomicBoolean delayPartExchange = new AtomicBoolean(false);
 
     /** */
-    private final TopologyChanger killSingleNode = new TopologyChanger(false, 
Arrays.asList(3), Arrays.asList(0, 1, 2, 4));
+    private final TopologyChanger killSingleNode = new TopologyChanger(false, 
Arrays.asList(3), Arrays.asList(0, 1, 2, 4),0);
 
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
@@ -167,7 +169,16 @@ public class IgniteCachePartitionLossPolicySelfTest 
extends GridCommonAbstractTe
     public void testReadWriteSafeAfterKillTwoNodes() throws Exception {
         partLossPlc = PartitionLossPolicy.READ_WRITE_SAFE;
 
-        checkLostPartition(true, true, new TopologyChanger(false, 
Arrays.asList(3, 2), Arrays.asList(0, 1, 4)));
+        checkLostPartition(true, true, new TopologyChanger(false, 
Arrays.asList(3, 2), Arrays.asList(0, 1, 4), 0));
+    }
+
+    /**
+     * @throws Exception if failed.
+     */
+    public void testReadWriteSafeAfterKillTwoNodesWithDelay() throws Exception 
{
+        partLossPlc = PartitionLossPolicy.READ_WRITE_SAFE;
+
+        checkLostPartition(true, true, new TopologyChanger(false, 
Arrays.asList(3, 2), Arrays.asList(0, 1, 4), 20));
     }
 
     /**
@@ -178,7 +189,7 @@ public class IgniteCachePartitionLossPolicySelfTest extends 
GridCommonAbstractTe
 
         backups = 1;
 
-        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 2, 1), Arrays.asList(0, 4)));
+        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 2, 1), Arrays.asList(0, 4), 0));
     }
 
     /**
@@ -187,7 +198,7 @@ public class IgniteCachePartitionLossPolicySelfTest extends 
GridCommonAbstractTe
     public void testReadWriteSafeAfterKillCrd() throws Exception {
         partLossPlc = PartitionLossPolicy.READ_WRITE_SAFE;
 
-        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 0), Arrays.asList(1, 2, 4)));
+        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 0), Arrays.asList(1, 2, 4), 0));
     }
 
     /**
@@ -198,7 +209,7 @@ public class IgniteCachePartitionLossPolicySelfTest extends 
GridCommonAbstractTe
 
         backups = 1;
 
-        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 2), Arrays.asList(0, 1, 4)));
+        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 2), Arrays.asList(0, 1, 4), 0));
     }
 
     /**
@@ -209,7 +220,7 @@ public class IgniteCachePartitionLossPolicySelfTest extends 
GridCommonAbstractTe
 
         backups = 1;
 
-        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 0), Arrays.asList(1, 2, 4)));
+        checkLostPartition(true, true, new TopologyChanger(true, 
Arrays.asList(3, 0), Arrays.asList(1, 2, 4), 0));
     }
 
     /**
@@ -408,15 +419,21 @@ public class IgniteCachePartitionLossPolicySelfTest 
extends GridCommonAbstractTe
         /** List of nodes to be alive */
         private List<Integer> aliveNodes;
 
+        /** Delay between node stops */
+        private long stopDelay;
+
         /**
          * @param delayExchange Flag for delay partition exchange.
          * @param killNodes List of nodes to kill.
          * @param aliveNodes List of nodes to be alive.
+         * @param stopDelay Delay between stopping nodes.
          */
-        public TopologyChanger(boolean delayExchange, List<Integer> killNodes, 
List<Integer> aliveNodes) {
+        public TopologyChanger(boolean delayExchange, List<Integer> killNodes, 
List<Integer> aliveNodes,
+            long stopDelay) {
             this.delayExchange = delayExchange;
             this.killNodes = killNodes;
             this.aliveNodes = aliveNodes;
+            this.stopDelay = stopDelay;
         }
 
         /**
@@ -471,8 +488,19 @@ public class IgniteCachePartitionLossPolicySelfTest 
extends GridCommonAbstractTe
             if (delayExchange)
                 delayPartExchange.set(true);
 
-            for (Integer node : killNodes)
-                grid(node).close();
+            ExecutorService executor = 
Executors.newFixedThreadPool(killNodes.size());
+
+            for (Integer node : killNodes) {
+                executor.submit(new Runnable() {
+                    @Override public void run() {
+                        grid(node).close();
+                    }
+                });
+
+                Thread.sleep(stopDelay);
+            }
+
+            executor.shutdown();
 
             delayPartExchange.set(false);
 

Reply via email to