You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2020/10/16 19:30:35 UTC

[cassandra] branch trunk updated: use Long.MIN_VALUE in NoSpamLogStatement to avoid missing first message

This is an automated email from the ASF dual-hosted git repository.

brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 0fe07f9  use Long.MIN_VALUE in NoSpamLogStatement to avoid missing first message
0fe07f9 is described below

commit 0fe07f91da20cee0ec948909c0d53c9103cb69e2
Author: Adam Holmberg <ad...@datastax.com>
AuthorDate: Thu Oct 15 16:00:22 2020 -0500

    use Long.MIN_VALUE in NoSpamLogStatement to avoid missing first message
    
    Patch by Adam Holmberg, reviwed by Berenguer Blasi and brandonwilliams
    for CASSANDRA-15996
---
 .../org/apache/cassandra/utils/NoSpamLogger.java   |  3 +-
 .../apache/cassandra/utils/NoSpamLoggerTest.java   | 46 +++++++++++++++++++---
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/src/java/org/apache/cassandra/utils/NoSpamLogger.java b/src/java/org/apache/cassandra/utils/NoSpamLogger.java
index bee8c06..ac9168a 100644
--- a/src/java/org/apache/cassandra/utils/NoSpamLogger.java
+++ b/src/java/org/apache/cassandra/utils/NoSpamLogger.java
@@ -71,6 +71,7 @@ public class NoSpamLogger
 
         public NoSpamLogStatement(String statement, long minIntervalNanos)
         {
+            super(Long.MIN_VALUE);
             this.statement = statement;
             this.minIntervalNanos = minIntervalNanos;
         }
@@ -78,7 +79,7 @@ public class NoSpamLogger
         private boolean shouldLog(long nowNanos)
         {
             long expected = get();
-            return nowNanos - expected >= minIntervalNanos && compareAndSet(expected, nowNanos);
+            return nowNanos >= expected && compareAndSet(expected, nowNanos + minIntervalNanos);
         }
 
         public boolean log(Level l, long nowNanos, Object... objects)
diff --git a/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java b/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java
index fe5d58e..58e6ea0 100644
--- a/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java
+++ b/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java
@@ -157,17 +157,53 @@ public class NoSpamLoggerTest
        assertLoggedSizes(1, 0, 0);
 
        NoSpamLogStatement statement = logger.getStatement("swizzle2{}", 10, TimeUnit.NANOSECONDS);
-       assertFalse(statement.warn(param));
-       //now is 5 so it won't log
-       assertLoggedSizes(1, 0, 0);
+       assertTrue(statement.warn(param)); // since a statement of this key hasn't logged yet
+       assertLoggedSizes(1, 1, 0);
 
        now = 10;
-       assertTrue(statement.warn(param));
+       assertFalse(statement.warn(param)); // we logged it above
        assertLoggedSizes(1, 1, 0);
 
+       now = 15;
+       assertTrue(statement.warn(param)); // First log was at 5, now past the interval
+       assertLoggedSizes(1, 2, 0);
    }
 
-   @Test
+    @Test
+    public void testNegativeNowNanos() throws Exception
+    {
+        now = -6;
+        NoSpamLogger logger = NoSpamLogger.getLogger( mock, 5, TimeUnit.NANOSECONDS);
+
+        assertTrue(logger.info(statement, param));
+        assertFalse(logger.info(statement, param));
+        assertFalse(logger.warn(statement, param));
+        assertFalse(logger.error(statement, param));
+
+        assertLoggedSizes(1, 0, 0);
+
+        now = -2;
+        assertFalse(logger.error(statement, param));
+        assertLoggedSizes(1, 0, 0);
+
+        now = -1;
+        assertTrue(logger.error(statement, param));
+        assertLoggedSizes(1, 0, 1);
+
+        now = 0;
+        assertFalse(logger.error(statement, param));
+        assertLoggedSizes(1, 0, 1);
+
+        now = 3;
+        assertFalse(logger.error(statement, param));
+        assertLoggedSizes(1, 0, 1);
+
+        now = 4;
+        assertTrue(logger.info(statement, param));
+        assertLoggedSizes(2, 0, 1);
+    }
+
+    @Test
    public void testNoSpamLoggerStatementDirect() throws Exception
    {
        NoSpamLogger.NoSpamLogStatement nospam = NoSpamLogger.getStatement( mock, statement, 5, TimeUnit.NANOSECONDS);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org