Skip to content

Commit 38b8969

Browse files
Restore DataNode removal cleanup after child procedure failures (#18947)
Allow STOP_DATA_NODE rollback cleanup under the commit-point guard. Preserve execution retries and verify transient cleanup failures stay retryable.
1 parent 6844c47 commit 38b8969

2 files changed

Lines changed: 14 additions & 13 deletions

File tree

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/node/RemoveDataNodesProcedure.java‎

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -158,19 +158,16 @@ protected Flow executeFromState(ConfigNodeProcedureEnv env, RemoveDataNodeState
158158
return Flow.NO_MORE_STATE;
159159
}
160160
} catch (Exception e) {
161-
if (isRollbackSupported(state)) {
162-
setFailure(new ProcedureException(ProcedureMessages.REMOVE_DATA_NODE_FAILED + state));
161+
// Rollback support permits failure cleanup; transient execution errors still retry here.
162+
LOG.error(
163+
ProcedureMessages.LOG_RETRIEVABLE_ERROR_TRYING_REMOVE_DATA_NODE_ARG_STATE_ARG_4EFEB850,
164+
removedDataNodes,
165+
state,
166+
e);
167+
if (getCycles() > RETRY_THRESHOLD) {
168+
setFailure(new ProcedureException(ProcedureMessages.STATE_STUCK_AT + state));
163169
} else {
164-
LOG.error(
165-
ProcedureMessages.LOG_RETRIEVABLE_ERROR_TRYING_REMOVE_DATA_NODE_ARG_STATE_ARG_4EFEB850,
166-
removedDataNodes,
167-
state,
168-
e);
169-
if (getCycles() > RETRY_THRESHOLD) {
170-
setFailure(new ProcedureException(ProcedureMessages.STATE_STUCK_AT + state));
171-
} else {
172-
setNextState(state);
173-
}
170+
setNextState(state);
174171
}
175172
}
176173
return Flow.HAS_MORE_STATE;
@@ -291,7 +288,9 @@ protected long getRollbackRetryTimeout() {
291288

292289
@Override
293290
protected boolean isRollbackSupported(RemoveDataNodeState state) {
294-
return false;
291+
// A failed migration child must still trigger node cleanup. This restores node statuses and
292+
// stops drained nodes without undoing completed region migrations.
293+
return state == RemoveDataNodeState.STOP_DATA_NODE;
295294
}
296295

297296
/**

‎iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/node/RemoveDataNodePersistenceTest.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,12 +420,14 @@ public void testProcedureExecutorCanActuallyRetryCompensationCommitFailure() thr
420420
failStatusWrite = true;
421421
TestProcedure procedure = procedure(NodeStatus.Running, RemoveDataNodeState.STOP_DATA_NODE);
422422
procedure.step(env);
423+
assertFalse("A transient cleanup failure must remain retryable", procedure.isFailed());
423424
assertEquals(
424425
"The state-machine executor must retain the failed compensation step",
425426
RemoveDataNodeState.STOP_DATA_NODE,
426427
procedure.state());
427428
failStatusWrite = false;
428429
procedure.step(env);
430+
assertFalse("Successful cleanup retry must not leave a failure", procedure.isFailed());
429431
assertStates(FIRST, NodeStatus.Running, NodeStatus.Running, null);
430432
}
431433

0 commit comments

Comments
 (0)