You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ti...@apache.org on 2025/04/14 15:47:10 UTC

(ignite) branch master updated: IGNITE-25039 Fix suboptimal expire shift calculation (#11984)

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

timoninmaxim 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 ae9f6396de5 IGNITE-25039 Fix suboptimal expire shift calculation (#11984)
ae9f6396de5 is described below

commit ae9f6396de5caf1f769e484797282e6102118598
Author: Maksim Timonin <ti...@apache.org>
AuthorDate: Mon Apr 14 18:47:04 2025 +0300

    IGNITE-25039 Fix suboptimal expire shift calculation (#11984)
---
 .../GridCommandHandlerIndexRebuildStatusTest.java  |  2 +-
 .../util/GridCommandHandlerIndexingUtils.java      |  2 +-
 .../apache/ignite/util/GridCommandHandlerTest.java |  2 +-
 .../cache/distribution/CacheDistributionTask.java  |  6 +--
 .../FindAndDeleteGarbageInPersistenceClosure.java  |  4 +-
 .../cache/IndexRebuildStatusInfoContainer.java     |  2 +-
 .../cache/VerifyBackupPartitionsTask.java          |  4 +-
 .../dht/topology/GridClientPartitionTopology.java  | 12 +++++-
 .../dht/topology/GridDhtPartitionTopology.java     | 11 ++++-
 .../dht/topology/GridDhtPartitionTopologyImpl.java | 47 +++++++++++++++++-----
 .../dht/topology/PartitionsEvictManager.java       |  2 +-
 .../cache/persistence/GridCacheOffheapManager.java | 25 ++----------
 .../persistence/checkpoint/CheckpointWorkflow.java |  5 +--
 .../CachePartitionLossWithPersistenceTest.java     |  2 +-
 .../cache/query/CacheScanQueryFailoverTest.java    |  2 +-
 .../warmup/LoadAllWarmUpStrategySelfTest.java      |  2 +-
 .../snapshot/IgniteClusterSnapshotMetricsTest.java |  4 +-
 17 files changed, 77 insertions(+), 57 deletions(-)

diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexRebuildStatusTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexRebuildStatusTest.java
index 30718a11503..092e6bf6b38 100644
--- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexRebuildStatusTest.java
+++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexRebuildStatusTest.java
@@ -280,7 +280,7 @@ public class GridCommandHandlerIndexRebuildStatusTest extends GridCommandHandler
     private void checkRebuildStartOutput(String output, int nodeIdx, String grpName, String cacheName) {
         IgniteEx ignite = grid(nodeIdx);
 
-        int locPartsCnt = ignite.context().cache().cache(cacheName).context().topology().localPartitions().size();
+        int locPartsCnt = ignite.context().cache().cache(cacheName).context().topology().localPartitionsNumber();
 
         assertContains(
             log,
diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexingUtils.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexingUtils.java
index cdd0e6181a4..c54f37dffa6 100644
--- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexingUtils.java
+++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerIndexingUtils.java
@@ -263,7 +263,7 @@ public class GridCommandHandlerIndexingUtils {
 
         GridCacheContext<K, V> cacheCtx = internalCache.context();
 
-        GridDhtLocalPartition locPart = cacheCtx.topology().localPartitions().get(partId);
+        GridDhtLocalPartition locPart = cacheCtx.topology().localPartition(partId);
         GridIterator<CacheDataRow> cacheDataGridIter = cacheCtx.group().offheap().partitionIterator(locPart.id());
 
         GridQueryProcessor qryProc = internalCache.context().kernalContext().query();
diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index fd456cd1a59..b6ea6577ea3 100644
--- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -3910,7 +3910,7 @@ public class GridCommandHandlerTest extends GridCommandHandlerClusterPerMethodAb
 
         ig.snapshot().createSnapshot(snpName).get(getTestTimeout());
 
-        int locPartsCnt = ig.cachex(DEFAULT_CACHE_NAME).context().topology().localPartitions().size();
+        int locPartsCnt = ig.cachex(DEFAULT_CACHE_NAME).context().topology().localPartitionsNumber();
 
         ig.destroyCache(DEFAULT_CACHE_NAME);
         awaitPartitionMapExchange();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/distribution/CacheDistributionTask.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/distribution/CacheDistributionTask.java
index 03cc7430289..3b3772a847f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/distribution/CacheDistributionTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/distribution/CacheDistributionTask.java
@@ -140,11 +140,7 @@ public class CacheDistributionTask extends VisorMultiNodeTask<CacheDistributionC
 
                     final AffinityAssignment assignment = grpCtx.affinity().readyAffinity(top.readyTopologyVersion());
 
-                    List<GridDhtLocalPartition> locParts = top.localPartitions();
-
-                    for (int i = 0; i < locParts.size(); i++) {
-                        GridDhtLocalPartition part = locParts.get(i);
-
+                    for (GridDhtLocalPartition part: top.currentLocalPartitions()) {
                         if (part == null)
                             continue;
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/FindAndDeleteGarbageInPersistenceClosure.java b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/FindAndDeleteGarbageInPersistenceClosure.java
index e648ef6f03b..7d5430fdc27 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/FindAndDeleteGarbageInPersistenceClosure.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/FindAndDeleteGarbageInPersistenceClosure.java
@@ -197,9 +197,7 @@ public class FindAndDeleteGarbageInPersistenceClosure implements IgniteCallable<
         for (Integer grpId : grpIds) {
             CacheGroupContext grpCtx = ignite.context().cache().cacheGroup(grpId);
 
-            List<GridDhtLocalPartition> parts = grpCtx.topology().localPartitions();
-
-            for (GridDhtLocalPartition part : parts)
+            for (GridDhtLocalPartition part : grpCtx.topology().currentLocalPartitions())
                 partArgs.add(new T2<>(grpCtx, part));
         }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/IndexRebuildStatusInfoContainer.java b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/IndexRebuildStatusInfoContainer.java
index a88f316e819..43fe6e8eedf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/IndexRebuildStatusInfoContainer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/IndexRebuildStatusInfoContainer.java
@@ -65,7 +65,7 @@ public class IndexRebuildStatusInfoContainer extends IgniteDataTransferObject {
         groupName = cfg.getGroupName() == null ? EMPTY_GROUP_NAME : cfg.getGroupName();
         cacheName = cfg.getName();
         indexBuildPartitionsLeftCount = cctx.cache().metrics0().getIndexBuildPartitionsLeftCount();
-        totalPartitionsCount = cctx.topology().localPartitions().size();
+        totalPartitionsCount = cctx.topology().localPartitionsNumber();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/VerifyBackupPartitionsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/VerifyBackupPartitionsTask.java
index a67cce7c36f..2fe0378fa5d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/VerifyBackupPartitionsTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/VerifyBackupPartitionsTask.java
@@ -345,11 +345,9 @@ public class VerifyBackupPartitionsTask extends ComputeTaskAdapter<CacheIdleVeri
                 if (grpCtx == null)
                     continue;
 
-                List<GridDhtLocalPartition> parts = grpCtx.topology().localPartitions();
-
                 ForkJoinPool pool = poolSupplier.get();
 
-                for (GridDhtLocalPartition part : parts)
+                for (GridDhtLocalPartition part : grpCtx.topology().currentLocalPartitions())
                     partHashCalcFutures.add(calculatePartitionHashAsync(pool, grpCtx, part, this::isCancelled));
             }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridClientPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridClientPartitionTopology.java
index 6adbb53a692..c71b9c3d163 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridClientPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridClientPartitionTopology.java
@@ -489,7 +489,17 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
     }
 
     /** {@inheritDoc} */
-    @Override public Collection<GridDhtLocalPartition> currentLocalPartitions() {
+    @Override public int localPartitionsNumber() {
+        return 0;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Iterable<GridDhtLocalPartition> currentLocalPartitions() {
+        return Collections.emptyList();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Iterable<GridDhtLocalPartition> shiftedCurrentLocalPartitions() {
         return Collections.emptyList();
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopology.java
index 6071a7cc917..8efc3ee8ebb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopology.java
@@ -202,11 +202,20 @@ public interface GridDhtPartitionTopology {
     public List<GridDhtLocalPartition> localPartitions();
 
     /**
-     *
+     * @return Number of active local partitions.
+     */
+    public int localPartitionsNumber();
+
+    /**
      * @return All current active local partitions.
      */
     public Iterable<GridDhtLocalPartition> currentLocalPartitions();
 
+    /**
+     * @return All current active local partitions shifted by random index to reduce contention.
+     */
+    public Iterable<GridDhtLocalPartition> shiftedCurrentLocalPartitions();
+
     /**
      * @return Local IDs.
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java
index 009572b0e6f..c8c4ebd5c02 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java
@@ -29,6 +29,7 @@ import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.stream.Collectors;
 import org.apache.ignite.IgniteCheckedException;
@@ -1079,11 +1080,34 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
         return list;
     }
 
+    /** {@inheritDoc} */
+    @Override public int localPartitionsNumber() {
+        int num = 0;
+
+        for (int i = 0; i < locParts.length(); i++) {
+            GridDhtLocalPartition part = locParts.get(i);
+
+            if (part != null && part.state().active())
+                num++;
+        }
+
+        return num;
+    }
+
     /** {@inheritDoc} */
     @Override public Iterable<GridDhtLocalPartition> currentLocalPartitions() {
-        return new Iterable<GridDhtLocalPartition>() {
+        return new Iterable<>() {
             @Override public Iterator<GridDhtLocalPartition> iterator() {
-                return new CurrentPartitionsIterator();
+                return new CurrentPartitionsIterator(0);
+            }
+        };
+    }
+
+    /** {@inheritDoc} */
+    @Override public Iterable<GridDhtLocalPartition> shiftedCurrentLocalPartitions() {
+        return new Iterable<>() {
+            @Override public Iterator<GridDhtLocalPartition> iterator() {
+                return new CurrentPartitionsIterator(ThreadLocalRandom.current().nextInt(locParts.length()));
             }
         };
     }
@@ -2826,11 +2850,9 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
                 part.clearDeferredDeletes();
 
-                List<GridDhtLocalPartition> parts = localPartitions();
-
                 boolean renting = false;
 
-                for (GridDhtLocalPartition part0 : parts) {
+                for (GridDhtLocalPartition part0 : currentLocalPartitions()) {
                     if (part0.state() == RENTING) {
                         renting = true;
 
@@ -3279,6 +3301,9 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      * Iterator over current local partitions.
      */
     private class CurrentPartitionsIterator implements Iterator<GridDhtLocalPartition> {
+        /** Shift index. */
+        private final int shiftIdx;
+
         /** Next index. */
         private int nextIdx;
 
@@ -3286,9 +3311,11 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
         private GridDhtLocalPartition nextPart;
 
         /**
-         * Constructor
+         * @param shiftIdx Shift start index for {@link #locParts} to reduce partitions contention.
          */
-        private CurrentPartitionsIterator() {
+        private CurrentPartitionsIterator(int shiftIdx) {
+            this.shiftIdx = shiftIdx;
+
             advance();
         }
 
@@ -3296,8 +3323,10 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
          * Try to advance to next partition.
          */
         private void advance() {
-            while (nextIdx < locParts.length()) {
-                GridDhtLocalPartition part = locParts.get(nextIdx);
+            int len = locParts.length();
+
+            while (nextIdx < len) {
+                GridDhtLocalPartition part = locParts.get((shiftIdx + nextIdx) % len);
 
                 if (part != null && part.state().active()) {
                     nextPart = part;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
index 6a718988188..f4e2bb1a24b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
@@ -355,7 +355,7 @@ public class PartitionsEvictManager extends GridCacheSharedManagerAdapter {
                     ", grpId=" + grp.groupId() +
                     ", remainingPartsToEvict=" + (totalTasks.get() - taskInProgress) +
                     ", partsEvictInProgress=" + taskInProgress +
-                    ", totalParts=" + grp.topology().localPartitions().size() + "]");
+                    ", totalParts=" + grp.topology().localPartitionsNumber() + "]");
         }
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
index 5056f063189..28911df7c78 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
@@ -30,7 +30,6 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
-import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Stream;
@@ -1109,29 +1108,13 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
         try {
             int cleared = 0;
 
-            // Use random shift to reduce contention.
-            int shift = ThreadLocalRandom.current().nextInt(F.size(cacheDataStores().iterator()));
+            for (GridDhtLocalPartition part : grp.topology().shiftedCurrentLocalPartitions()) {
+                GridCacheDataStore store = (GridCacheDataStore)part.dataStore();
 
-            int cnt = 0;
-            for (CacheDataStore store : cacheDataStores()) {
-                if (cnt++ < shift) // On the first iteration skip entries before <shift>.
+                if (store.destroyed())
                     continue;
 
-                cleared += ((GridCacheDataStore)store).purgeExpired(cctx, c, unwindThrottlingTimeout, amount - cleared);
-
-                if (amount != -1 && cleared >= amount)
-                    return true;
-            }
-
-            if (shift == 0)
-                return false;
-
-            cnt = 0;
-            for (CacheDataStore store : cacheDataStores()) {
-                if (cnt++ >= shift) // On the second iteration skip entries after <shift>.
-                    break;
-
-                cleared += ((GridCacheDataStore)store).purgeExpired(cctx, c, unwindThrottlingTimeout, amount - cleared);
+                cleared += store.purgeExpired(cctx, c, unwindThrottlingTimeout, amount - cleared);
 
                 if (amount != -1 && cleared >= amount)
                     return true;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointWorkflow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointWorkflow.java
index 9862fa0db03..ef369d24a0b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointWorkflow.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointWorkflow.java
@@ -379,10 +379,7 @@ public class CheckpointWorkflow {
                 continue;
 
             Runnable r = () -> {
-                ArrayList<GridDhtLocalPartition> parts = new ArrayList<>(grp.topology().localPartitions().size());
-
-                for (GridDhtLocalPartition part : grp.topology().currentLocalPartitions())
-                    parts.add(part);
+                List<GridDhtLocalPartition> parts = grp.topology().localPartitions();
 
                 CacheState state = new CacheState(parts.size());
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionLossWithPersistenceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionLossWithPersistenceTest.java
index 6209c057b6a..92e071e5b1e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionLossWithPersistenceTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionLossWithPersistenceTest.java
@@ -208,7 +208,7 @@ public class CachePartitionLossWithPersistenceTest extends GridCommonAbstractTes
 
         final Collection<Integer> lostParts = crd.cache(DEFAULT_CACHE_NAME).lostPartitions();
 
-        assertEquals(PARTS_CNT, cachex.context().topology().localPartitions().size() + lostParts.size());
+        assertEquals(PARTS_CNT, cachex.context().topology().localPartitionsNumber() + lostParts.size());
 
         assertTrue(lostParts.contains(part));
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/CacheScanQueryFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/CacheScanQueryFailoverTest.java
index 06235b6a88e..b8bd6fe3458 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/CacheScanQueryFailoverTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/CacheScanQueryFailoverTest.java
@@ -131,7 +131,7 @@ public class CacheScanQueryFailoverTest extends GridCommonAbstractTest {
             cache2.put(i, i); // Put to partition 1.
 
         Iterator iter1 = cache1.query(new ScanQuery<>().setPageSize(1)).iterator();
-        Iterator iter2 = cache1.query(new ScanQuery<>().setPageSize(1)).iterator();
+        Iterator iter2 = cache2.query(new ScanQuery<>().setPageSize(1)).iterator();
 
         // Iter 1 check case, when cursor is switched to evicted partition.
         iter1.next();
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/warmup/LoadAllWarmUpStrategySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/warmup/LoadAllWarmUpStrategySelfTest.java
index 5495037795a..2a0c1e504e8 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/warmup/LoadAllWarmUpStrategySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/warmup/LoadAllWarmUpStrategySelfTest.java
@@ -232,7 +232,7 @@ public class LoadAllWarmUpStrategySelfTest extends GridCommonAbstractTest {
         return n.context().cache().cacheGroups().stream()
             .filter(grpCtx -> grpCtx.userCache() && grpCtx.persistenceEnabled())
             // Check for exists gap in local partitions.
-            .peek(grpCtx -> assertTrue(grpCtx.topology().localPartitions().size() < grpCtx.topology().partitions()))
+            .peek(grpCtx -> assertTrue(grpCtx.topology().localPartitionsNumber() < grpCtx.topology().partitions()))
             .map(CacheGroupContext::dataRegion)
             .distinct()
             .collect(toMap(region -> region.config().getName(), region -> region.pageMemory().loadedPages()));
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotMetricsTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotMetricsTest.java
index c40ec08f125..e4dcf1c2624 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotMetricsTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotMetricsTest.java
@@ -150,8 +150,8 @@ public class IgniteClusterSnapshotMetricsTest extends IgniteClusterSnapshotResto
 
             assertTrue(nodeNameMsg, GridTestUtils.waitForCondition(() -> getNumMetric("endTime", mReg) > 0, TIMEOUT));
 
-            int expParts = ((IgniteEx)grid).cachex(ccfg1.getName()).context().topology().localPartitions().size() +
-                ((IgniteEx)grid).cachex(ccfg2.getName()).context().topology().localPartitions().size();
+            int expParts = ((IgniteEx)grid).cachex(ccfg1.getName()).context().topology().localPartitionsNumber() +
+                ((IgniteEx)grid).cachex(ccfg2.getName()).context().topology().localPartitionsNumber();
 
             // Cache2 is replicated - the index partition is being copied (on snapshot data nodes).
             if (!emptyNode.name().equals(grid.name()))