diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 80ca9291e2f4e..c6a0b7c7be114 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -116,6 +116,7 @@ import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.lang.IgniteClosure; import org.apache.ignite.lang.IgniteFuture; import org.apache.ignite.lang.IgnitePredicate; @@ -904,7 +905,7 @@ private void addRemovedItemsCleanupTask(long timeout) { private void checkConsistency() throws IgniteCheckedException { if (!ctx.config().isDaemon() && !getBoolean(IGNITE_SKIP_CONFIGURATION_CONSISTENCY_CHECK)) { for (ClusterNode n : ctx.discovery().remoteNodes()) { - if (n.attribute(ATTR_CONSISTENCY_CHECK_SKIPPED)) + if (Boolean.TRUE.equals(n.attribute(ATTR_CONSISTENCY_CHECK_SKIPPED))) continue; checkTransactionConfiguration(n); @@ -1264,16 +1265,6 @@ private void stopCache(GridCacheAdapter cache, boolean cancel, boolean des if (log.isInfoEnabled()) log.info("Stopped cache: " + cache.name()); - if (sharedCtx.pageStore() != null) { - try { - sharedCtx.pageStore().shutdownForCache(ctx, destroy); - } - catch (IgniteCheckedException e) { - U.error(log, "Failed to gracefully clean page store resources for destroyed cache " + - "[cache=" + ctx.name() + "]", e); - } - } - cleanup(ctx); } @@ -1909,8 +1900,9 @@ private void stopGateway(DynamicCacheChangeRequest req) { /** * @param req Stop request. + * @return Stopped cache context. */ - private void prepareCacheStop(DynamicCacheChangeRequest req) { + private GridCacheContext prepareCacheStop(DynamicCacheChangeRequest req) { assert req.stop() || req.close() : req; GridCacheAdapter cache = caches.remove(maskNull(req.cacheName())); @@ -1926,7 +1918,11 @@ private void prepareCacheStop(DynamicCacheChangeRequest req) { onKernalStop(cache, req.destroy()); stopCache(cache, true, req.destroy()); + + return ctx; } + + return null; } /** @@ -1956,16 +1952,22 @@ public void onExchangeDone( } if (!F.isEmpty(reqs) && err == null) { + Collection> stopped = null; + for (DynamicCacheChangeRequest req : reqs) { String masked = maskNull(req.cacheName()); + GridCacheContext stopCtx = null; + boolean destroy = false; + if (req.stop()) { stopGateway(req); sharedCtx.database().checkpointReadLock(); try { - prepareCacheStop(req); + stopCtx = prepareCacheStop(req); + destroy = req.destroy(); } finally { sharedCtx.database().checkpointReadUnlock(); @@ -1987,11 +1989,22 @@ else if (req.close() && req.initiatingNodeId().equals(ctx.localNodeId())) { proxy.context().gate().onStopped(); - prepareCacheStop(req); + stopCtx = prepareCacheStop(req); + destroy = req.destroy(); } } } + + if (stopCtx != null) { + if (stopped == null) + stopped = new ArrayList<>(); + + stopped.add(F.t(stopCtx, destroy)); + } } + + if (stopped != null) + sharedCtx.database().onCachesStopped(stopped); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java index f2ab94039371f..33dc7b47672a9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java @@ -39,6 +39,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport; +import org.apache.ignite.lang.IgniteBiTuple; import org.jetbrains.annotations.Nullable; /** @@ -192,9 +193,9 @@ public void beforeExchange(GridDhtPartitionsExchangeFuture discoEvt) throws Igni } /** - * @throws IgniteCheckedException If failed. + * @param stoppedCtxs A collection of tuples (cache context, destroy flag). */ - public void beforeCachesStop() throws IgniteCheckedException { + public void onCachesStopped(Collection> stoppedCtxs) { // No-op. } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java index ac5fda260d34b..a9bca20b8209c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java @@ -122,7 +122,7 @@ /** * Non-transactional partitioned cache. */ -@SuppressWarnings("unchecked") +@SuppressWarnings({"unchecked", "TooBroadScope"}) @GridToStringExclude public class GridDhtAtomicCache extends GridDhtCacheAdapter { /** */ @@ -1806,6 +1806,8 @@ private void updateAllAsyncInternal0( IgniteCacheExpiryPolicy expiry = null; + ctx.shared().database().checkpointReadLock(); + try { // If batch store update is enabled, we need to lock all entries. // First, need to acquire locks on cache entries, then check filter. @@ -1978,6 +1980,9 @@ private void updateAllAsyncInternal0( return; } + finally { + ctx.shared().database().checkpointReadUnlock(); + } if (remap) { assert dhtFut == null; @@ -2923,8 +2928,6 @@ else if (readers.contains(node.id())) // Reader became primary or backup. @SuppressWarnings("ForLoopReplaceableByForEach") private List lockEntries(GridNearAtomicAbstractUpdateRequest req, AffinityTopologyVersion topVer) throws GridDhtInvalidPartitionException { - ctx.shared().database().checkpointReadLock(); - if (req.size() == 1) { KeyCacheObject key = req.key(0); @@ -3040,8 +3043,6 @@ private void unlockEntries(Collection locked, AffinityTopolog entry.onUnlock(); } - ctx.shared().database().checkpointReadUnlock(); - if (skip != null && skip.size() == locked.size()) // Optimization. return; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java index 2ccb29bc0d000..f34eccadcaea8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java @@ -535,21 +535,6 @@ else if (msg instanceof StartFullSnapshotAckDiscoveryMessage) updateTopologies(crdNode); - if (!F.isEmpty(reqs)) { - boolean hasStop = false; - - for (DynamicCacheChangeRequest req : reqs) { - if (req.stop()) { - hasStop = true; - - break; - } - } - - if (hasStop) - cctx.cache().context().database().beforeCachesStop(); - } - switch (exchange) { case ALL: { distributedExchange(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java index 9587b046cd71d..7cf77661bdb96 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java @@ -354,7 +354,8 @@ CU.UTILITY_CACHE_NAME, new ServiceEntriesListener(), null, null cancelFutures(depFuts, err); cancelFutures(undepFuts, err); - }finally { + } + finally { busyLock.unblock(); }