Denis Chudov created IGNITE-28311:
-------------------------------------
Summary: Massive Integer boxing in index lockers
Key: IGNITE-28311
URL: https://issues.apache.org/jira/browse/IGNITE-28311
Project: Ignite
Issue Type: Bug
Reporter: Denis Chudov
See [1]
It creates Map<Integer, IndexLocker> using index id as a key. There is limited
amount of index ids in the system, but every time plain int value is boxed
causing huge heap allocations (up to 491 MiB per sample in JFR that I examined).
Stack trace:
{code:java}
Stack Trace Count Percentage void java.lang.Thread.run() 1 100 % void
java.lang.Thread.runWith(Object, Runnable) 1 100 % void
java.util.concurrent.ThreadPoolExecutor$Worker.run() 1 100 % void
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
1 100 % void
org.apache.ignite.internal.replicator.ReplicaService$$Lambda.0x0000000800f9c228.run()
1 100 % void
org.apache.ignite.internal.replicator.ReplicaService.lambda$sendToReplicaRaw$6(CompletableFuture,
ErrorReplicaResponse) 1 100 % boolean
java.util.concurrent.CompletableFuture.completeExceptionally(Throwable) 1 100
% void java.util.concurrent.CompletableFuture.postComplete() 1 100 %
CompletableFuture java.util.concurrent.CompletableFuture$UniHandle.tryFire(int)
1 100 % boolean java.util.concurrent.CompletableFuture.uniHandle(Object,
BiFunction, CompletableFuture$UniHandle) 1 100 % Object
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl$$Lambda.0x0000000801167068.apply(Object,
Object) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.lambda$trackingInvoke$13(int,
InternalTransaction, int, ReplicaRequest, PendingTxPartitionEnlistment,
BiPredicate, Object, Throwable) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.trackingInvoke(InternalTransaction,
int, Function, boolean, PendingTxPartitionEnlistment, BiPredicate, int) 1
100 % CompletableFuture
org.apache.ignite.internal.replicator.ReplicaService.invoke(String,
ReplicaRequest) 1 100 % CompletableFuture
org.apache.ignite.internal.replicator.ReplicaService.sendToReplica(String,
ReplicaRequest) 1 100 % CompletableFuture
org.apache.ignite.internal.replicator.ReplicaService.sendToReplicaRaw(String,
ReplicaRequest) 1 100 % CompletableFuture
org.apache.ignite.internal.network.MessagingService.invoke(String,
NetworkMessage, long) 1 100 % CompletableFuture
org.apache.ignite.internal.network.wrapper.JumpToExecutorByConsistentIdAfterSend.invoke(String,
ChannelType, NetworkMessage, long) 1 100 % CompletableFuture
org.apache.ignite.internal.network.DefaultMessagingService.invoke(String,
ChannelType, NetworkMessage, long) 1 100 % CompletableFuture
org.apache.ignite.internal.network.DefaultMessagingService.invoke0(InternalClusterNode,
ChannelType, NetworkMessage, long, boolean) 1 100 % void
org.apache.ignite.internal.network.DefaultMessagingService.sendToSelf(NetworkMessage,
Long) 1 100 % void
org.apache.ignite.internal.replicator.ReplicaManager$$Lambda.0x0000000800486c98.onReceived(NetworkMessage,
InternalClusterNode, Long) 1 100 % void
org.apache.ignite.internal.replicator.ReplicaManager.onReplicaMessageReceived(NetworkMessage,
InternalClusterNode, Long) 1 100 % void
org.apache.ignite.internal.replicator.ReplicaManager.handleReplicaRequest(ReplicaRequest,
InternalClusterNode, Long) 1 100 % CompletableFuture
org.apache.ignite.internal.replicator.ZonePartitionReplicaImpl.processRequest(ReplicaRequest,
UUID) 1 100 % CompletableFuture
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.invoke(ReplicaRequest,
UUID) 1 100 % CompletableFuture
java.util.concurrent.CompletableFuture.thenCompose(Function) 1 100 %
CompletableFuture
java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function) 1
100 % Object
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801058000.apply(Object)
1 100 % CompletionStage
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$invoke$0(ReplicaRequest,
UUID, ReplicaPrimacy) 1 100 % CompletableFuture
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processRequest(ReplicaRequest,
ReplicaPrimacy, UUID) 1 100 % CompletableFuture
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processTableAwareRequest(ReplicaRequest,
ReplicaPrimacy, UUID) 1 100 % CompletableFuture
java.util.concurrent.CompletableFuture.thenCompose(Function) 1 100 %
CompletableFuture
java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function) 1
100 % Object
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801072810.apply(Object)
1 100 % CompletionStage
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$processTableAwareRequest$4(ReplicaRequest,
ReplicaPrimacy, UUID, Void) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.process(ReplicaRequest,
ReplicaPrimacy, UUID) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequestInContext(ReplicaRequest,
ReplicaPrimacy, UUID) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequest(ReplicaRequest,
ReplicaPrimacy) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequestWithTxOperationManagementLogic(ReplicaRequest,
ReplicaPrimacy, HybridTimestamp) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequest(ReplicaRequest,
ReplicaPrimacy, HybridTimestamp) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.appendTxCommand(UUID,
ZonePartitionId, RequestType, boolean, Supplier) 1 100 % Object
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener$$Lambda.0x000000080114b800.get()
1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.lambda$processOperationRequest$10(ReadWriteSingleRowPkReplicaRequest,
ReplicaPrimacy) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processSingleEntryAction(ReadWriteSingleRowPkReplicaRequest,
long) 1 100 % CompletableFuture
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.resolveRowByPk(BinaryTuple,
UUID, IgniteTriFunction) 1 100 % Object
org.apache.ignite.internal.table.TableImpl$$Lambda.0x00000008010250a8.get() 1
100 % Map
org.apache.ignite.internal.table.TableImpl.lambda$indexesLockers$1(int) 1 100
% Integer java.lang.Integer.valueOf(int) 1 100 %{code}
Probably int map should be used, or field type should be changed from plain int
to Integer.
[1]TableImpl#indexesLockers
--
This message was sent by Atlassian Jira
(v8.20.10#820010)