Skip to content

Commit 04a3d9d

Browse files
CaideyipirobertMileaNi
authored andcommitted
Fix internal procedure deduplication (#18036)
1 parent 3259b32 commit 04a3d9d

3 files changed

Lines changed: 26 additions & 4 deletions

File tree

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,6 @@ public void addInternalProcedure(InternalProcedure interalProcedure) {
298298
if (interalProcedure == null) {
299299
return;
300300
}
301-
interalProcedure.setState(ProcedureState.WAITING_TIMEOUT);
302301
timeoutExecutor.add(interalProcedure);
303302
}
304303

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/TimeoutExecutorThread.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
package org.apache.iotdb.confignode.procedure;
2121

2222
import org.apache.iotdb.confignode.i18n.ProcedureMessages;
23+
import org.apache.iotdb.confignode.procedure.state.ProcedureState;
2324

2425
import org.slf4j.Logger;
2526
import org.slf4j.LoggerFactory;
2627

28+
import java.util.Set;
29+
import java.util.concurrent.ConcurrentHashMap;
2730
import java.util.concurrent.DelayQueue;
2831
import java.util.concurrent.Delayed;
2932
import java.util.concurrent.TimeUnit;
@@ -34,6 +37,7 @@ public class TimeoutExecutorThread<Env> extends StoppableThread {
3437
private static final int DELAY_QUEUE_TIMEOUT = 20;
3538
private final ProcedureExecutor<Env> executor;
3639
private final DelayQueue<ProcedureDelayContainer<Env>> queue = new DelayQueue<>();
40+
private final Set<Procedure<Env>> registeredInternalProcedures = ConcurrentHashMap.newKeySet();
3741

3842
public TimeoutExecutorThread(
3943
ProcedureExecutor<Env> envProcedureExecutor, ThreadGroup threadGroup, String name) {
@@ -44,12 +48,21 @@ public TimeoutExecutorThread(
4448

4549
public void add(Procedure<Env> procedure) {
4650
ProcedureDelayContainer<Env> delayTask = new ProcedureDelayContainer<>(procedure);
51+
if (procedure instanceof InternalProcedure) {
52+
if (!registeredInternalProcedures.add(procedure)) {
53+
return;
54+
}
55+
procedure.setState(ProcedureState.WAITING_TIMEOUT);
56+
}
4757
queue.remove(delayTask);
4858
queue.add(delayTask);
4959
}
5060

5161
public boolean remove(Procedure<Env> procedure) {
52-
return queue.remove(new ProcedureDelayContainer<>(procedure)) || procedure.isFinished();
62+
boolean unregistered =
63+
procedure instanceof InternalProcedure && registeredInternalProcedures.remove(procedure);
64+
boolean removed = queue.remove(new ProcedureDelayContainer<>(procedure));
65+
return unregistered || removed || procedure.isFinished();
5366
}
5467

5568
private ProcedureDelayContainer<Env> takeQuietly() {
@@ -70,12 +83,12 @@ public void run() {
7083
}
7184
Procedure<Env> procedure = delayTask.getProcedure();
7285
if (procedure instanceof InternalProcedure) {
73-
if (procedure.isFinished()) {
86+
if (!registeredInternalProcedures.contains(procedure) || procedure.isFinished()) {
7487
continue;
7588
}
7689
InternalProcedure internal = (InternalProcedure) procedure;
7790
internal.periodicExecute(executor.getEnvironment());
78-
if (!procedure.isFinished()) {
91+
if (!procedure.isFinished() && registeredInternalProcedures.contains(procedure)) {
7992
procedure.updateTimestamp();
8093
queue.add(delayTask);
8194
}

iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/TestProcedureExecutor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,16 @@ public void testInternalProcedureCanBeDeduplicatedAndRemoved() throws Interrupte
127127
Assert.assertFalse(internalProcedure.awaitExecution(300, TimeUnit.MILLISECONDS));
128128
Assert.assertEquals(1, internalProcedure.getExecutionCount());
129129

130+
procExecutor.addInternalProcedure(internalProcedure);
131+
Assert.assertFalse(internalProcedure.awaitExecution(300, TimeUnit.MILLISECONDS));
132+
Assert.assertEquals(1, internalProcedure.getExecutionCount());
133+
134+
Assert.assertTrue(procExecutor.removeInternalProcedure(internalProcedure));
135+
136+
procExecutor.addInternalProcedure(internalProcedure);
137+
Assert.assertTrue(internalProcedure.awaitExecution(30, TimeUnit.SECONDS));
138+
Assert.assertEquals(2, internalProcedure.getExecutionCount());
139+
130140
Assert.assertTrue(procExecutor.removeInternalProcedure(internalProcedure));
131141
}
132142

0 commit comments

Comments
 (0)