Mikhail Petrov created IGNITE-21399:
---------------------------------------

             Summary: IgniteCache#getAll invoked on transactional cache can 
lead to a node failure with OutOfMemoryError
                 Key: IGNITE-21399
                 URL: https://issues.apache.org/jira/browse/IGNITE-21399
             Project: Ignite
          Issue Type: Bug
            Reporter: Mikhail Petrov


Exception: 

{code:java}
2024-01-18 09:28:07.374 [ERROR][sys-#4371][] Critical system error detected. 
Will be handled accordingly to configured handler 
[hnd=StopNodeOrHaltFailureHandler [tryStop=false, timeout=0, 
super=AbstractFailureHandler [ignoredFailureTypes=UnmodifiableSet 
[SYSTEM_WORKER_BLOCKED, SYSTEM_CRITICAL_OPERATION_TIMEOUT]]], 
failureCtx=FailureContext [type=CRITICAL_ERROR, err=java.lang.OutOfMemoryError]]
java.lang.OutOfMemoryError: null
        at 
java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:214) 
~[?:?]
        at 
java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:206) 
~[?:?]
        at 
java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:173)
 ~[?:?]
        at 
java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538) ~[?:?]
        at java.lang.StringBuilder.append(StringBuilder.java:178) ~[?:?]
        at java.lang.StringBuilder.append(StringBuilder.java:172) ~[?:?]
        at 
java.util.concurrent.ConcurrentHashMap.toString(ConcurrentHashMap.java:1329) 
~[?:?]
        at java.lang.String.valueOf(String.java:2951) ~[?:?]
        at java.lang.StringBuilder.append(StringBuilder.java:172) ~[?:?]
        at 
org.apache.ignite.internal.processors.cache.GridCacheUtils$18.toString(GridCacheUtils.java:646)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at java.lang.String.valueOf(String.java:2951) ~[?:?]
        at 
org.apache.ignite.internal.util.GridStringBuilder.a(GridStringBuilder.java:102) 
~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.tostring.SBLimitedLength.a(SBLimitedLength.java:100)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:910)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl0(GridToStringBuilder.java:1121)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl(GridToStringBuilder.java:1055)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:622)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:561)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.future.GridCompoundFuture.toString(GridCompoundFuture.java:421)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.future.GridCompoundIdentityFuture.toString(GridCompoundIdentityFuture.java:47)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.processors.cache.distributed.dht.CacheDistributedGetFutureAdapter.toString(CacheDistributedGetFutureAdapter.java:377)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture.toString(GridPartitionedGetFuture.java:664)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at java.lang.String.valueOf(String.java:2951) ~[?:?]
        at java.lang.StringBuilder.append(StringBuilder.java:172) ~[?:?]
        at 
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager.dumpLongRunningOperations0(GridCachePartitionExchangeManager.java:2290)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager.dumpLongRunningOperations(GridCachePartitionExchangeManager.java:2439)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager.lambda$null$0(IgniteTxManager.java:398)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:7437)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.processors.closure.GridClosureProcessor$1.body(GridClosureProcessor.java:827)
 ~[ignite-core-14.1.2.jar:14.1.2]
        at 
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125) 
~[ignite-core-14.1.2.jar:14.1.2]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 
~[?:?]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 
~[?:?]
        at java.lang.Thread.run(Thread.java:829) ~[?:?]
2024-01-18 09:28:07.411 [WARN 
][sys-#4371][org.apache.ignite.internal.processors.cache.CacheDiagnosticManager]
 Page locks dump:

{code}

Java version: OpenJDK Runtime Environment 11.0.20+8-LTS

IgniteCache#getAll is called on a transactional cache with a huge number of 
keys (> 1000000). Near node creates a future for this operation and sends 
requests for cache entries to remote nodes.  All received entries are 
accumulated in the near node reducer (CacheDistributedGetFutureAdapter#rdc). If 
the mentioned future is not completed for a long time, long running operation 
detector will dump all pending futures in a log. The result includes mentioned 
reducer and string representation of all received cache entries. 

The `toString` implementation in the reducer just invokes 
ConcurrentHashMap#toString which can result in the OutOfMemoryError if huge 
amount of keys are requested. The OutOfMemoryError in this case does not mean 
that no free heap space is available (see 
https://github.com/openjdk/jdk/blob/d7ca08a5cc64c8d3941493d98423a49b5bc1b922/src/java.base/share/classes/java/lang/AbstractStringBuilder.java#L269)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to