You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2021/02/03 12:00:36 UTC

[ignite] branch master updated: IGNITE-14080 Fix hung binary-metadata-writer after wal standalone iterator is closed - Fixes #8720.

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 <al...@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 <se...@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);