Vladislav Pyatkov created IGNITE-24156:
------------------------------------------
Summary: Tx states overconsume heap
Key: IGNITE-24156
URL: https://issues.apache.org/jira/browse/IGNITE-24156
Project: Ignite
Issue Type: Improvement
Reporter: Vladislav Pyatkov
h3. Motivation
I got an OOM exception in a node with 1Gb heap:
{noformat}
Thread '%node_3344%resource-vacuum-executor-0' with ID = 282
java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:48)
java.lang.Long.valueOf(Long.java:1206)
org.apache.ignite.internal.tx.impl.VolatileTxStateMetaStorage.markInitialVacuumObservationTimestamp(VolatileTxStateMetaStorage.java:251)
org.apache.ignite.internal.tx.impl.VolatileTxStateMetaStorage.lambda$vacuum$2(VolatileTxStateMetaStorage.java:167)
org.apache.ignite.internal.tx.impl.VolatileTxStateMetaStorage$$Lambda+0x0000719658bffcf8.apply(Native
method)
java.util.concurrent.ConcurrentHashMap.computeIfPresent(ConcurrentHashMap.java:1828)
org.apache.ignite.internal.tx.impl.VolatileTxStateMetaStorage.lambda$vacuum$3(VolatileTxStateMetaStorage.java:160)
org.apache.ignite.internal.tx.impl.VolatileTxStateMetaStorage$$Lambda+0x0000719658aa8ef0.accept(Native
method)
java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1603)
org.apache.ignite.internal.tx.impl.VolatileTxStateMetaStorage.vacuum(VolatileTxStateMetaStorage.java:159)
org.apache.ignite.internal.tx.impl.TxManagerImpl.vacuum(TxManagerImpl.java:860)
org.apache.ignite.internal.tx.impl.ResourceVacuumManager.vacuumTxnResources(ResourceVacuumManager.java:184)
org.apache.ignite.internal.tx.impl.ResourceVacuumManager$$Lambda+0x0000719658aa7ce8.run(Native
method)
org.apache.ignite.internal.util.IgniteUtils.inBusyLock(IgniteUtils.java:841)
org.apache.ignite.internal.tx.impl.ResourceVacuumManager.runVacuumOperations(ResourceVacuumManager.java:162)
org.apache.ignite.internal.tx.impl.ResourceVacuumManager$$Lambda+0x0000719658aa78a8.run(Native
method)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
java.lang.Thread.runWith(Thread.java:1596)
java.lang.Thread.run(Thread.java:1583)
{noformat}
because the vacuum thread copies all elements in tx state volatile storage and
stores them more than it is needed.
h3. Implementation notes
The possible way to initiate the initial timestamp on creation of the final
state:
{code:java}
public TxStateMeta(
...
this.initialVacuumObservationTimestamp = TxState.isFinalState(txState) ?
FastTimestamps.coarseCurrentTimeMillis() : null;
...
}
{code}
h3. Definition of done
Remove a TS state on a first vacuum path in the case when it stores longer than
needed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)