This is an automated email from the ASF dual-hosted git repository.

sergeychugunov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new f7c14f2  IGNITE-14080 Fix hung binary-metadata-writer after wal 
standalone iterator is closed - Fixes #8720.
f7c14f2 is described below

commit f7c14f2b447bc7e1744bc494fdf64d8a3c3f3111
Author: Mirza Aliev <alievmi...@gmail.com>
AuthorDate: Wed Feb 3 14:58:45 2021 +0300

    IGNITE-14080 Fix hung binary-metadata-writer after wal standalone iterator 
is closed - Fixes #8720.
    
    Signed-off-by: Sergey Chugunov <sergey.chugu...@gmail.com>
---
 .../wal/reader/StandaloneWalRecordsIterator.java   |  2 ++
 .../reader/StandaloneWalRecordsIteratorTest.java   | 33 ++++++++++++++++++++++
 .../ignite/testsuites/IgnitePdsTestSuite2.java     |  3 +-
 3 files changed, 37 insertions(+), 1 deletion(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIterator.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIterator.java
index b2f9975..472afba 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIterator.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIterator.java
@@ -510,6 +510,8 @@ class StandaloneWalRecordsIterator extends 
AbstractWalRecordsIterator {
         closeCurrentWalSegment();
 
         curWalSegmIdx = Integer.MAX_VALUE;
+
+        sharedCtx.kernalContext().cacheObjects().stop(true);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIteratorTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIteratorTest.java
index 630d643..a8ca6a2 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIteratorTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneWalRecordsIteratorTest.java
@@ -25,7 +25,9 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.configuration.DataRegionConfiguration;
@@ -44,8 +46,10 @@ import 
org.apache.ignite.internal.processors.cache.persistence.file.RandomAccess
 import 
org.apache.ignite.internal.processors.cache.persistence.wal.FileDescriptor;
 import 
org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager;
 import org.apache.ignite.internal.processors.cache.persistence.wal.WALPointer;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.logger.NullLogger;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
@@ -195,6 +199,35 @@ public class StandaloneWalRecordsIteratorTest extends 
GridCommonAbstractTest {
     }
 
     /**
+     * Checks if binary-metadata-writer thread is not hung after standalone 
iterator is closed.
+     *
+     * @throws Exception if test failed.
+     */
+    @Test
+    public void testBinaryMetadataWriterStopped() throws Exception {
+        String dir = createWalFiles();
+
+        final IgniteWalIteratorFactory factory = new 
IgniteWalIteratorFactory(new NullLogger());
+
+        IgniteWalIteratorFactory.IteratorParametersBuilder 
iterParametersBuilder =
+            new 
IgniteWalIteratorFactory.IteratorParametersBuilder().filesOrDirs(dir)
+                .pageSize(4096);
+
+        try (WALIterator stIt = factory.iterator(iterParametersBuilder)) {
+        }
+
+        boolean binaryMetadataWriterStopped = 
GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                Set<String> threadNames = 
Thread.getAllStackTraces().keySet().stream().map(Thread::getName).collect(Collectors.toSet());
+
+                return threadNames.stream().noneMatch(t -> 
t.startsWith("binary-metadata-writer"));
+            }
+        }, 10_000L);
+
+        assertTrue(binaryMetadataWriterStopped);
+    }
+
+    /**
      * Creates WALIterator associated with files inside walDir.
      *
      * @param walDir - path to WAL directory.
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
index 2e8593f..1d7636b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
@@ -172,6 +172,8 @@ public class IgnitePdsTestSuite2 {
      * @param ignoredTests Ignored tests.
      */
     public static void addRealPageStoreTests(List<Class<?>> suite, 
Collection<Class> ignoredTests) {
+        GridTestUtils.addTestIfNeeded(suite, 
StandaloneWalRecordsIteratorTest.class, ignoredTests);
+
         GridTestUtils.addTestIfNeeded(suite, IgnitePdsPageSizesTest.class, 
ignoredTests);
 
         // Metrics test.
@@ -221,7 +223,6 @@ public class IgnitePdsTestSuite2 {
         GridTestUtils.addTestIfNeeded(suite, 
IgniteWalIteratorSwitchSegmentTest.class, ignoredTests);
         GridTestUtils.addTestIfNeeded(suite, 
IgniteWalIteratorExceptionDuringReadTest.class, ignoredTests);
         GridTestUtils.addTestIfNeeded(suite, 
IgniteNodeStoppedDuringDisableWALTest.class, ignoredTests);
-        GridTestUtils.addTestIfNeeded(suite, 
StandaloneWalRecordsIteratorTest.class, ignoredTests);
         GridTestUtils.addTestIfNeeded(suite, FilteredWalIteratorTest.class, 
ignoredTests);
         GridTestUtils.addTestIfNeeded(suite, WalScannerTest.class, 
ignoredTests);
         GridTestUtils.addTestIfNeeded(suite, 
IgniteWalRecoverySeveralRestartsTest.class, ignoredTests);

Reply via email to