You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2023/08/04 06:40:30 UTC

[ignite] branch master updated: IGNITE-19904 Fix assertion on defragmentation - Fixes #10866.

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

alexpl 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 c1b1aa413fc IGNITE-19904 Fix assertion on defragmentation - Fixes #10866.
c1b1aa413fc is described below

commit c1b1aa413fcb81216c93c0596117fe9f1a4098b7
Author: Vladimir Steshin <vl...@gmail.com>
AuthorDate: Fri Aug 4 09:08:15 2023 +0300

    IGNITE-19904 Fix assertion on defragmentation - Fixes #10866.
    
    Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
 .../persistence/GridCacheDatabaseSharedManager.java  |  8 +++++++-
 .../CachePartitionDefragmentationManager.java        | 20 +++++++++++++++++---
 .../cache/persistence/pagemem/PageHeader.java        |  2 +-
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
index 7dabf06c8dd..aeee241b98f 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
@@ -1203,6 +1203,10 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
             chpBufSize = cacheSize;
         }
 
+        // TODO IGNITE-20138 : Should be actual checkpoint lock checker, related to the checkpointer for this data
+        // region. Like LightweightCheckpointManager#checkpointer for the defragmentation.
+        CheckpointLockStateChecker chpLockChecker = this;
+
         PageMemoryImpl pageMem = new PageMemoryImpl(
             wrapMetricsPersistentMemoryProvider(memProvider, regMetrics),
             calculateFragmentSizes(
@@ -1220,10 +1224,12 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
                 // Write page to disk.
                 pageMgr.write(fullId.groupId(), fullId.pageId(), pageBuf, tag, true);
 
+                // TODO IGNITE-20138 : Should be actual checkpointer, related to this data rageion. Like
+                // LightweightCheckpointManager#checkpointer for the defragmentation.
                 getCheckpointer().currentProgress().updateEvictedPages(1);
             },
             trackable,
-            this,
+            chpLockChecker,
             regMetrics,
             regCfg,
             resolveThrottlingPolicy(),
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/defragmentation/CachePartitionDefragmentationManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/defragmentation/CachePartitionDefragmentationManager.java
index 70de48d2aaf..00c680d3bcb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/defragmentation/CachePartitionDefragmentationManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/defragmentation/CachePartitionDefragmentationManager.java
@@ -54,6 +54,7 @@ import org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapM
 import org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager.GridCacheDataStore;
 import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointManager;
 import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointTimeoutLock;
+import org.apache.ignite.internal.processors.cache.persistence.checkpoint.Checkpointer;
 import org.apache.ignite.internal.processors.cache.persistence.checkpoint.LightweightCheckpointManager;
 import org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager;
 import org.apache.ignite.internal.processors.cache.persistence.file.FileVersionCheckingFactory;
@@ -209,10 +210,12 @@ public class CachePartitionDefragmentationManager {
             new LinkedBlockingQueue<>()
         );
 
-        completionFut.listen(future -> {
+        completionFut.chain(future -> {
             linkMapByPart.values().forEach(LinkMap::close);
 
             linkMapByPart.clear();
+
+            return future.result();
         });
     }
 
@@ -225,6 +228,19 @@ public class CachePartitionDefragmentationManager {
 
         nodeCheckpoint.forceCheckpoint("beforeDefragmentation", null).futureFor(FINISHED).get();
 
+        // The concurrent default checkpointer has various listeners, interferes with new dedicated
+        // CacheGroupContext for defragmentation and at least clears shared CheckpointProgress#clearCounters().
+        // Should be properly reconfigured and restarted after the defragmentation task to have ability launch
+        // other maintenance tasks after.
+        Checkpointer defaultCheckpointer = nodeCheckpoint.getCheckpointer();
+
+        if (defaultCheckpointer != null && !defaultCheckpointer.isDone()) {
+            if (log.isDebugEnabled())
+                log.debug("Stopping default checkpointer.");
+
+            defaultCheckpointer.shutdownNow();
+        }
+
         dbMgr.preserveWalTailPointer();
 
         sharedCtx.wal().onDeActivate(sharedCtx.kernalContext());
@@ -322,8 +338,6 @@ public class CachePartitionDefragmentationManager {
                             cacheDataStores.put(store.partId(), store);
                     }
 
-                    dbMgr.checkpointedDataRegions().remove(oldGrpCtx.dataRegion());
-
                     // Another cheat. Ttl cleanup manager knows too much shit.
                     oldGrpCtx.caches().stream()
                         .filter(cacheCtx -> cacheCtx.groupId() == grpId)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageHeader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageHeader.java
index 2fcd6bd3087..d424efce7e8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageHeader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageHeader.java
@@ -145,7 +145,7 @@ class PageHeader {
      * @return Number of acquires for the page.
      */
     public static int pinCount(long absPtr) {
-        return GridUnsafe.getIntVolatile(null, absPtr);
+        return GridUnsafe.getIntVolatile(null, absPtr + PAGE_PIN_CNT_OFFSET);
     }
 
     /**