2020package org .apache .iotdb .confignode .procedure ;
2121
2222import org .apache .iotdb .confignode .i18n .ProcedureMessages ;
23+ import org .apache .iotdb .confignode .procedure .state .ProcedureState ;
2324
2425import org .slf4j .Logger ;
2526import org .slf4j .LoggerFactory ;
2627
28+ import java .util .Set ;
29+ import java .util .concurrent .ConcurrentHashMap ;
2730import java .util .concurrent .DelayQueue ;
2831import java .util .concurrent .Delayed ;
2932import 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 }
0 commit comments