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);