You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/11/08 08:21:48 UTC

ignite git commit: Added new test: IgniteCachePartitionedBackupNodeFailureRecoveryTest.

Repository: ignite
Updated Branches:
  refs/heads/master 45bb1ac95 -> e031498d8


Added new test: IgniteCachePartitionedBackupNodeFailureRecoveryTest.


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

Branch: refs/heads/master
Commit: e031498d872a5f1552b26a859b9ee79d3568ff9b
Parents: 45bb1ac
Author: sboikov <sb...@gridgain.com>
Authored: Tue Nov 8 11:21:37 2016 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Nov 8 11:21:37 2016 +0300

----------------------------------------------------------------------
 ...artitionedBackupNodeFailureRecoveryTest.java | 193 +++++++++++++++++++
 .../testsuites/IgniteCacheTestSuite2.java       |   2 +
 2 files changed, 195 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e031498d/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
new file mode 100644
index 0000000..6654fd9
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
@@ -0,0 +1,193 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package org.apache.ignite.internal.processors.cache.distributed.dht;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
+import javax.cache.processor.EntryProcessor;
+import javax.cache.processor.MutableEntry;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicWriteOrderMode;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.cache.IgniteCacheAbstractTest;
+
+import static org.apache.ignite.cache.CacheAtomicWriteOrderMode.PRIMARY;
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheRebalanceMode.SYNC;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC;
+import static org.apache.ignite.testframework.GridTestUtils.runAsync;
+
+/**
+ */
+public class IgniteCachePartitionedBackupNodeFailureRecoveryTest extends IgniteCacheAbstractTest {
+    /** {@inheritDoc}*/
+    @Override protected int gridCount() {
+        return 3;
+    }
+
+    /** {@inheritDoc}*/
+    @Override protected CacheMode cacheMode() {
+        return PARTITIONED;
+    }
+
+    /** {@inheritDoc}*/
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return ATOMIC;
+    }
+
+    /** {@inheritDoc}*/
+    @Override protected CacheAtomicWriteOrderMode atomicWriteOrderMode() {
+        return PRIMARY;
+    }
+
+    /** {@inheritDoc}*/
+    @Override protected NearCacheConfiguration nearConfiguration() {
+        return new NearCacheConfiguration();
+    }
+
+    /** {@inheritDoc}*/
+    @Override protected CacheConfiguration cacheConfiguration(String gridName) throws Exception {
+        CacheConfiguration ccfg = super.cacheConfiguration(gridName);
+
+        ccfg.setBackups(1);
+        ccfg.setWriteSynchronizationMode(PRIMARY_SYNC);
+        ccfg.setRebalanceMode(SYNC);
+
+        return ccfg;
+    }
+
+    /**
+     * Test stops and restarts backup node.
+     *
+     * @throws Exception If failed.
+     */
+    public void testBackUpFail() throws Exception {
+        final IgniteEx node1 = grid(0);
+        final IgniteEx node2 = grid(1);
+        final IgniteEx node3 = grid(2);
+
+        awaitPartitionMapExchange();
+
+        final IgniteCache<Integer, Integer> cache1 = node1.cache(null);
+
+        Affinity<Integer> aff = node1.affinity(null);
+
+        Integer key0 = null;
+
+        for (int key = 0; key < 10_000; key++) {
+            if (aff.isPrimary(node2.cluster().localNode(), key) && aff.isBackup(node3.cluster().localNode(), key)) {
+                key0 = key;
+
+                break;
+            }
+        }
+
+        assertNotNull(key0);
+
+        cache1.put(key0, 0);
+
+        final AtomicBoolean finished = new AtomicBoolean();
+
+        final ReentrantLock lock = new ReentrantLock();
+
+        final AtomicInteger cntr = new AtomicInteger();
+
+        final Integer finalKey = key0;
+
+        IgniteInternalFuture<Void> primaryFut;
+        IgniteInternalFuture<Void> backupFut;
+
+        try {
+            primaryFut = runAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    while (!finished.get()) {
+                        lock.lock();
+
+                        try {
+                            cache1.invoke(finalKey, new TestEntryProcessor());
+
+                            cntr.getAndIncrement();
+                        }
+                        finally {
+                            lock.unlock();
+                        }
+                    }
+
+                    return null;
+                }
+            });
+
+            backupFut = runAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    while (!finished.get()) {
+                        stopGrid(2);
+
+                        IgniteEx backUp = startGrid(2);
+
+                        IgniteCache<Integer, Integer> cache3 = backUp.cache(null);
+
+                        lock.lock();
+
+                        try {
+                            Integer backUpVal = cache3.localPeek(finalKey);
+
+                            Integer exp = cntr.get();
+
+                            assertEquals(exp, backUpVal);
+                        }
+                        finally {
+                            lock.unlock();
+                        }
+                    }
+                    return null;
+                }
+            });
+
+            Thread.sleep(30_000);
+        }
+        finally {
+            finished.set(true);
+        }
+
+        primaryFut.get();
+        backupFut.get();
+    }
+
+    /**
+     *
+     */
+    static class TestEntryProcessor implements EntryProcessor<Integer, Integer, Void> {
+        /** {@inheritDoc}*/
+        @Override public Void process(MutableEntry<Integer, Integer> entry, Object... args) {
+            Integer v = entry.getValue() + 1;
+
+            entry.setValue(v);
+
+            return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e031498d/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
index dc412a9..3fc27de 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
@@ -72,6 +72,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePart
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedPreloadEventsSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedTopologyChangeSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedUnloadEventsSelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCachePartitionedBackupNodeFailureRecoveryTest;
 import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearEvictionEventSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearMultiNodeSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearReadersSelfTest;
@@ -259,6 +260,7 @@ public class IgniteCacheTestSuite2 extends TestSuite {
         suite.addTest(new TestSuite(CacheEnumOperationsSingleNodeTest.class));
         suite.addTest(new TestSuite(CacheEnumOperationsTest.class));
         suite.addTest(new TestSuite(IgniteCacheIncrementTxTest.class));
+        suite.addTest(new TestSuite(IgniteCachePartitionedBackupNodeFailureRecoveryTest.class));
 
         suite.addTest(new TestSuite(IgniteNoCustomEventsOnNodeStart.class));