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;
+    }
+}

Reply via email to