[ 
https://issues.apache.org/jira/browse/IGNITE-24156?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vladislav Pyatkov updated IGNITE-24156:
---------------------------------------
    Description: 
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.

  was:
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.


> Tx states overconsume heap
> --------------------------
>
>                 Key: IGNITE-24156
>                 URL: https://issues.apache.org/jira/browse/IGNITE-24156
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Vladislav Pyatkov
>            Priority: Major
>              Labels: ignite-3
>
> 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)

Reply via email to