[
https://issues.apache.org/jira/browse/IGNITE-12124?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16984959#comment-16984959
]
Andrey N. Gura commented on IGNITE-12124:
-----------------------------------------
[~slava.koptilin] LGTM. Thanks for spotting this and thanks for contribution!
Merged to master branch.
> Stopping the cache does not wait for expiration process, which may be started
> and may lead to errors
> ----------------------------------------------------------------------------------------------------
>
> Key: IGNITE-12124
> URL: https://issues.apache.org/jira/browse/IGNITE-12124
> Project: Ignite
> Issue Type: Bug
> Affects Versions: 2.7
> Reporter: Vyacheslav Koptilin
> Assignee: Vyacheslav Koptilin
> Priority: Major
> Fix For: 2.8
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Stopping a cache with configured TTL may lead to errors. For instance,
> {noformat}
> java.lang.NullPointerException
> at
> org.apache.ignite.internal.processors.cache.GridCacheContext.onDeferredDelete(GridCacheContext.java:1702)
> at
> org.apache.ignite.internal.processors.cache.GridCacheMapEntry.onTtlExpired(GridCacheMapEntry.java:4040)
> at
> org.apache.ignite.internal.processors.cache.GridCacheTtlManager$1.applyx(GridCacheTtlManager.java:75)
> at
> org.apache.ignite.internal.processors.cache.GridCacheTtlManager$1.applyx(GridCacheTtlManager.java:66)
> at
> org.apache.ignite.internal.util.lang.IgniteInClosure2X.apply(IgniteInClosure2X.java:37)
> at
> org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager$GridCacheDataStore.purgeExpiredInternal(GridCacheOffheapManager.java:2501)
> at
> org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager$GridCacheDataStore.purgeExpired(GridCacheOffheapManager.java:2427)
> at
> org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager.expire(GridCacheOffheapManager.java:989)
> at
> org.apache.ignite.internal.processors.cache.GridCacheTtlManager.expire(GridCacheTtlManager.java:233)
> at
> org.apache.ignite.internal.processors.cache.GridCacheSharedTtlCleanupManager$CleanupWorker.body(GridCacheSharedTtlCleanupManager.java:150)
> at
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:119)
> at java.lang.Thread.run(Thread.java:748){noformat}
> The obvious reason for this {{NullPointerException}} is that unregistering of
> {{GridCacheTtlManager}} (see {{GridCacheSharedTtlCleanupManager#unregister}}
> does not wait for the finish of expiration (in that particular case,
> {{GridCacheContext}} is already cleaned up).
>
> So, unregistering of {{GridCacheTtlManager}}, caused by cache stopping, must
> wait for expiration if it is running for the cache that stops. On the other
> hand, it does not seem correct to wait for expiration under the
> {{checkpointReadLock}} see
> {{GridCacheProcessor#processCacheStopRequestOnExchangeDone}}:
> {code:java}
> private void processCacheStopRequestOnExchangeDone(ExchangeActions
> exchActions) {
> ...
> doInParallel(
> parallelismLvl,
> sharedCtx.kernalContext().getSystemExecutorService(),
> cachesToStop.entrySet(),
> cachesToStopByGrp -> {
> ...
> for (ExchangeActions.CacheActionData action :
> cachesToStopByGrp.getValue()) {
> ...
> sharedCtx.database().checkpointReadLock();
> try {
> prepareCacheStop(...); <---unregistering of
> GridCacheTtlManager is performed here
> }
> finally {
> sharedCtx.database().checkpointReadUnlock();
> }
> }
> ...
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)