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

Darrel Schneider updated GEODE-6890:
------------------------------------
    Description: 
The sentMessagesMaxTime stat is calculated by reading the old value. This read 
is an expensive synchronized operation.

The following is a prototype fix that uses a local atomic:

{noformat}
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
index d591e35570..0b5017b857 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
@@ -1035,6 +1035,8 @@ public class DistributionStats implements DMStats {
     return this.stats.getLong(sentMessagesTimeId);
   }
 
+  private final AtomicLong sentMessagesMaxTime = new AtomicLong();
+
   /**
    * Increments the total number of nanoseconds spend sending messages.
    * <p>
@@ -1045,8 +1047,17 @@ public class DistributionStats implements DMStats {
     if (enableClockStats) {
       this.stats.incLong(sentMessagesTimeId, nanos);
       long millis = nanos / 1000000;
-      if (getSentMessagesMaxTime() < millis) {
-        this.stats.setLong(sentMessagesMaxTimeId, millis);
+      boolean done = false;
+      while (!done) {
+        long currentSentMessagesMaxTime = sentMessagesMaxTime.get();
+        if (millis > currentSentMessagesMaxTime) {
+          done = sentMessagesMaxTime.compareAndSet(currentSentMessagesMaxTime, 
millis);
+          if (done) {
+            stats.setLong(sentMessagesMaxTimeId, millis);
+          }
+        } else {
+          done = true;
+        }
       }
     }
   }
{noformat}


  was:
The sentMessagesMaxTime stat is calculated by reading the old value. This read 
is an expensive synchronized operation.

The following is a prototype fix that uses a local atomic:

{noformat}
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
index d591e35570..0b5017b857 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
@@ -1035,6 +1035,8 @@ public class DistributionStats implements DMStats {
     return this.stats.getLong(sentMessagesTimeId);
   }
 
+  private final AtomicLong sentMessagesMaxTime = new AtomicLong();
+
   /**
    * Increments the total number of nanoseconds spend sending messages.
    * <p>
@@ -1045,8 +1047,17 @@ public class DistributionStats implements DMStats {
     if (enableClockStats) {
       this.stats.incLong(sentMessagesTimeId, nanos);
       long millis = nanos / 1000000;
-      if (getSentMessagesMaxTime() < millis) {
-        this.stats.setLong(sentMessagesMaxTimeId, millis);
+      boolean done = false;
+      while (!done) {
+        long currentSentMessagesMaxTime = sentMessagesMaxTime.get();
+        if (millis > currentSentMessagesMaxTime) {
+          done = replyWaitMaxTime.compareAndSet(currentSentMessagesMaxTime, 
millis);
+          if (done) {
+            stats.setLong(sentMessagesMaxTimeId, millis);
+          }
+        } else {
+          done = true;
+        }
       }
     }
   }
{noformat}



> sentMessagesMaxTime stat calculation needs improvement
> ------------------------------------------------------
>
>                 Key: GEODE-6890
>                 URL: https://issues.apache.org/jira/browse/GEODE-6890
>             Project: Geode
>          Issue Type: Improvement
>          Components: statistics
>            Reporter: Darrel Schneider
>            Assignee: Darrel Schneider
>            Priority: Major
>
> The sentMessagesMaxTime stat is calculated by reading the old value. This 
> read is an expensive synchronized operation.
> The following is a prototype fix that uses a local atomic:
> {noformat}
> diff --git 
> a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
>  
> b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
> index d591e35570..0b5017b857 100644
> --- 
> a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
> +++ 
> b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
> @@ -1035,6 +1035,8 @@ public class DistributionStats implements DMStats {
>      return this.stats.getLong(sentMessagesTimeId);
>    }
>  
> +  private final AtomicLong sentMessagesMaxTime = new AtomicLong();
> +
>    /**
>     * Increments the total number of nanoseconds spend sending messages.
>     * <p>
> @@ -1045,8 +1047,17 @@ public class DistributionStats implements DMStats {
>      if (enableClockStats) {
>        this.stats.incLong(sentMessagesTimeId, nanos);
>        long millis = nanos / 1000000;
> -      if (getSentMessagesMaxTime() < millis) {
> -        this.stats.setLong(sentMessagesMaxTimeId, millis);
> +      boolean done = false;
> +      while (!done) {
> +        long currentSentMessagesMaxTime = sentMessagesMaxTime.get();
> +        if (millis > currentSentMessagesMaxTime) {
> +          done = 
> sentMessagesMaxTime.compareAndSet(currentSentMessagesMaxTime, millis);
> +          if (done) {
> +            stats.setLong(sentMessagesMaxTimeId, millis);
> +          }
> +        } else {
> +          done = true;
> +        }
>        }
>      }
>    }
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to