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

Anthony Baker updated GEODE-9801:
---------------------------------
    Labels:   (was: needsTriage)

> CachePerfStats.replicatedTombstonesSize and nonReplicatedTombstonesSize are 
> not accurate
> ----------------------------------------------------------------------------------------
>
>                 Key: GEODE-9801
>                 URL: https://issues.apache.org/jira/browse/GEODE-9801
>             Project: Geode
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.12.0
>            Reporter: Darrel Schneider
>            Priority: Major
>
> This issue has been around since Geode 1.0.
> CachePerfStats.replicatedTombstonesSize and nonReplicatedTombstonesSize are 
> supposed to help geode users figure out how much memory is being used by 
> tombstones. But because of some over sites in the sizing code they actual 
> amount of memory used by tombstones is significantly higher. Some of the 
> mistakes made:
> 1. A Tombstone is added to a ConcurrentLinkedQueue. This is accounted for as 
> a single objRef. But each add to a ConcurrentLinkedQueue add a Node instance 
> so you have the object header size plus two objRefs.
> 2. The size of the RegionEntry is not accounted for. The size of the key in 
> this entry is but most of the memory used is in the RegionEntry fields 
> itself. And the key, in some cases, is stored inline in primitive fields in 
> the RegionEntry so Tombstone.getSize should not be asking the RegionEntry for 
> its key and then sizing it but should instead just ask the RegionEntry for 
> its memory footprint. It can then figure out if it needs to size any of the 
> objects it references (like the key).
> 3. the Tombstone class it self accounts for all its fields but forgot about 
> its own object header.
> To fix this have the Tombstone class add the following:
> {code:java}
> private static final TOMBSTONE_OVERHEAD = 
> JvmSizeUtils.memoryOverhead(Tombstone.class);
> {code}
> For the Node overhead on ConcurrentLinkedQueue add this:
> {code:java}
> private static final NODE_OVERHEAD = 
> JvmSizeUtils.roundUpSize(JvmSizeUtils.getObjectHeaderSize() + 
> 2*JvmSizeUtils.getReferenceSize());
> {code}
> For RegionEntry add a new "memoryOverhead" method on HashRegionEntry and then 
> implement it  in all the many leaf classes. You can do this by modifying  
> LeafRegionEntry.cpp and running generateRegionEntryClasses.sh. You will want 
> each class to have a private static final field that calls 
> JvmSizeUtils.memoryOverhead(<CLASSNAME>.class) and then decide at runtime if 
> the instance references other objects that should be sized (like key, value, 
> DiskId, etc.).



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to