From c40ee2d4381a4eea01978edc5f2999b7a632d74f Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Thu, 23 Jun 2016 17:40:52 +0300 Subject: [PATCH 1/3] IGNITE-3340 .NET: Cache store is not destroyed on DestroyCache - wip --- .../platform/PlatformProcessorImpl.java | 35 ++----------------- .../dotnet/PlatformDotNetCacheStore.java | 28 ++++++++------- 2 files changed, 18 insertions(+), 45 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java index 5830d372a3e66..8c9e2057d2468 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java @@ -75,10 +75,6 @@ public class PlatformProcessorImpl extends GridProcessorAdapter implements Platf private final Collection pendingStores = Collections.newSetFromMap(new ConcurrentHashMap()); - /** Started stores. */ - private final Collection stores = - Collections.newSetFromMap(new ConcurrentHashMap()); - /** Lock for store lifecycle operations. */ private final ReadWriteLock storeLock = new ReentrantReadWriteLock(); @@ -95,7 +91,7 @@ public class PlatformProcessorImpl extends GridProcessorAdapter implements Platf private boolean started; /** Whether processor if stopped (or stopping). */ - private boolean stopped; + private volatile boolean stopped; /** * Constructor. @@ -165,34 +161,7 @@ public PlatformProcessorImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void stop(boolean cancel) throws IgniteCheckedException { if (platformCtx != null) { - // Destroy cache stores. - storeLock.writeLock().lock(); - - try { - for (PlatformCacheStore store : stores) { - if (store != null) { - if (store instanceof PlatformDotNetCacheStore) { - PlatformDotNetCacheStore store0 = (PlatformDotNetCacheStore)store; - - try { - store0.destroy(platformCtx.kernalContext()); - } - catch (Exception e) { - U.error(log, "Failed to destroy .Net cache store [store=" + store0 + - ", err=" + e.getMessage() + ']'); - } - } - else - assert false : "Invalid interop cache store type: " + store; - } - } - } - finally { - stopped = true; - - storeLock.writeLock().unlock(); - } - + stopped = true; platformCtx.gateway().onStop(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java index 45d92081c4fe2..6305cda796cc5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.platform.dotnet; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; import org.apache.ignite.cache.store.CacheStore; import org.apache.ignite.cache.store.CacheStoreSession; import org.apache.ignite.internal.GridKernalContext; @@ -34,6 +35,7 @@ import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiInClosure; +import org.apache.ignite.lifecycle.LifecycleAware; import org.apache.ignite.resources.CacheStoreSessionResource; import org.jetbrains.annotations.Nullable; @@ -57,7 +59,7 @@ * method in .NET during node startup. Refer to its documentation for * details. */ -public class PlatformDotNetCacheStore implements CacheStore, PlatformCacheStore { +public class PlatformDotNetCacheStore implements CacheStore, PlatformCacheStore, LifecycleAware { /** Load cache operation code. */ private static final byte OP_LOAD_CACHE = (byte)0; @@ -309,6 +311,19 @@ public void setProperties(Map props) { } } + /** {@inheritDoc} */ + @Override public void start() throws IgniteException { + // No-op. + // TODO: Do init here? + } + + /** {@inheritDoc} */ + @Override public void stop() throws IgniteException { + assert platformCtx != null; + + platformCtx.gateway().cacheStoreDestroy(ptr); + } + /** * Initialize the store. * @@ -393,17 +408,6 @@ protected int doInvoke(IgniteInClosureX task, @Nullable Platf } } - /** - * Destroys interop-aware component. - * - * @param ctx Context. - */ - public void destroy(GridKernalContext ctx) { - assert ctx != null; - - platformCtx.gateway().cacheStoreDestroy(ptr); - } - /** * Load callback. */ From 9ed1b033168ffa69f0766e080238e231a4971135 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Thu, 23 Jun 2016 17:55:25 +0300 Subject: [PATCH 2/3] wip --- .../processors/platform/callback/PlatformCallbackGateway.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/callback/PlatformCallbackGateway.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/callback/PlatformCallbackGateway.java index 5093773b49653..3439f38a9ca78 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/callback/PlatformCallbackGateway.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/callback/PlatformCallbackGateway.java @@ -88,7 +88,8 @@ public int cacheStoreInvoke(long objPtr, long memPtr, Object cb) { * @param objPtr Object pointer. */ public void cacheStoreDestroy(long objPtr) { - enter(); + if (!lock.enterBusy()) + return; // no need to destroy stores on grid stop try { PlatformCallbackUtils.cacheStoreDestroy(envPtr, objPtr); From 019ddfc438c80153fe6ac4c1d7f68b8a6b7721f0 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Thu, 23 Jun 2016 18:07:38 +0300 Subject: [PATCH 3/3] Add handle test --- .../Cache/Store/CacheStoreTest.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs index d6a7f60535c4e..8061e9f6bb41a 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs @@ -24,6 +24,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Store using Apache.Ignite.Core.Binary; using Apache.Ignite.Core.Cache; using Apache.Ignite.Core.Cache.Store; + using Apache.Ignite.Core.Impl; using NUnit.Framework; /// @@ -463,15 +464,19 @@ public void TestCustomStoreProperties() [Test] public void TestDynamicStoreStart() { - var cache = GetTemplateStoreCache(); + var grid = Ignition.GetIgnite(GridName); + var reg = ((Ignite) grid).HandleRegistry; + var handleCount = reg.Count; + var cache = GetTemplateStoreCache(); Assert.IsNotNull(cache); cache.Put(1, cache.Name); - Assert.AreEqual(cache.Name, CacheTestStore.Map[1]); - _storeCount++; + Assert.AreEqual(handleCount + 1, reg.Count); + grid.DestroyCache(cache.Name); + Assert.AreEqual(handleCount, reg.Count); } [Test]