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)