From 2924762fa1c29c3658507225e9e5e00853ec58e6 Mon Sep 17 00:00:00 2001 From: Alex Petrov Date: Tue, 30 Jan 2024 11:29:09 +0100 Subject: [PATCH] LocalLog: Cancel signal when unused Patch by Alex Petrov; reviewed by Marcus Eriksson and Sam Tunnicliffe for CASSANDRA-19353. --- src/java/org/apache/cassandra/tcm/log/LocalLog.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/tcm/log/LocalLog.java b/src/java/org/apache/cassandra/tcm/log/LocalLog.java index bb878f5b12b2..cf7e38387764 100644 --- a/src/java/org/apache/cassandra/tcm/log/LocalLog.java +++ b/src/java/org/apache/cassandra/tcm/log/LocalLog.java @@ -750,20 +750,24 @@ private AsyncRunnable() public void run(Interruptible.State state) throws InterruptedException { + WaitQueue.Signal signal = null; try { if (state != Interruptible.State.SHUTTING_DOWN) { Condition condition = subscriber.getAndSet(null); // Grab a ticket ahead of time, so that we can't get into race with the exit from process pending - WaitQueue.Signal signal = logNotifier.register(); + signal = logNotifier.register(); processPendingInternal(); if (condition != null) condition.signalAll(); // if no new threads have subscribed since we started running, await // otherwise, run again to process whatever work they may be waiting on if (subscriber.get() == null) + { signal.await(); + signal = null; + } } } catch (StopProcessingException t) @@ -780,6 +784,12 @@ public void run(Interruptible.State state) throws InterruptedException // TODO handle properly logger.warn("Error in log follower", t); } + finally + { + // If signal was not consumed for some reason, cancel it + if (signal != null) + signal.cancel(); + } } }