[
https://issues.apache.org/jira/browse/IGNITE-23513?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Sergey Korotkov updated IGNITE-23513:
-------------------------------------
Description:
It's needed to not generate large strings for large arrays.
In worst case not doing so can cause the *java.lang.OutOfMemoryError: Requested
array size exceeds VM limit* errors during the logging of some another
exception. If such an OOM occur the information of real problem will be lost
and not logged.
For example:
{noformat}
[2024-10-24T11:35:44,402][ERROR][client-connector-#149%jdbc_thin_blob_test.JdbcThinBlobTest.test_jdbc_thin_blob.mode.blob.bias.False.blob_size.1073741824.server_heap.12.insert_heap.6.select_heap.6.ignite_version.ignite-dev%][
ClientListenerNioListener] Failed to process client request
[req=JdbcQueryExecuteRequest [schemaName=PUBLIC, pageSize=1024, maxRows=0,
sqlQry=INSERT INTO query(id, blob) VALUES(?, ?), args=Object[] [1, [-29, -127,
20, 60, 106
, 13, -121, -72, 5, 60, -59, 22, -16, 0, 97, 91, -18, -91, -104, 35, -122, -66,
-17, -46, -1, -20, -117, 104, -31, -8, 15, 25, 12, -62, 5, -84, -15, 97, 2, 19,
-85, 106, -35, 37, 68, 108, -56, 25, 6, 63, -95, 37, -74, -33, 8,
24, -38, 52, 67, 111, 48, -46, 48, -100, -31, -105, 15, 123, 86, -48, -86, 7,
-118, 125, -67, -102, 79, 125, 62, -89, -23, 16, 65, -82, -57, 25, 13, 57, 57,
-122, -111, 63, -128, 28, -90, -41, 14, -12, -9, -36, -91... and 10
73741724 more]], stmtType=ANY_STATEMENT_TYPE, autoCommit=true,
partResReq=false, explicitTimeout=false, txId=0, super=JdbcRequest [type=2,
reqId=2]], msg=Requested array size exceeds VM limit]
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.base/java.util.Arrays.copyOf(Arrays.java:3745) ~[?:?]
at
java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:172)
~[?:?]
at
java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538)
~[?:?]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:178)
~[?:?]
at java.base/java.util.Arrays.toString(Arrays.java:4991) ~[?:?]
at
org.apache.ignite.internal.binary.BinaryObjectExImpl.appendValue(BinaryObjectExImpl.java:272)
~[classes/:?]
at
org.apache.ignite.internal.binary.BinaryObjectExImpl.toString(BinaryObjectExImpl.java:237)
~[classes/:?]
at
org.apache.ignite.internal.binary.BinaryObjectExImpl.toString(BinaryObjectExImpl.java:189)
~[classes/:?]
at
org.apache.ignite.internal.binary.BinaryObjectImpl.toString(BinaryObjectImpl.java:1019)
~[classes/:?]
at java.base/java.lang.String.valueOf(String.java:2951) ~[?:?]
at
org.apache.ignite.internal.util.GridStringBuilder.a(GridStringBuilder.java:102)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.SBLimitedLength.a(SBLimitedLength.java:100)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:910)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl0(GridToStringBuilder.java:1121)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl(GridToStringBuilder.java:1055)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:816)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:784)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicSingleUpdateRequest.toString(GridDhtAtomicSingleUpdateRequest.java:495)
~[classes/:?]
at java.base/java.lang.String.valueOf(String.java:2951) ~[?:?]
at
java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
~[?:?]
at
java.base/java.lang.invoke.LambdaForm$MH/0x0000000840282c40.invoke(LambdaForm$MH)
~[?:?]
at
java.base/java.lang.invoke.LambdaForm$MH/0x00000008404c3c40.invoke(LambdaForm$MH)
~[?:?]
at
java.base/java.lang.invoke.Invokers$Holder.linkToTargetMethod(Invokers$Holder)
~[?:?]
at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.send(GridCacheIoManager.java:1245)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture.sendDhtRequests(GridDhtAtomicAbstractUpdateFuture.java:450)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture.map(GridDhtAtomicAbstractUpdateFuture.java:410)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1912)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1680)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.sendSingleRequest(GridNearAtomicAbstractUpdateFuture.java:294)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.map(GridNearAtomicSingleUpdateFuture.java:455)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.mapOnTopology(GridNearAtomicSingleUpdateFuture.java:415)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.map(GridNearAtomicAbstractUpdateFuture.java:243)
~[classes/:?]
{noformat}
was:
It's needed to not generate large strings for large arrays.
In worst case not doing so can cause the OOM errors during the logging of some
another exception. If such an OOM occur the information of real problem will be
lost and not logged.
For example:
{noformat}
[2024-10-24T11:35:44,402][ERROR][client-connector-#149%jdbc_thin_blob_test.JdbcThinBlobTest.test_jdbc_thin_blob.mode.blob.bias.False.blob_size.1073741824.server_heap.12.insert_heap.6.select_heap.6.ignite_version.ignite-dev%][
ClientListenerNioListener] Failed to process client request
[req=JdbcQueryExecuteRequest [schemaName=PUBLIC, pageSize=1024, maxRows=0,
sqlQry=INSERT INTO query(id, blob) VALUES(?, ?), args=Object[] [1, [-29, -127,
20, 60, 106
, 13, -121, -72, 5, 60, -59, 22, -16, 0, 97, 91, -18, -91, -104, 35, -122, -66,
-17, -46, -1, -20, -117, 104, -31, -8, 15, 25, 12, -62, 5, -84, -15, 97, 2, 19,
-85, 106, -35, 37, 68, 108, -56, 25, 6, 63, -95, 37, -74, -33, 8,
24, -38, 52, 67, 111, 48, -46, 48, -100, -31, -105, 15, 123, 86, -48, -86, 7,
-118, 125, -67, -102, 79, 125, 62, -89, -23, 16, 65, -82, -57, 25, 13, 57, 57,
-122, -111, 63, -128, 28, -90, -41, 14, -12, -9, -36, -91... and 10
73741724 more]], stmtType=ANY_STATEMENT_TYPE, autoCommit=true,
partResReq=false, explicitTimeout=false, txId=0, super=JdbcRequest [type=2,
reqId=2]], msg=Requested array size exceeds VM limit]
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.base/java.util.Arrays.copyOf(Arrays.java:3745) ~[?:?]
at
java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:172)
~[?:?]
at
java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538)
~[?:?]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:178)
~[?:?]
at java.base/java.util.Arrays.toString(Arrays.java:4991) ~[?:?]
at
org.apache.ignite.internal.binary.BinaryObjectExImpl.appendValue(BinaryObjectExImpl.java:272)
~[classes/:?]
at
org.apache.ignite.internal.binary.BinaryObjectExImpl.toString(BinaryObjectExImpl.java:237)
~[classes/:?]
at
org.apache.ignite.internal.binary.BinaryObjectExImpl.toString(BinaryObjectExImpl.java:189)
~[classes/:?]
at
org.apache.ignite.internal.binary.BinaryObjectImpl.toString(BinaryObjectImpl.java:1019)
~[classes/:?]
at java.base/java.lang.String.valueOf(String.java:2951) ~[?:?]
at
org.apache.ignite.internal.util.GridStringBuilder.a(GridStringBuilder.java:102)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.SBLimitedLength.a(SBLimitedLength.java:100)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:910)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl0(GridToStringBuilder.java:1121)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl(GridToStringBuilder.java:1055)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:816)
~[classes/:?]
at
org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:784)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicSingleUpdateRequest.toString(GridDhtAtomicSingleUpdateRequest.java:495)
~[classes/:?]
at java.base/java.lang.String.valueOf(String.java:2951) ~[?:?]
at
java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
~[?:?]
at
java.base/java.lang.invoke.LambdaForm$MH/0x0000000840282c40.invoke(LambdaForm$MH)
~[?:?]
at
java.base/java.lang.invoke.LambdaForm$MH/0x00000008404c3c40.invoke(LambdaForm$MH)
~[?:?]
at
java.base/java.lang.invoke.Invokers$Holder.linkToTargetMethod(Invokers$Holder)
~[?:?]
at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.send(GridCacheIoManager.java:1245)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture.sendDhtRequests(GridDhtAtomicAbstractUpdateFuture.java:450)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture.map(GridDhtAtomicAbstractUpdateFuture.java:410)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1912)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1680)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.sendSingleRequest(GridNearAtomicAbstractUpdateFuture.java:294)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.map(GridNearAtomicSingleUpdateFuture.java:455)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.mapOnTopology(GridNearAtomicSingleUpdateFuture.java:415)
~[classes/:?]
at
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.map(GridNearAtomicAbstractUpdateFuture.java:243)
~[classes/:?]
{noformat}
> Use limited string representation for arrays in BinaryObjectExImpl::toString
> ----------------------------------------------------------------------------
>
> Key: IGNITE-23513
> URL: https://issues.apache.org/jira/browse/IGNITE-23513
> Project: Ignite
> Issue Type: Task
> Reporter: Sergey Korotkov
> Priority: Minor
> Time Spent: 10m
> Remaining Estimate: 0h
>
> It's needed to not generate large strings for large arrays.
> In worst case not doing so can cause the *java.lang.OutOfMemoryError:
> Requested array size exceeds VM limit* errors during the logging of some
> another exception. If such an OOM occur the information of real problem will
> be lost and not logged.
> For example:
> {noformat}
> [2024-10-24T11:35:44,402][ERROR][client-connector-#149%jdbc_thin_blob_test.JdbcThinBlobTest.test_jdbc_thin_blob.mode.blob.bias.False.blob_size.1073741824.server_heap.12.insert_heap.6.select_heap.6.ignite_version.ignite-dev%][
> ClientListenerNioListener] Failed to process client request
> [req=JdbcQueryExecuteRequest [schemaName=PUBLIC, pageSize=1024, maxRows=0,
> sqlQry=INSERT INTO query(id, blob) VALUES(?, ?), args=Object[] [1, [-29,
> -127, 20, 60, 106
> , 13, -121, -72, 5, 60, -59, 22, -16, 0, 97, 91, -18, -91, -104, 35, -122,
> -66, -17, -46, -1, -20, -117, 104, -31, -8, 15, 25, 12, -62, 5, -84, -15, 97,
> 2, 19, -85, 106, -35, 37, 68, 108, -56, 25, 6, 63, -95, 37, -74, -33, 8,
> 24, -38, 52, 67, 111, 48, -46, 48, -100, -31, -105, 15, 123, 86, -48, -86,
> 7, -118, 125, -67, -102, 79, 125, 62, -89, -23, 16, 65, -82, -57, 25, 13, 57,
> 57, -122, -111, 63, -128, 28, -90, -41, 14, -12, -9, -36, -91... and 10
> 73741724 more]], stmtType=ANY_STATEMENT_TYPE, autoCommit=true,
> partResReq=false, explicitTimeout=false, txId=0, super=JdbcRequest [type=2,
> reqId=2]], msg=Requested array size exceeds VM limit]
> java.lang.OutOfMemoryError: Requested array size exceeds VM limit
> at java.base/java.util.Arrays.copyOf(Arrays.java:3745) ~[?:?]
> at
> java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:172)
> ~[?:?]
> at
> java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538)
> ~[?:?]
> at java.base/java.lang.StringBuilder.append(StringBuilder.java:178)
> ~[?:?]
> at java.base/java.util.Arrays.toString(Arrays.java:4991) ~[?:?]
> at
> org.apache.ignite.internal.binary.BinaryObjectExImpl.appendValue(BinaryObjectExImpl.java:272)
> ~[classes/:?]
> at
> org.apache.ignite.internal.binary.BinaryObjectExImpl.toString(BinaryObjectExImpl.java:237)
> ~[classes/:?]
> at
> org.apache.ignite.internal.binary.BinaryObjectExImpl.toString(BinaryObjectExImpl.java:189)
> ~[classes/:?]
> at
> org.apache.ignite.internal.binary.BinaryObjectImpl.toString(BinaryObjectImpl.java:1019)
> ~[classes/:?]
> at java.base/java.lang.String.valueOf(String.java:2951) ~[?:?]
> at
> org.apache.ignite.internal.util.GridStringBuilder.a(GridStringBuilder.java:102)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.tostring.SBLimitedLength.a(SBLimitedLength.java:100)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:910)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl0(GridToStringBuilder.java:1121)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.tostring.GridToStringBuilder.toStringImpl(GridToStringBuilder.java:1055)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:816)
> ~[classes/:?]
> at
> org.apache.ignite.internal.util.tostring.GridToStringBuilder.toString(GridToStringBuilder.java:784)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicSingleUpdateRequest.toString(GridDhtAtomicSingleUpdateRequest.java:495)
> ~[classes/:?]
> at java.base/java.lang.String.valueOf(String.java:2951) ~[?:?]
> at
> java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
> ~[?:?]
> at
> java.base/java.lang.invoke.LambdaForm$MH/0x0000000840282c40.invoke(LambdaForm$MH)
> ~[?:?]
> at
> java.base/java.lang.invoke.LambdaForm$MH/0x00000008404c3c40.invoke(LambdaForm$MH)
> ~[?:?]
> at
> java.base/java.lang.invoke.Invokers$Holder.linkToTargetMethod(Invokers$Holder)
> ~[?:?]
> at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.send(GridCacheIoManager.java:1245)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture.sendDhtRequests(GridDhtAtomicAbstractUpdateFuture.java:450)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture.map(GridDhtAtomicAbstractUpdateFuture.java:410)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1912)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1680)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.sendSingleRequest(GridNearAtomicAbstractUpdateFuture.java:294)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.map(GridNearAtomicSingleUpdateFuture.java:455)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.mapOnTopology(GridNearAtomicSingleUpdateFuture.java:415)
> ~[classes/:?]
> at
> org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.map(GridNearAtomicAbstractUpdateFuture.java:243)
> ~[classes/:?]
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)