Caideyipi commented on PR #17831:
URL: https://github.com/apache/iotdb/pull/17831#issuecomment-4610279864
我看了这版实现和设计说明,有几个安全语义点建议再收紧/补证:
1. **lease recovery 解除 fence 的顺序有窗口。**
`MetadataLeaseManager.recordConfigNodeHeartbeat()` 现在先更新
`lastConfigNodeHeartbeatNanos`,再跑 recovery listeners;这意味着 listener 执行期间(或
listener 抛异常被吞掉后)`isFenced()` 已经返回 false,旧缓存可能被重新信任。这和“解除 fence 前缓存已作废/已
resync”的安全条件不一致。
建议改成显式状态机,例如 `FENCED -> RECOVERING -> ACTIVE`:critical recovery
listener/resync 成功后才切到 ACTIVE;失败则保持 fenced。
代码位置:
https://github.com/apache/iotdb/blob/cc0cbcc1432c804ac4939a3c536279e4994f5d57/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/lease/MetadataLeaseManager.java#L85-L94
2. **leader 切换场景还需要 epoch/token 级证明。**
DN 现在收到任意 `getDataNodeHeartBeat` 就续约 metadata lease,心跳里没有 leader term /
lease token。新 leader 重置 `lastResp` 可以避免使用旧历史,但不能阻止旧 leader 在少数派继续给某些 DN 续约。如果新
leader 收不到这些 DN 的响应,`T_proceed` 后可能判定 FENCED_SAFE,而 DN 实际被旧 leader 心跳续约、未
self-fence。
这里需要补一个严格证明:旧 leader 在新 leader ready 后不可能继续发送“有效续约”心跳;否则建议在 heartbeat 中带
leader epoch/token,DN 只接受当前有效 token 续约。
代码位置:
https://github.com/apache/iotdb/blob/cc0cbcc1432c804ac4939a3c536279e4994f5d57/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java#L2227-L2232
3. **AuthOperationProcedure 仍有 post-consensus 失败语义问题。**
现在不再 180s 静默丢弃 DN,这是改进;但 `writePlan` 先写 CN consensus,之后
`ClusterCachePropagator.propagate()` 如果返回 false,会 `setFailure`。此时权限变更已经在 CN
生效,而某个心跳新鲜但 invalidate RPC 持续失败的 DN 可能仍用旧权限缓存服务。对 REVOKE / DROP USER / DROP
ROLE 这类安全操作,procedure FAIL 本身不能恢复安全语义。
建议这类操作在写入成功后保持 pending/retry 直到每个 DN ack 或 fenced,或主动触发 DN fence,或引入 auth
version/token,让 DN 侧在版本不明时 fail-closed。
代码位置:
https://github.com/apache/iotdb/blob/cc0cbcc1432c804ac4939a3c536279e4994f5d57/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java#L100-L118
https://github.com/apache/iotdb/blob/cc0cbcc1432c804ac4939a3c536279e4994f5d57/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java#L155-L165
4. **建议补几个负向/竞态测试。**
目前 IT 覆盖了“停 1 个 DN 后 CREATE TABLE 成功”,但还需要覆盖安全证明里更关键的场景:
- 心跳通、metadata broadcast RPC 持续失败的半坏 DN;
- leader 切换时旧 leader 残留/继续心跳续约;
- recovery listener 延迟或失败时不得提前解除 fence;
- REVOKE/权限变更后,分区或半坏 DN 不得继续按旧权限放行。
这些不影响“停机 DN 可跳过”的 HA 目标,但会影响 fencing 方案的安全闭包。
--
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]