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)

Reply via email to