[prev in list] [next in list] [prev in thread] [next in thread]
List: mina-commits
Subject: [mina] branch 2.1.X updated: Applied patch submitted by Dmitrii Novikov
From: elecharny () apache ! org
Date: 2022-01-05 11:10:50
Message-ID: 164138105075.13431.626489123510598645 () gitbox ! apache ! org
[Download RAW message or body]
This is an automated email from the ASF dual-hosted git repository.
elecharny pushed a commit to branch 2.1.X
in repository https://gitbox.apache.org/repos/asf/mina.git
The following commit(s) were added to refs/heads/2.1.X by this push:
new 76714a7 Applied patch submitted by Dmitrii Novikov
76714a7 is described below
commit 76714a77b4aecabf4984b964c83967b1c06d4bb0
Author: emmanuel lecharny <elecharny@apache.org>
AuthorDate: Wed Jan 5 12:10:23 2022 +0100
Applied patch submitted by Dmitrii Novikov
---
.../mina/core/service/AbstractIoService.java | 2 +-
.../mina/core/service/IoServiceStatistics.java | 366 ++++++++++++++++++++-
2 files changed, 353 insertions(+), 15 deletions(-)
diff --git a/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoService.java \
b/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoService.java index \
ab6ccf9..3aad553 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoService.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoService.java
@@ -177,7 +177,7 @@ public abstract class AbstractIoService implements IoService {
private volatile boolean disposed;
- private IoServiceStatistics stats = new IoServiceStatistics(this);
+ private final IoServiceStatistics stats = new IoServiceStatistics(this);
/**
* Constructor for {@link AbstractIoService}. You need to provide a default
diff --git a/mina-core/src/main/java/org/apache/mina/core/service/IoServiceStatistics.java \
b/mina-core/src/main/java/org/apache/mina/core/service/IoServiceStatistics.java index \
64b7fe9..18f2ec0 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/IoServiceStatistics.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/IoServiceStatistics.java
@@ -31,7 +31,7 @@ import java.util.concurrent.locks.ReentrantLock;
*/
public class IoServiceStatistics {
- private IoService service;
+ private final IoService service;
/** The number of bytes read per second */
private double readBytesThroughput;
@@ -89,10 +89,9 @@ public class IoServiceStatistics {
private int scheduledWriteMessages;
- /** The time (in second) between the computation of the service's statistics */
- private final AtomicInteger throughputCalculationInterval = new \
AtomicInteger(3);
-
private final Lock throughputCalculationLock = new ReentrantLock();
+
+ private final Config config = new Config();
/**
* Creates a new IoServiceStatistics instance
@@ -125,6 +124,14 @@ public class IoServiceStatistics {
* occurred.
*/
public final long getLastIoTime() {
+ if (!config.isStatisticsCalcEnabled) {
+ return 0;
+ }
+
+ if (!config.isLastReadTimeCalcEnabled || !config.isLastWriteTimeCalcEnabled) \
{ + return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -138,6 +145,10 @@ public class IoServiceStatistics {
* @return The time in millis when the last read operation occurred.
*/
public final long getLastReadTime() {
+ if (!config.isStatisticsCalcEnabled || !config.isLastReadTimeCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -151,6 +162,10 @@ public class IoServiceStatistics {
* @return The time in millis when the last write operation occurred.
*/
public final long getLastWriteTime() {
+ if (!config.isStatisticsCalcEnabled || !config.isLastWriteTimeCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -164,6 +179,10 @@ public class IoServiceStatistics {
* @return The number of bytes this service has read so far
*/
public final long getReadBytes() {
+ if (!config.isStatisticsCalcEnabled || !config.isReadBytesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -177,6 +196,10 @@ public class IoServiceStatistics {
* @return The number of bytes this service has written so far
*/
public final long getWrittenBytes() {
+ if (!config.isStatisticsCalcEnabled || !config.isWrittenBytesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -190,6 +213,10 @@ public class IoServiceStatistics {
* @return The number of messages this services has read so far
*/
public final long getReadMessages() {
+ if (!config.isStatisticsCalcEnabled || !config.isReadMessagesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -203,6 +230,10 @@ public class IoServiceStatistics {
* @return The number of messages this service has written so far
*/
public final long getWrittenMessages() {
+ if (!config.isStatisticsCalcEnabled || !config.isWrittenMessagesCalcEnabled) \
{ + return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -216,6 +247,10 @@ public class IoServiceStatistics {
* @return The number of read bytes per second.
*/
public final double getReadBytesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !(config.isReadBytesCalcEnabled)) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -230,7 +265,11 @@ public class IoServiceStatistics {
* @return The number of written bytes per second.
*/
public final double getWrittenBytesThroughput() {
- throughputCalculationLock.lock();
+ if (!config.isStatisticsCalcEnabled || !config.isWrittenBytesCalcEnabled) {
+ return 0;
+ }
+
+ throughputCalculationLock.lock();
try {
resetThroughput();
@@ -244,6 +283,10 @@ public class IoServiceStatistics {
* @return The number of read messages per second.
*/
public final double getReadMessagesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !config.isReadMessagesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -258,6 +301,10 @@ public class IoServiceStatistics {
* @return The number of written messages per second.
*/
public final double getWrittenMessagesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !config.isWrittenMessagesCalcEnabled) \
{ + return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -273,6 +320,10 @@ public class IoServiceStatistics {
* been started.
*/
public final double getLargestReadBytesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !config.isReadBytesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -287,6 +338,10 @@ public class IoServiceStatistics {
* has been started.
*/
public final double getLargestWrittenBytesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !config.isWrittenBytesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -301,6 +356,10 @@ public class IoServiceStatistics {
* has been started.
*/
public final double getLargestReadMessagesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !config.isReadMessagesCalcEnabled) {
+ return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -315,6 +374,10 @@ public class IoServiceStatistics {
* service has been started.
*/
public final double getLargestWrittenMessagesThroughput() {
+ if (!config.isStatisticsCalcEnabled || !config.isWrittenMessagesCalcEnabled) \
{ + return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -329,7 +392,7 @@ public class IoServiceStatistics {
* default value is <tt>3</tt> seconds.
*/
public final int getThroughputCalculationInterval() {
- return throughputCalculationInterval.get();
+ return config.getThroughputCalculationInterval();
}
/**
@@ -337,7 +400,7 @@ public class IoServiceStatistics {
* The default value is <tt>3</tt> seconds.
*/
public final long getThroughputCalculationIntervalInMillis() {
- return throughputCalculationInterval.get() * 1000L;
+ return config.getThroughputCalculationIntervalInMillis();
}
/**
@@ -347,11 +410,7 @@ public class IoServiceStatistics {
* @param throughputCalculationInterval The interval between two calculation
*/
public final void setThroughputCalculationInterval(int \
throughputCalculationInterval) {
- if (throughputCalculationInterval < 0) {
- throw new IllegalArgumentException("throughputCalculationInterval: " + \
throughputCalculationInterval);
- }
-
- this.throughputCalculationInterval.set(throughputCalculationInterval);
+ config.setThroughputCalculationInterval(throughputCalculationInterval);
}
/**
@@ -361,6 +420,10 @@ public class IoServiceStatistics {
* The last time a read has occurred
*/
protected final void setLastReadTime(long lastReadTime) {
+ if (!config.isStatisticsCalcEnabled || !config.isLastReadTimeCalcEnabled) {
+ return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -377,6 +440,10 @@ public class IoServiceStatistics {
* The last time a write has occurred
*/
protected final void setLastWriteTime(long lastWriteTime) {
+ if (!config.isStatisticsCalcEnabled || !config.isLastWriteTimeCalcEnabled) {
+ return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -405,13 +472,22 @@ public class IoServiceStatistics {
* @param currentTime The current time
*/
public void updateThroughput(long currentTime) {
+ if (!config.isStatisticsCalcEnabled) {
+ return;
+ }
+
+ long minInterval = config.getThroughputCalculationIntervalInMillis();
+
+ if (minInterval == 0) {
+ return;
+ }
+
throughputCalculationLock.lock();
try {
int interval = (int) (currentTime - lastThroughputCalculationTime);
- long minInterval = getThroughputCalculationIntervalInMillis();
- if ((minInterval == 0) || (interval < minInterval)) {
+ if (interval < minInterval) {
return;
}
@@ -457,6 +533,14 @@ public class IoServiceStatistics {
* The date those bytes were read
*/
public final void increaseReadBytes(long nbBytesRead, long currentTime) {
+ if (!config.isStatisticsCalcEnabled) {
+ return;
+ }
+
+ if (!config.isReadBytesCalcEnabled && !config.isLastReadTimeCalcEnabled) {
+ return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -475,6 +559,14 @@ public class IoServiceStatistics {
* The time the message has been read
*/
public final void increaseReadMessages(long currentTime) {
+ if (!config.isStatisticsCalcEnabled) {
+ return;
+ }
+
+ if (!config.isReadMessagesCalcEnabled && !config.isLastReadTimeCalcEnabled) \
{ + return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -495,6 +587,14 @@ public class IoServiceStatistics {
* The date those bytes were written
*/
public final void increaseWrittenBytes(int nbBytesWritten, long currentTime) {
+ if (!config.isStatisticsCalcEnabled) {
+ return;
+ }
+
+ if (!config.isWrittenBytesCalcEnabled && !config.isLastWriteTimeCalcEnabled) \
{ + return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -513,6 +613,14 @@ public class IoServiceStatistics {
* The date the message were written
*/
public final void increaseWrittenMessages(long currentTime) {
+ if (!config.isStatisticsCalcEnabled) {
+ return;
+ }
+
+ if (!config.isWrittenMessagesCalcEnabled && \
!config.isLastWriteTimeCalcEnabled) { + return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -527,6 +635,10 @@ public class IoServiceStatistics {
* @return The count of bytes scheduled for write.
*/
public final int getScheduledWriteBytes() {
+ if (!config.isStatisticsCalcEnabled || \
!config.isScheduledWriteBytesCalcEnabled) { + return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -542,6 +654,10 @@ public class IoServiceStatistics {
* @param increment The number of added bytes fro write
*/
public final void increaseScheduledWriteBytes(int increment) {
+ if (!config.isStatisticsCalcEnabled || \
!config.isScheduledWriteBytesCalcEnabled) { + return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -555,6 +671,10 @@ public class IoServiceStatistics {
* @return the count of messages scheduled for write.
*/
public final int getScheduledWriteMessages() {
+ if (!config.isStatisticsCalcEnabled || \
!config.isScheduledWriteMessagesCalcEnabled) { + return 0;
+ }
+
throughputCalculationLock.lock();
try {
@@ -568,6 +688,10 @@ public class IoServiceStatistics {
* Increments the count of messages scheduled for write.
*/
public final void increaseScheduledWriteMessages() {
+ if (!config.isStatisticsCalcEnabled || \
!config.isScheduledWriteMessagesCalcEnabled) { + return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -581,6 +705,10 @@ public class IoServiceStatistics {
* Decrements the count of messages scheduled for write.
*/
public final void decreaseScheduledWriteMessages() {
+ if (!config.isStatisticsCalcEnabled || \
!config.isScheduledWriteMessagesCalcEnabled) { + return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -596,6 +724,14 @@ public class IoServiceStatistics {
* @param lastThroughputCalculationTime The time at which throughput counters \
where updated.
*/
protected void setLastThroughputCalculationTime(long \
lastThroughputCalculationTime) { + if (!config.isStatisticsCalcEnabled) {
+ return;
+ }
+
+ if (config.getThroughputCalculationInterval() == 0) {
+ return;
+ }
+
throughputCalculationLock.lock();
try {
@@ -604,4 +740,206 @@ public class IoServiceStatistics {
throughputCalculationLock.unlock();
}
}
+
+ /**
+ * @return The configuration of IoServiceStatistics
+ */
+ public final Config getConfig() {
+ return config;
+ }
+
+ /**
+ * This is a configuration for IoServiceStatistics. It allows configuring which \
statistics should be calculated. + * Disabling statistics calculation improves \
performance as each operation of IoServiceStatistics is blocking. + */
+ public final static class Config {
+ private volatile boolean isReadBytesCalcEnabled = true;
+ private volatile boolean isWrittenBytesCalcEnabled = true;
+ private volatile boolean isReadMessagesCalcEnabled = true;
+ private volatile boolean isWrittenMessagesCalcEnabled = true;
+ private volatile boolean isLastReadTimeCalcEnabled = true;
+ private volatile boolean isLastWriteTimeCalcEnabled = true;
+ private volatile boolean isScheduledWriteBytesCalcEnabled = true;
+ private volatile boolean isScheduledWriteMessagesCalcEnabled = true;
+
+ /** The time (in second) between the computation of the service's statistics \
*/ + private final AtomicInteger throughputCalculationInterval = new \
AtomicInteger(3); +
+ private volatile boolean isStatisticsCalcEnabled = true;
+
+ /**
+ * @return Is IoServiceStatistics calculations enabled
+ */
+ public boolean isStatisticsCalcEnabled() {
+ return isStatisticsCalcEnabled;
+ }
+
+ /**
+ * Enable/disable IoServiceStatistics calculations for all parameters
+ *
+ * @param statisticsCalcEnabled Enabled/disabled boolean value
+ */
+ public void setStatisticsCalcEnabled(boolean statisticsCalcEnabled) {
+ isStatisticsCalcEnabled = statisticsCalcEnabled;
+ }
+
+ /**
+ * @return Is the number of read bytes calculation enabled
+ */
+ public boolean isReadBytesCalcEnabled() {
+ return isReadBytesCalcEnabled;
+ }
+
+ /**
+ * Enable/disable the number of read bytes calculation
+ *
+ * @param readBytesCalcEnabled Enabled/disabled boolean value
+ */
+ public void setReadBytesCalcEnabled(boolean readBytesCalcEnabled) {
+ isReadBytesCalcEnabled = readBytesCalcEnabled;
+ }
+
+ /**
+ * @return Is the number of written bytes calculation enabled
+ */
+ public boolean isWrittenBytesCalcEnabled() {
+ return isWrittenBytesCalcEnabled;
+ }
+
+ /**
+ * Enable/disable the number of written bytes calculation
+ *
+ * @param writtenBytesCalcEnabled Enabled/disabled boolean value
+ */
+ public void setWrittenBytesCalcEnabled(boolean writtenBytesCalcEnabled) {
+ isWrittenBytesCalcEnabled = writtenBytesCalcEnabled;
+ }
+
+ /**
+ * @return Is the number of read messages calculation enabled
+ */
+ public boolean isReadMessagesCalcEnabled() {
+ return isReadMessagesCalcEnabled;
+ }
+
+ /**
+ * Enable/disable the number of read messages calculation
+ *
+ * @param readMessagesCalcEnabled Enabled/disabled boolean value
+ */
+ public void setReadMessagesCalcEnabled(boolean readMessagesCalcEnabled) {
+ isReadMessagesCalcEnabled = readMessagesCalcEnabled;
+ }
+
+ /**
+ * @return Is the number of written messages calculation enabled
+ */
+ public boolean isWrittenMessagesCalcEnabled() {
+ return isWrittenMessagesCalcEnabled;
+ }
+
+ /**
+ * Enable/disable the number of written messages calculation
+ *
+ * @param writtenMessagesCalcEnabled Enabled/disabled boolean value
+ */
+ public void setWrittenMessagesCalcEnabled(boolean \
writtenMessagesCalcEnabled) { + isWrittenMessagesCalcEnabled = \
writtenMessagesCalcEnabled; + }
+
+ /**
+ * @return Is the last read time calculation enabled
+ */
+ public boolean isLastReadTimeCalcEnabled() {
+ return isLastReadTimeCalcEnabled;
+ }
+
+ /**
+ * Enable/disable the last read time calculation
+ *
+ * @param lastReadTimeCalcEnabled Enabled/disabled boolean value
+ */
+ public void setLastReadTimeCalcEnabled(boolean lastReadTimeCalcEnabled) {
+ isLastReadTimeCalcEnabled = lastReadTimeCalcEnabled;
+ }
+
+ /**
+ *
+ * @return Is the last write time calculation enabled
+ */
+ public boolean isLastWriteTimeCalcEnabled() {
+ return isLastWriteTimeCalcEnabled;
+ }
+
+ /**
+ * Enable/disable the last write time calculation
+ *
+ * @param lastWriteTimeCalcEnabled Enabled/disabled boolean value
+ */
+ public void setLastWriteTimeCalcEnabled(boolean lastWriteTimeCalcEnabled) {
+ isLastWriteTimeCalcEnabled = lastWriteTimeCalcEnabled;
+ }
+
+ /**
+ * @return Is scheduled for write the number of bytes calculation enabled
+ */
+ public boolean isScheduledWriteBytesCalcEnabled() {
+ return isScheduledWriteBytesCalcEnabled;
+ }
+
+ /**
+ * Enable/disable scheduled for write the number of bytes calculation
+ *
+ * @param scheduledWriteBytesCalcEnabled Enabled/disabled boolean value
+ */
+ public void setScheduledWriteBytesCalcEnabled(boolean \
scheduledWriteBytesCalcEnabled) { + isScheduledWriteBytesCalcEnabled = \
scheduledWriteBytesCalcEnabled; + }
+
+ /**
+ * @return Is scheduled for write the number of messages calculation enabled
+ */
+ public boolean isScheduledWriteMessagesCalcEnabled() {
+ return isScheduledWriteMessagesCalcEnabled;
+ }
+
+ /**
+ * Enable/disable scheduled for write messages calculation
+ *
+ * @param scheduledWriteMessagesCalcEnabled Enabled/disabled boolean value
+ */
+ public void setScheduledWriteMessagesCalcEnabled(boolean \
scheduledWriteMessagesCalcEnabled) { + isScheduledWriteMessagesCalcEnabled \
= scheduledWriteMessagesCalcEnabled; + }
+
+ /**
+ * @return the interval (seconds) between each throughput calculation. The
+ * default value is <tt>3</tt> seconds.
+ */
+ public int getThroughputCalculationInterval() {
+ return throughputCalculationInterval.get();
+ }
+
+ /**
+ * @return the interval (milliseconds) between each throughput calculation.
+ * The default value is <tt>3</tt> seconds.
+ */
+ public long getThroughputCalculationIntervalInMillis() {
+ return throughputCalculationInterval.get() * 1000L;
+ }
+
+ /**
+ * Sets the interval (seconds) between each throughput calculation. The
+ * default value is <tt>3</tt> seconds.
+ *
+ * @param throughputCalculationInterval The interval between two calculation
+ */
+ public void setThroughputCalculationInterval(int \
throughputCalculationInterval) { + if (throughputCalculationInterval < 0) \
{ + throw new IllegalArgumentException("throughputCalculationInterval: \
" + throughputCalculationInterval); + }
+
+ this.throughputCalculationInterval.set(throughputCalculationInterval);
+ }
+ }
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic