ignite-gg-11842 Add reproducer test.

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

Branch: refs/heads/ignite-3477
Commit: 2999ffd5646e608a20080b758f65e0e816343c77
Parents: 893cd90
Author: Dmitriy Govorukhin <[email protected]>
Authored: Wed Dec 28 18:53:36 2016 +0300
Committer: Dmitriy Govorukhin <[email protected]>
Committed: Wed Dec 28 18:53:36 2016 +0300

----------------------------------------------------------------------
 .../GridCacheConcurrentGetCacheOnClient.java    | 129 +++++++++++++++++++
 .../ignite/testframework/GridTestUtils.java     |  80 ++++++++++--
 2 files changed, 197 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2999ffd5/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentGetCacheOnClient.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentGetCacheOnClient.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentGetCacheOnClient.java
new file mode 100644
index 0000000..3a97964
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentGetCacheOnClient.java
@@ -0,0 +1,129 @@
+/*
+ * 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;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.testframework.GridTestUtils.runAsync;
+
+/**
+ *
+ */
+public class GridCacheConcurrentGetCacheOnClient extends 
GridCommonAbstractTest{
+    /** Ip finder. */
+    private final static TcpDiscoveryVmIpFinder ipFinder = new 
TcpDiscoveryVmIpFinder(true);
+
+    /**
+     * @param gridName Grid name.
+     */
+   @Override protected IgniteConfiguration getConfiguration(final String 
gridName) throws Exception {
+        final IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
+
+        return cfg;
+    }
+
+    /**
+     *
+     */
+    public void test() throws Exception {
+        IgniteConfiguration node1cfg = getConfiguration("node1");
+        IgniteConfiguration node2cfg = getConfiguration("node2");
+
+        Ignite node1 = startGrid("node1", node1cfg);
+        Ignite node2 = startGrid("node2", node2cfg);
+
+        IgniteConfiguration clientCfg1 = getConfiguration("client");
+        clientCfg1.setClientMode(true);
+
+        IgniteConfiguration clientCfg2 = getConfiguration("client");
+        clientCfg2.setClientMode(true);
+
+        final IgniteEx client1 = (IgniteEx)startGrid("client1", clientCfg1);
+        final IgniteEx client2 = (IgniteEx)startGrid("client2", clientCfg2);
+
+        final CountDownLatch startLatch = new CountDownLatch(1);
+
+        final CountDownLatch stopLatch = new CountDownLatch(2);
+
+        final AtomicInteger countFails = new AtomicInteger();
+
+        final AtomicInteger exceptionFails = new AtomicInteger();
+
+        final String cacheName = "TEST_CACHE";
+
+        runAsync(new Runnable() {
+            @Override public void run() {
+                try {
+                    startLatch.await();
+
+                    IgniteCache<Object, Object> cache = 
client2.cache(cacheName);
+
+                    if (cache == null)
+                        countFails.incrementAndGet();
+
+                    stopLatch.countDown();
+                }
+                catch (Exception e) {
+                    exceptionFails.incrementAndGet();
+                }
+            }
+        });
+
+        runAsync(new Runnable() {
+            @Override public void run() {
+                try {
+                    startLatch.await();
+
+                    IgniteCache<Object, Object> cache = 
client2.cache(cacheName);
+
+                    if (cache == null)
+                        countFails.incrementAndGet();
+
+                    stopLatch.countDown();
+                }
+                catch (Exception e) {
+                    exceptionFails.incrementAndGet();
+                }
+            }
+        });
+
+        client1.getOrCreateCache(cacheName);
+
+        startLatch.countDown();
+
+        IgniteCache<Object, Object> cache = client2.cache(cacheName);
+
+        if (cache == null)
+            countFails.incrementAndGet();
+
+        stopLatch.await();
+
+        if (countFails.get() != 0 || exceptionFails.get() != 0)
+            fail("Cache return null in " + countFails.get() + " of 3 cases. 
Total exception: " + exceptionFails.get());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2999ffd5/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java 
b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
index 218f658..065147e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
@@ -755,6 +755,72 @@ public final class GridTestUtils {
     }
 
     /**
+     * Create future async result.
+     *
+     * @param thrFactory Thr factory.
+     */
+    private static<T> GridFutureAdapter<T> createFutureAdapter(final 
GridTestSafeThreadFactory thrFactory){
+       return new GridFutureAdapter<T>() {
+            @Override public boolean cancel() throws IgniteCheckedException {
+                super.cancel();
+
+                thrFactory.interruptAllThreads();
+
+                onCancelled();
+
+                return true;
+            }
+        };
+    }
+
+    /**
+     * Runs runnable task asyncronously.
+     *
+     * @param task Runnable.
+     * @return Future with task result.
+     */
+    @SuppressWarnings("ExternalizableWithoutPublicNoArgConstructor")
+    public static IgniteInternalFuture runAsync(final Runnable task) {
+        return runAsync(task,"async-runnable-runner");
+    }
+
+    /**
+     * Runs runnable task asyncronously.
+     *
+     * @param task Runnable.
+     * @return Future with task result.
+     */
+    @SuppressWarnings("ExternalizableWithoutPublicNoArgConstructor")
+    public static IgniteInternalFuture runAsync(final Runnable task, String 
threadName) {
+        if (!busyLock.enterBusy())
+            throw new IllegalStateException("Failed to start new threads (test 
is being stopped).");
+
+        try {
+            final GridTestSafeThreadFactory thrFactory = new 
GridTestSafeThreadFactory(threadName);
+
+            final GridFutureAdapter fut = createFutureAdapter(thrFactory);
+
+            thrFactory.newThread(new Runnable() {
+                @Override public void run() {
+                    try {
+                        task.run();
+
+                        fut.onDone();
+                    }
+                    catch (Throwable e) {
+                        fut.onDone(e);
+                    }
+                }
+            }).start();
+
+            return fut;
+        }
+        finally {
+            busyLock.leaveBusy();
+        }
+    }
+
+    /**
      * Runs callable task asyncronously.
      *
      * @param task Callable.
@@ -762,7 +828,7 @@ public final class GridTestUtils {
      */
     @SuppressWarnings("ExternalizableWithoutPublicNoArgConstructor")
     public static <T> IgniteInternalFuture<T> runAsync(final Callable<T> task) 
{
-        return runAsync(task, "async-runner");
+        return runAsync(task, "async-callable-runner");
     }
 
     /**
@@ -780,17 +846,7 @@ public final class GridTestUtils {
         try {
             final GridTestSafeThreadFactory thrFactory = new 
GridTestSafeThreadFactory(threadName);
 
-            final GridFutureAdapter<T> fut = new GridFutureAdapter<T>() {
-                @Override public boolean cancel() throws 
IgniteCheckedException {
-                    super.cancel();
-
-                    thrFactory.interruptAllThreads();
-
-                    onCancelled();
-
-                    return true;
-                }
-            };
+            final GridFutureAdapter<T> fut = createFutureAdapter(thrFactory);
 
             thrFactory.newThread(new Runnable() {
                 @Override public void run() {

Reply via email to