Repository: ignite Updated Branches: refs/heads/master 8633d34ec -> 0aaaab0d5
IGNITE-9039 Fixed non-releasing pinned page on throttling fallback - Fixes #4390. Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0aaaab0d Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0aaaab0d Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0aaaab0d Branch: refs/heads/master Commit: 0aaaab0d523a3d40defb9fbf5315e213a5ae5dae Parents: 8633d34 Author: Eduard Shangareev <eshangar...@gridgain.com> Authored: Fri Jul 20 17:22:52 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Fri Jul 20 18:01:43 2018 +0300 ---------------------------------------------------------------------- .../persistence/pagemem/PageMemoryImpl.java | 8 +++- .../db/CheckpointBufferDeadlockTest.java | 41 +++++++++++++---- .../ignite/testframework/GridStringLogger.java | 18 +++++++- .../testsuites/IgniteCacheTestSuite7.java | 48 ++++++++++++++++++++ 4 files changed, 104 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/0aaaab0d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java index f8f3b57..1524150 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java @@ -1146,8 +1146,14 @@ public class PageMemoryImpl implements PageMemoryEx { boolean locked = rwLock.tryWriteLock(absPtr + PAGE_LOCK_OFFSET, OffheapReadWriteLock.TAG_LOCK_ALWAYS); - if (!locked) + if (!locked) { + // We release the page only once here because this page will be copied sometime later and + // will be released properly then. + if (!pageSingleAcquire) + PageHeader.releasePage(absPtr); + return false; + } try { long tmpRelPtr = PageHeader.tempBufferPointer(absPtr); http://git-wip-us.apache.org/repos/asf/ignite/blob/0aaaab0d/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/CheckpointBufferDeadlockTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/CheckpointBufferDeadlockTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/CheckpointBufferDeadlockTest.java index 2b5a65d..3afafe6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/CheckpointBufferDeadlockTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/CheckpointBufferDeadlockTest.java @@ -38,6 +38,7 @@ import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.failure.StopNodeFailureHandler; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.pagemem.FullPageId; import org.apache.ignite.internal.pagemem.PageIdAllocator; import org.apache.ignite.internal.pagemem.PageIdUtils; @@ -54,8 +55,10 @@ import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; +import org.apache.ignite.testframework.GridStringLogger; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.apache.ignite.testframework.junits.logger.GridTestLog4jLogger; import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.READ; @@ -92,6 +95,9 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { /** Checkpoint threads. */ private int checkpointThreads; + /** String logger. */ + private GridStringLogger strLog; + /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); @@ -112,6 +118,10 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { cfg.setFailureHandler(new StopNodeFailureHandler()); + strLog = new GridStringLogger(false, new GridTestLog4jLogger()); + + cfg.setGridLogger(strLog); + return cfg; } @@ -167,9 +177,13 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { FilePageStoreManager pageStoreMgr = (FilePageStoreManager)ig.context().cache().context().pageStore(); - IgniteCache<Object, Object> singlePartCache = ig.getOrCreateCache(new CacheConfiguration<>() - .setName("single-part") - .setAffinity(new RendezvousAffinityFunction(false, 1))); + final String cacheName = "single-part"; + + CacheConfiguration<Object, Object> cacheCfg = new CacheConfiguration<>() + .setName(cacheName) + .setAffinity(new RendezvousAffinityFunction(false, 1)); + + IgniteCache<Object, Object> singlePartCache = ig.getOrCreateCache(cacheCfg); db.enableCheckpoints(false).get(); @@ -191,7 +205,7 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { AtomicBoolean fail = new AtomicBoolean(false); - GridTestUtils.runMultiThreadedAsync(new Runnable() { + IgniteInternalFuture<Long> fut = GridTestUtils.runMultiThreadedAsync(new Runnable() { @Override public void run() { int loops = 0; @@ -204,7 +218,7 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { try { Set<FullPageId> pickedPagesSet = new HashSet<>(); - PageStore store = pageStoreMgr.getStore(CU.cacheId("single-part"), 0); + PageStore store = pageStoreMgr.getStore(CU.cacheId(cacheName), 0); int pages = store.pages(); @@ -218,7 +232,7 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { long pageId = PageIdUtils.pageId(0, PageIdAllocator.FLAG_DATA, pageIdx); - pickedPagesSet.add(new FullPageId(pageId, CU.cacheId("single-part"))); + pickedPagesSet.add(new FullPageId(pageId, CU.cacheId(cacheName))); } List<FullPageId> pickedPages = new ArrayList<>(pickedPagesSet); @@ -233,7 +247,7 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { return cmp; return Long.compare(PageIdUtils.effectivePageId(o1.pageId()), - PageIdUtils.effectivePageId(o2.pageId())); + PageIdUtils.effectivePageId(o2.pageId())); } }); @@ -253,7 +267,7 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { } // Emulate writes to trigger throttling. - for (int i = PAGES_TOUCHED_UNDER_CP_LOCK / 2; i < PAGES_TOUCHED_UNDER_CP_LOCK; i++) { + for (int i = PAGES_TOUCHED_UNDER_CP_LOCK / 2; i < PAGES_TOUCHED_UNDER_CP_LOCK && !stop.get(); i++) { FullPageId fpid = pickedPages.get(i); long page = pageMem.acquirePage(fpid.groupId(), fpid.pageId()); @@ -298,6 +312,17 @@ public class CheckpointBufferDeadlockTest extends GridCommonAbstractTest { assertFalse(fail.get()); forceCheckpoint(); // Previous checkpoint should eventually finish. + + stop.set(true); + + fut.get(); + + db.enableCheckpoints(true).get(); + + //check that there is no problem with pinned pages + ig.destroyCache(cacheName); + + assertFalse(strLog.toString().contains("AssertionError")); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/0aaaab0d/modules/core/src/test/java/org/apache/ignite/testframework/GridStringLogger.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridStringLogger.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridStringLogger.java index 16bdaf7..9056dd6 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridStringLogger.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridStringLogger.java @@ -17,8 +17,11 @@ package org.apache.ignite.testframework; +import java.io.PrintWriter; +import java.io.StringWriter; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -131,7 +134,18 @@ public class GridStringLogger implements IgniteLogger { log(msg); if (e != null) - log(e.toString()); + logThrowable(e); + } + + /** + * @param e Exception. + */ + private void logThrowable(@NotNull Throwable e) { + StringWriter writer = new StringWriter(); + + e.printStackTrace(new PrintWriter(writer)); + + log(writer.toString()); } /** {@inheritDoc} */ @@ -144,7 +158,7 @@ public class GridStringLogger implements IgniteLogger { log(msg); if (e != null) - log(e.toString()); + logThrowable(e); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/0aaaab0d/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java new file mode 100755 index 0000000..dbd455a --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.Set; +import junit.framework.TestSuite; +import org.apache.ignite.internal.processors.cache.persistence.db.CheckpointBufferDeadlockTest; + +/** + * Test suite. + */ +public class IgniteCacheTestSuite7 extends TestSuite { + /** + * @return IgniteCache test suite. + * @throws Exception Thrown in case of the failure. + */ + public static TestSuite suite() throws Exception { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + * @throws Exception Thrown in case of the failure. + */ + public static TestSuite suite(Set<Class> ignoredTests) throws Exception { + TestSuite suite = new TestSuite("IgniteCache Test Suite part 7"); + + suite.addTestSuite(CheckpointBufferDeadlockTest.class); + + return suite; + } +}