[ 
https://issues.apache.org/jira/browse/GEODE-8520?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17201095#comment-17201095
 ] 

ASF GitHub Bot commented on GEODE-8520:
---------------------------------------

jinmeiliao commented on a change in pull request #5536:
URL: https://github.com/apache/geode/pull/5536#discussion_r493896136



##########
File path: 
geode-core/src/main/java/org/apache/geode/management/internal/beans/stats/GCStatsMonitor.java
##########
@@ -39,69 +39,71 @@
  * @see org.apache.geode.management.internal.beans.stats.MBeanStatsMonitor
  */
 public class GCStatsMonitor extends MBeanStatsMonitor {
+  // this class uses these volatile variables to make sure reads are reading 
the latest values
+  // it is not using the parent's siteMap which is not volatile to keep the 
stats values.
   private volatile long collections = 0;
   private volatile long collectionTime = 0;
 
-  long getCollections() {
-    return collections;
-  }
-
-  long getCollectionTime() {
-    return collectionTime;
-  }
-
   public GCStatsMonitor(String name) {
     super(name);
   }
 
-  void decreasePrevValues(Map<String, Number> statsMap) {
-    collections -= statsMap.getOrDefault(StatsKey.VM_GC_STATS_COLLECTIONS, 
0).longValue();
-    collectionTime -= 
statsMap.getOrDefault(StatsKey.VM_GC_STATS_COLLECTION_TIME, 0).longValue();
-  }
-
-  void increaseStats(String name, Number value) {
-    if (name.equals(StatsKey.VM_GC_STATS_COLLECTIONS)) {
-      collections += value.longValue();
-      return;
-    }
-
-    if (name.equals(StatsKey.VM_GC_STATS_COLLECTION_TIME)) {
-      collectionTime += value.longValue();
-      return;
+  @Override
+  // this will be called multiple times with different collector's stats
+  public void addStatisticsToMonitor(Statistics stats) {
+    monitor.addListener(this);// if already listener is added this will be a 
no-op
+    monitor.addStatistics(stats);
+
+    // stats map should keep the sum of all the GC stats
+    StatisticDescriptor[] descriptors = stats.getType().getStatistics();
+    for (StatisticDescriptor d : descriptors) {
+      String name = d.getName();
+      Number value = stats.get(d);
+      if (name.equals(StatsKey.VM_GC_STATS_COLLECTIONS)) {
+        collections += value.longValue();
+      } else if (name.equals(StatsKey.VM_GC_STATS_COLLECTION_TIME)) {
+        collectionTime += value.longValue();
+      }
     }
   }
 
   @Override
   public Number getStatistic(String statName) {
     if (statName.equals(StatsKey.VM_GC_STATS_COLLECTIONS)) {
-      return getCollections();
+      return collections;
     }
 
     if (statName.equals(StatsKey.VM_GC_STATS_COLLECTION_TIME)) {
-      return getCollectionTime();
+      return collectionTime;
     }
-
     return 0;
   }
 
   @Override
   public void handleNotification(StatisticsNotification notification) {
-    decreasePrevValues(statsMap);
-
+    // sum up all the count and all the time in the stats included in this 
notification
+    long totalCount = 0;
+    long totalTime = 0;
     for (StatisticId statId : notification) {
       StatisticDescriptor descriptor = statId.getStatisticDescriptor();
       String name = descriptor.getName();
       Number value;
-
       try {
         value = notification.getValue(statId);
       } catch (StatisticNotFoundException e) {
         value = 0;
       }
-
       log(name, value);
-      increaseStats(name, value);
-      statsMap.put(name, value);
+      if (name.equals(StatsKey.VM_GC_STATS_COLLECTIONS)) {
+        totalCount += value.longValue();
+      }
+
+      else if (name.equals(StatsKey.VM_GC_STATS_COLLECTION_TIME)) {
+        totalTime += value.longValue();
+      }
     }
+
+    collections = totalCount;
+    collectionTime = totalTime;
   }

Review comment:
       > > then what would those count/time mean though. It's not right to 
report just a single one of them. It's not right to sum them up either then....
   > 
   > The stats notification stuff is specifically designed to report only 
changes. As a result, old gen and new gen CGs are almost always reported 
independently (unless they both happen to change during a single sample).
   > 
   > I think that's why the old code was doing the weird stuff. It was trying 
to track the previous value for each kind of GC, so that when a new value 
arrived, it could add in just the change in that kind of GC. Decrementing and 
incrementing was a puzzling way to do that, but that was the goal.
   > 
   > Here's a way that seems simpler to me than decrementing/incrementing. I'll 
use collections as an example, but it's the same for collectionTime.
   > 
   > * Create a map that records the latest value for each GC type.
   > * Create a field that records the sum of values for all types. This is 
what gets reported via getCollections()
   > * When a new kind of GC is added via addStatisticsToMonitor()…
   >   
   >   1. Store the initial value for that GC type in the map.
   >   2. Sum the values of all GC types in the map, and store the sum in the 
field.
   > * When a notification arrives…
   >   
   >   1. Store the new value for that GC type in the map.
   >   2. Sum the values of all GC types in the map, and store the sum in the 
field.
   
   Yes, this sounds like a better idea. I will implement it.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> GarbageCollectionCount metric is showing negative values
> --------------------------------------------------------
>
>                 Key: GEODE-8520
>                 URL: https://issues.apache.org/jira/browse/GEODE-8520
>             Project: Geode
>          Issue Type: Bug
>          Components: management
>    Affects Versions: 1.13.0
>            Reporter: Jinmei Liao
>            Priority: Major
>              Labels: GeodeOperationAPI, pull-request-available
>
> sometimes the memberMBean's garbageCollectionCount and garbageCollectionTime 
> metriics are showing negative values.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to