You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Vyacheslav Koptilin (Jira)" <ji...@apache.org> on 2021/04/22 13:18:00 UTC

[jira] [Updated] (IGNITE-14624) WalSegmentSyncer stops in an incorrect way

     [ https://issues.apache.org/jira/browse/IGNITE-14624?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Vyacheslav Koptilin updated IGNITE-14624:
-----------------------------------------
    Ignite Flags:   (was: Docs Required,Release Notes Required)

> WalSegmentSyncer stops in an incorrect way
> ------------------------------------------
>
>                 Key: IGNITE-14624
>                 URL: https://issues.apache.org/jira/browse/IGNITE-14624
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Vyacheslav Koptilin
>            Assignee: Vyacheslav Koptilin
>            Priority: Major
>
> {{WalSegmentSyncer#shutdown}} uses {{U.join(GridWorker, IgniteLogger)}} method which delegates to {{GridWorker#join()}}
> {code:java|title=GridWorker.java}
>     public void join() throws InterruptedException {
>         ...
>         if ((runner == null && isCancelled) || finished)
>             return;
>         synchronized (mux) {
>             while (!finished)
>                 mux.wait();
>         }
>     }
> {code}
> On the other hand, {{GridWorker#run()}} nullifies the {{runner}} field *after* the worker notifies all threads that work is finished:
> {code:java|title=GridWorker.java}
>     @Override public final void run() {
>         // Runner thread must be recorded first as other operations
>         // may depend on it being present.
>         runner = Thread.currentThread();
>         try {
>             ...
>             body();
>         }
>         catch (Throwable e) {
>             ...
>         }
>         finally {
>             synchronized (mux) {
>                 finished = true;
>                 mux.notifyAll();
>             }
>             ...
>             // Need to set runner to null, to make sure that
>             // further operations on this runnable won't
>             // affect the thread which could have been recycled
>             // by thread pool.
>             runner = null;
>         }
>     }
> {code}
> This can lead to {{AssertionError}} like the following:
> {noformat}
> java.lang.AssertionError: WalSegmentSyncer is running.
> 	org.apache.ignite.internal.processors.cache.persistence.wal.filehandle.FileHandleManagerImpl$WalSegmentSyncer.restart(FileHandleManagerImpl.java:646)
> 	org.apache.ignite.internal.processors.cache.persistence.wal.filehandle.FileHandleManagerImpl.resumeLogging(FileHandleManagerImpl.java:235)
> 	org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager.resumeLogging(FileWriteAheadLogManager.java:705)
> 	org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.resumeWalLogging(GridCacheDatabaseSharedManager.java:1707)
> 	org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.finishRecovery(GridCacheDatabaseSharedManager.java:757)
> 	org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.onActivate(GridCacheDatabaseSharedManager.java:637)
> 	org.apache.ignite.internal.processors.cache.GridCacheSharedContext.activate(GridCacheSharedContext.java:296)
> 	org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onClusterStateChangeRequest(GridDhtPartitionsExchangeFuture.java:1322)
> 	org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.init(GridDhtPartitionsExchangeFuture.java:964)
> 	org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:3375)
> 	org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:3194)
> 	org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:119)
> 	java.lang.Thread.run(Thread.java:748)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)