Darrel Schneider created GEODE-6890: ---------------------------------------
Summary: 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 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} -- This message was sent by Atlassian JIRA (v7.6.3#76005)