Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B5EBA18BF1 for ; Wed, 10 Jun 2015 21:46:47 +0000 (UTC) Received: (qmail 64481 invoked by uid 500); 10 Jun 2015 21:46:47 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 64449 invoked by uid 500); 10 Jun 2015 21:46:47 -0000 Mailing-List: contact commits-help@ignite.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.incubator.apache.org Delivered-To: mailing list commits@ignite.incubator.apache.org Received: (qmail 64440 invoked by uid 99); 10 Jun 2015 21:46:47 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 10 Jun 2015 21:46:47 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 27D781A49C2 for ; Wed, 10 Jun 2015 21:46:47 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.791 X-Spam-Level: * X-Spam-Status: No, score=1.791 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-eu-west.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id USakJYzNztJi for ; Wed, 10 Jun 2015 21:46:38 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-eu-west.apache.org (ASF Mail Server at mx1-eu-west.apache.org) with SMTP id C48652496C for ; Wed, 10 Jun 2015 21:46:37 +0000 (UTC) Received: (qmail 64385 invoked by uid 99); 10 Jun 2015 21:46:37 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 10 Jun 2015 21:46:37 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id E575CE0385; Wed, 10 Jun 2015 21:46:36 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.incubator.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: incubator-ignite git commit: ignite-929 Date: Wed, 10 Jun 2015 21:46:36 +0000 (UTC) Repository: incubator-ignite Updated Branches: refs/heads/ignite-929 00eb9f192 -> 87c8d8d68 ignite-929 Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/87c8d8d6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/87c8d8d6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/87c8d8d6 Branch: refs/heads/ignite-929 Commit: 87c8d8d68d001dc94b1c8a0d587196fcb78224ec Parents: 00eb9f1 Author: Anton Vinogradov Authored: Thu Jun 11 00:44:01 2015 +0300 Committer: Anton Vinogradov Committed: Thu Jun 11 00:44:01 2015 +0300 ---------------------------------------------------------------------- .../processors/cache/GridCacheGateway.java | 26 ++-- .../cache/CacheStopAndDestroySelfTest.java | 124 ++++++++++++++++--- 2 files changed, 121 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/87c8d8d6/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGateway.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGateway.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGateway.java index b66fe7b..f9142d1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGateway.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGateway.java @@ -17,12 +17,16 @@ package org.apache.ignite.internal.processors.cache; -import org.apache.ignite.*; -import org.apache.ignite.internal.*; -import org.apache.ignite.internal.util.*; -import org.apache.ignite.internal.util.tostring.*; -import org.apache.ignite.internal.util.typedef.internal.*; -import org.jetbrains.annotations.*; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.IgniteInterruptedCheckedException; +import org.apache.ignite.internal.util.GridSpinReadWriteLock; +import org.apache.ignite.internal.util.tostring.GridToStringExclude; +import org.apache.ignite.internal.util.typedef.internal.CU; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.atomic.AtomicInteger; /** * Cache gateway. @@ -35,8 +39,8 @@ public class GridCacheGateway { /** Stopped flag for dynamic caches. */ private volatile boolean stopped; - /** Closed flag for dynamic caches. */ - private volatile boolean closed; + /** Client counter. */ + private volatile AtomicInteger clients = new AtomicInteger(0); /** */ private GridSpinReadWriteLock rwLock = new GridSpinReadWriteLock(); @@ -153,7 +157,7 @@ public class GridCacheGateway { throw new IllegalStateException("Cache has been stopped: " + ctx.name()); } - if (closed) { + if (clients.get() <= 0) { rwLock.readUnlock(); throw new IllegalStateException("Cache has been closed: " + ctx.name()); @@ -246,14 +250,14 @@ public class GridCacheGateway { * */ public void open() { - closed = false; + clients.incrementAndGet(); } /** * */ public void close() { - closed = true; + clients.decrementAndGet(); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/87c8d8d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java index e0c18cb..9913df9 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java @@ -17,24 +17,27 @@ package org.apache.ignite.internal.processors.cache; -import org.apache.ignite.*; -import org.apache.ignite.cache.*; -import org.apache.ignite.cluster.*; -import org.apache.ignite.configuration.*; -import org.apache.ignite.internal.managers.communication.*; -import org.apache.ignite.internal.processors.cache.distributed.dht.*; -import org.apache.ignite.internal.util.typedef.internal.*; -import org.apache.ignite.plugin.extensions.communication.*; -import org.apache.ignite.spi.*; -import org.apache.ignite.spi.communication.tcp.*; -import org.apache.ignite.spi.discovery.tcp.*; -import org.apache.ignite.spi.discovery.tcp.ipfinder.*; -import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*; -import org.apache.ignite.testframework.*; -import org.apache.ignite.testframework.junits.common.*; - -import java.util.*; -import java.util.concurrent.atomic.*; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.IgniteInterruptedCheckedException; +import org.apache.ignite.internal.managers.communication.GridIoMessage; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.spi.IgniteSpiException; +import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; +import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; /** * Checks stop and destroy methods behavior. @@ -58,6 +61,9 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest { /** local cache name. */ protected static String CACHE_NAME_LOC = "cache_local"; + /** */ + private static volatile boolean stop; + /** * @return Grids count to start. */ @@ -720,6 +726,88 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest { } } + /** + * Tests concurrent close. + * + * @throws org.apache.ignite.internal.IgniteInterruptedCheckedException + * @throws InterruptedException + */ + public void testConcurrentCloseSetWithTry() throws IgniteInterruptedCheckedException, InterruptedException { + final AtomicInteger a1 = new AtomicInteger(); + final AtomicInteger a2 = new AtomicInteger(); + final AtomicInteger a3 = new AtomicInteger(); + final AtomicInteger a4 = new AtomicInteger(); + + Thread t1 = new Thread(new Runnable() { + @Override public void run() { + closeWithTry(a1, 0); + + } + }); + Thread t2 = new Thread(new Runnable() { + @Override public void run() { + closeWithTry(a2, 0); + + } + }); + Thread t3 = new Thread(new Runnable() { + @Override public void run() { + closeWithTry(a3, 2); + + } + }); + Thread t4 = new Thread(new Runnable() { + @Override public void run() { + closeWithTry(a4, 2); + + } + }); + + IgniteCache cache = grid(0).getOrCreateCache(getDhtConfig()); + + cache.close(); + + t1.start(); + t2.start(); + t3.start(); + t4.start(); + + U.sleep(1000); + + stop = true; + + t1.join(); + t2.join(); + t3.join(); + t4.join(); + + assert a1.get() > 1; + assert a2.get() > 1; + assert a3.get() > 1; + assert a4.get() > 1; + + try { + cache.get(KEY_VAL); + } + catch (IllegalStateException e) { + // No-op + } + } + + public void closeWithTry(AtomicInteger a, int node) { + while (!stop) { + try (IgniteCache cache = grid(node).getOrCreateCache(getDhtConfig())) { + a.incrementAndGet(); + + assert cache.get(KEY_VAL) == null || cache.get(KEY_VAL).equals(KEY_VAL); + + cache.put(KEY_VAL, KEY_VAL); + + assert cache.get(KEY_VAL).equals(KEY_VAL); + } + } + } + /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { super.beforeTest();