CRZbulabula commented on code in PR #17735:
URL: https://github.com/apache/iotdb/pull/17735#discussion_r3279235969


##########
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTTLProcedure.java:
##########
@@ -86,18 +93,9 @@ protected Flow executeFromState(ConfigNodeProcedureEnv env, 
SetTTLState state)
     }
   }
 
-  private void setConfigNodeTTL(ConfigNodeProcedureEnv env) {
-    TSStatus res;
-    try {
-      res =
-          env.getConfigManager()
-              .getConsensusManager()
-              .write(isGeneratedByPipe ? new PipeEnrichedPlan(this.plan) : 
this.plan);
-    } catch (ConsensusException e) {
-      
LOGGER.warn(ConfigNodeMessages.FAILED_IN_THE_WRITE_API_EXECUTING_THE_CONSENSUS_LAYER_DUE,
 e);
-      res = new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode());
-      res.setMessage(e.getMessage());
-    }
+  protected void setConfigNodeTTL(final ConfigNodeProcedureEnv env) {
+    capturePreviousTTLState(env);
+    final TSStatus res = writeConfigNodePlan(env, plan);

Review Comment:
   **(中等严重)崩溃恢复下 `previousTTL` 可能被错误覆盖**
   
   `capturePreviousTTLState` → `writeConfigNodePlan` 在同一个 `executeFromState` 
调用内,而 procedure 框架只在 state 切换时持久化 `previousTTLStateCaptured`/`previousTTL`。若 
ConfigNode 在 consensus 写入成功后、`setNextState(UPDATE_DATANODE_CACHE)` 
持久化之前崩溃,重启时会重放 `SET_CONFIGNODE_TTL`:此时 `previousTTLStateCaptured = 
false`,`getAllTTL()` 返回的已经是**新值**,被记录为 previousTTL。后续若 DataNode 
更新失败触发回滚,就会把「新值」当成「旧值」回滚,失去回滚意义。
   
   建议:把 capture 拆成独立的前置 state(例如 `CAPTURE_PREVIOUS_TTL` → `SET_CONFIGNODE_TTL` 
→ `UPDATE_DATANODE_CACHE`),让 captured snapshot 在写 consensus 之前先随 procedure 
状态一起被持久化。



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to