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

namelchev 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 7d90bd72f05 IGNITE-20602 Fixed cache scan command page size to meet 
the limit argument (#10989)
7d90bd72f05 is described below

commit 7d90bd72f053842009c7fd86152befafa40556ea
Author: Nikita Amelchev <[email protected]>
AuthorDate: Wed Oct 11 21:32:02 2023 +0300

    IGNITE-20602 Fixed cache scan command page size to meet the limit argument 
(#10989)
---
 .../util/GridCommandHandlerClusterByClassTest.java | 27 ++++++++++++++++++++++
 .../internal/management/cache/CacheScanTask.java   | 27 +++++++++++++++++-----
 2 files changed, 48 insertions(+), 6 deletions(-)

diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClusterByClassTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClusterByClassTest.java
index 13da56ba9ec..6016dcabaa2 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClusterByClassTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClusterByClassTest.java
@@ -41,6 +41,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
 import java.util.function.Function;
+import java.util.function.LongSupplier;
 import java.util.logging.Formatter;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
@@ -100,6 +101,7 @@ import 
org.apache.ignite.testframework.junits.WithSystemProperty;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionRollbackException;
 import org.apache.ignite.transactions.TransactionState;
+import org.apache.maven.surefire.shared.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Assume;
 import org.junit.Test;
@@ -1654,6 +1656,31 @@ public class GridCommandHandlerClusterByClassTest 
extends GridCommandHandlerClus
         assertNotContains(log, testOut.toString(), "Result limited");
     }
 
+    /** */
+    @Test
+    public void testCacheScanLimit() {
+        injectTestSystemOut();
+
+        IgniteCache<Integer, Object> c = crd.createCache(new 
CacheConfiguration<Integer, Object>("testCache")
+            .setStatisticsEnabled(true));
+
+        for (int i = 0; i < 1000; i++)
+            c.put(i, false);
+
+        LongSupplier reads = () -> G.allGrids().stream().mapToLong(srv -> 
srv.cache(c.getName())
+            .metrics(srv.cluster().forLocal()).getCacheGets()).sum();
+
+        long before = reads.getAsLong();
+
+        int limit = 5;
+
+        assertEquals(EXIT_CODE_OK, execute("--cache", SCAN, "testCache", 
"--limit", String.valueOf(limit)));
+
+        assertTrue(reads.getAsLong() - before < limit * 3);
+        assertEquals(limit, StringUtils.countMatches(testOut.toString(), 
Integer.class.getName()));
+        assertContains(log, testOut.toString(), "Result limited");
+    }
+
     /** */
     @Test
     public void testCacheConfigNoOutputFormat() {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheScanTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheScanTask.java
index 06f36e5e97d..92a37f163f1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheScanTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheScanTask.java
@@ -19,11 +19,15 @@ package org.apache.ignite.internal.management.cache;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
 import javax.cache.Cache;
+import org.apache.ignite.IgniteCache;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.binary.BinaryType;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.internal.binary.BinaryObjectEx;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.processors.task.GridVisorManagementTask;
@@ -34,6 +38,9 @@ import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
 
+import static java.lang.Math.min;
+import static org.apache.ignite.cache.query.Query.DFLT_PAGE_SIZE;
+
 /**
  * Task that scan cache entries.
  */
@@ -73,18 +80,26 @@ public class CacheScanTask extends 
VisorOneNodeTask<CacheScanCommandArg, CacheSc
             if (arg.limit() <= 0)
                 throw new IllegalStateException("Invalid limit value.");
 
+            IgniteCache<Object, Object> cache = 
ignite.cache(arg.cacheName()).withKeepBinary();
+
             List<String> titles = Arrays.asList("Key Class", "Key", "Value 
Class", "Value");
 
             int cnt = 0;
             List<List<?>> entries = new ArrayList<>();
 
-            for (Cache.Entry<?, ?> entry : 
ignite.cache(arg.cacheName()).withKeepBinary()) {
-                Object k = entry.getKey();
-                Object v = entry.getValue();
-                entries.add(Arrays.asList(typeOf(k), valueOf(k), typeOf(v), 
valueOf(v)));
+            ScanQuery<Object, Object> scanQry = new 
ScanQuery<>().setPageSize(min(arg.limit(), DFLT_PAGE_SIZE));
+
+            try (QueryCursor<Cache.Entry<Object, Object>> qry = 
cache.query(scanQry)) {
+                Iterator<Cache.Entry<Object, Object>> iter = qry.iterator();
 
-                if (++cnt >= arg.limit())
-                    break;
+                while (cnt++ < arg.limit() && iter.hasNext()) {
+                    Cache.Entry<Object, Object> next = iter.next();
+
+                    Object k = next.getKey();
+                    Object v = next.getValue();
+
+                    entries.add(Arrays.asList(typeOf(k), valueOf(k), 
typeOf(v), valueOf(v)));
+                }
             }
 
             return new CacheScanTaskResult(titles, entries);

Reply via email to