[ https://issues.apache.org/jira/browse/GEODE-8827?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17264356#comment-17264356 ]
Barrett Oglesby commented on GEODE-8827: ---------------------------------------- Here is a simpler test that shows a negative bytesOnlyOnDisk after server restart: - start 1 server with persistent partitioned region - load entries - bounce server After the step to bounce the server, the bytesOnlyOnDisk stat is negative. The attached DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_no_eviction.gif chart shows this behavior. > The DiskRegionStats bytesOnlyOnDisk stat is not incremented during persistent > region recovery > --------------------------------------------------------------------------------------------- > > Key: GEODE-8827 > URL: https://issues.apache.org/jira/browse/GEODE-8827 > Project: Geode > Issue Type: Bug > Components: persistence, statistics > Reporter: Barrett Oglesby > Assignee: Barrett Oglesby > Priority: Major > Labels: pull-request-available > Attachments: > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_gets.gif, > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_gets_with_change.gif, > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_restart.gif, > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_restart_with_change.gif, > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_no_eviction.gif > > > With a test like: > - 2 servers with partitioned region configured like: > ** persistence enabled > ** heap eviction with overflow enabled > - load enough entries to cause overflow > - shut down the servers > - restart the servers > - execute a function to get all entries in each server > After the step to restart the servers, the bytesOnlyOnDisk stat is 0. > After the step to get all entries, the bytesOnlyOnDisk stat is negative. > The entriesInVM and entriesOnlyOnDisk stats are incremented as BucketRegions > are recovered from disk in LocalRegion.initializeStats here: > {noformat} > java.lang.Exception: Stack trace > at java.lang.Thread.dumpStack(Thread.java:1333) > at > org.apache.geode.internal.cache.LocalRegion.initializeStats(LocalRegion.java:10222) > at > org.apache.geode.internal.cache.BucketRegion.initializeStats(BucketRegion.java:2163) > at > org.apache.geode.internal.cache.AbstractDiskRegion.copyExistingRegionMap(AbstractDiskRegion.java:775) > at > org.apache.geode.internal.cache.DiskStoreImpl.initializeOwner(DiskStoreImpl.java:631) > at > org.apache.geode.internal.cache.DiskRegion.initializeOwner(DiskRegion.java:239) > at > org.apache.geode.internal.cache.DistributedRegion.initialize(DistributedRegion.java:1081) > at > org.apache.geode.internal.cache.BucketRegion.initialize(BucketRegion.java:262) > at > org.apache.geode.internal.cache.LocalRegion.createSubregion(LocalRegion.java:981) > at > org.apache.geode.internal.cache.PartitionedRegionDataStore.createBucketRegion(PartitionedRegionDataStore.java:785) > at > org.apache.geode.internal.cache.PartitionedRegionDataStore.grabFreeBucket(PartitionedRegionDataStore.java:460) > at > org.apache.geode.internal.cache.PartitionedRegionDataStore.grabFreeBucketRecursively(PartitionedRegionDataStore.java:319) > at > org.apache.geode.internal.cache.PartitionedRegionDataStore.grabBucket(PartitionedRegionDataStore.java:2896) > at > org.apache.geode.internal.cache.ProxyBucketRegion.recoverFromDisk(ProxyBucketRegion.java:441) > at > org.apache.geode.internal.cache.ProxyBucketRegion.recoverFromDiskRecursively(ProxyBucketRegion.java:407) > at > org.apache.geode.internal.cache.PRHARedundancyProvider$2.run2(PRHARedundancyProvider.java:1640) > at > org.apache.geode.internal.cache.partitioned.RecoveryRunnable.run(RecoveryRunnable.java:60) > at > org.apache.geode.internal.cache.PRHARedundancyProvider$2.run(PRHARedundancyProvider.java:1630) > at java.lang.Thread.run(Thread.java:745) > {noformat} > The current LocalRegion.initializeStats method implementation is: > {noformat} > public void initializeStats(long numEntriesInVM, long numOverflowOnDisk, > long numOverflowBytesOnDisk) { > getDiskRegion().getStats().incNumEntriesInVM(numEntriesInVM); > getDiskRegion().getStats().incNumOverflowOnDisk(numOverflowOnDisk); > } > {noformat} > Even though numOverflowBytesOnDisk is passed into this method, it is ignored > as this logging shows: > {noformat} > [warn 2021/01/12 11:19:11.785 PST <Recovery thread for bucket _B__data_3> > tid=0x49] XXX LocalRegion.initializeStats numOverflowBytesOnDisk=4546560; > bytesOnlyOnDiskFromStats=0 > [warn 2021/01/12 11:19:11.791 PST <Recovery thread for bucket _B__data_9> > tid=0x4f] XXX LocalRegion.initializeStats numOverflowBytesOnDisk=4536320; > bytesOnlyOnDiskFromStats=0 > [warn 2021/01/12 11:19:11.797 PST <Recovery thread for bucket _B__data_6> > tid=0x4c] XXX LocalRegion.initializeStats numOverflowBytesOnDisk=4526080; > bytesOnlyOnDiskFromStats=0 > [warn 2021/01/12 11:19:11.800 PST <Recovery thread for bucket _B__data_2> > tid=0x48] XXX LocalRegion.initializeStats numOverflowBytesOnDisk=4546560; > bytesOnlyOnDiskFromStats=0 > [warn 2021/01/12 11:19:11.801 PST <Recovery thread for bucket _B__data_8> > tid=0x4e] XXX LocalRegion.initializeStats numOverflowBytesOnDisk=4526080; > bytesOnlyOnDiskFromStats=0 > {noformat} > The attached > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_restart.gif chart > shows the behavior after server restart. > The attached DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_gets.gif > chart shows the behavior after the gets. > If I make this change, I see correct behavior: > {noformat} > public void initializeStats(long numEntriesInVM, long numOverflowOnDisk, > long numOverflowBytesOnDisk) { > getDiskRegion().getStats().incNumEntriesInVM(numEntriesInVM); > getDiskRegion().getStats().incNumOverflowOnDisk(numOverflowOnDisk); > -> > getDiskRegion().getStats().incNumOverflowBytesOnDisk(numOverflowBytesOnDisk); > } > {noformat} > The attached > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_restart_with_change.gif > chart shows the behavior with this change after server restart. > The attached > DiskRegionStats_entriesOnlyOnDisk_bytesOnlyOnDisk_after_gets_with_change.gif > chart shows the behavior with this change after the gets. -- This message was sent by Atlassian Jira (v8.3.4#803005)