From 241f478ce66ca38f32536b91e822c1173752eed8 Mon Sep 17 00:00:00 2001 From: Dmitry Konstantinov Date: Wed, 3 Dec 2025 10:52:28 +0000 Subject: [PATCH] Fix flaky ThreadLocalMeterTest by disabling background triggering of ThreadLocalMeter#tickAll within the test case Patch by Dmitry Konstantinov; reviewed by Brandon Williams, Stefan Miklosovic for CASSANDRA-21056 --- .../cassandra/metrics/ThreadLocalMeter.java | 15 ++++++++++++++- .../cassandra/metrics/ThreadLocalMeterTest.java | 8 ++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/metrics/ThreadLocalMeter.java b/src/java/org/apache/cassandra/metrics/ThreadLocalMeter.java index 2af9daf47c..3a20504e85 100644 --- a/src/java/org/apache/cassandra/metrics/ThreadLocalMeter.java +++ b/src/java/org/apache/cassandra/metrics/ThreadLocalMeter.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -92,9 +93,21 @@ public class ThreadLocalMeter extends com.codahale.metrics.Meter implements Mete maxTicks = m3Ticks; } + private static final ScheduledFuture backgroundTickingJob; + + /** + * the method is provided for test purposes only, + * to disable background activities and make tests more deterministic + */ + @VisibleForTesting + static void disableBackgroundTicking() + { + backgroundTickingJob.cancel(true); + } + static { - ScheduledExecutors.scheduledTasks.scheduleWithFixedDelay(ThreadLocalMeter::tickAll, + backgroundTickingJob = ScheduledExecutors.scheduledTasks.scheduleWithFixedDelay(ThreadLocalMeter::tickAll, BACKGROUND_TICK_INTERVAL_SEC, BACKGROUND_TICK_INTERVAL_SEC, TimeUnit.SECONDS); diff --git a/test/unit/org/apache/cassandra/metrics/ThreadLocalMeterTest.java b/test/unit/org/apache/cassandra/metrics/ThreadLocalMeterTest.java index 8a467c3d6b..e81ee7daef 100644 --- a/test/unit/org/apache/cassandra/metrics/ThreadLocalMeterTest.java +++ b/test/unit/org/apache/cassandra/metrics/ThreadLocalMeterTest.java @@ -24,6 +24,7 @@ import java.util.Random; import java.util.concurrent.TimeUnit; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import com.codahale.metrics.Clock; @@ -37,6 +38,13 @@ import static org.junit.Assert.assertEquals; public class ThreadLocalMeterTest { + + @Before + public void before() + { + ThreadLocalMeter.disableBackgroundTicking(); + } + @Test public void checkNoMark() {