[GH-ISSUE #345] storage failover的场景,个别target处于OFFLINE状态,无法自愈 #212

Open
opened 2026-10-26 09:47:12 +00:00 by bsakaguchi · 2 comments
Owner

Originally created by @kaede11 on GitHub (Sep 30, 2025).
Original GitHub issue: https://github.com/deepseek-ai/3FS/issues/345

出现问题的场景如下:
三副本同步NodeA -> NodeB -> NodeC,在写数据时,最后一个节点NodeC完成了commit操作,返回response给前驱节点前进程crash了,当前在处理的chunk的状态如下:
updateVer == commitVer == $seqNum
chunkState == COMMIT
而此时,前驱节点engine的状态如下
updateVer == $seqNum
commitVer == $seqNum - 1
chunkState == CLEAN

此时NodeC重启恢复数据,在跟NodeB进行resync期间,在如下阶段报错返回
`

} else if (meta.checksum() != remoteMeta.checksum) {

  if (meta.chainVer != vChainId.chainVer) {
    XLOGF(DFATAL, "chain {} checksum not equal, local {}, remote {}", vChainId, meta, remoteMeta);
    ++currentSyncingRemoteFullSyncLightCount;
    hasFatalEvents = true;
    break;
  } else {

`
这个场景算是个常规case,长期卡在OFFLINE的状态,应该是不符合预期的。此外,代码中判断meta.chainVer != vChainId.chainVer也有点匪夷所思,有哪些特殊考虑吗? 为什么要拿chain最新的版本去跟engine存量数据去比较?NodeC停服期间,chainVer还是有可能发生变化的。

修复:
是不是可以考虑在meta.chainVer != vChainId.chainVer判断之前,跳过remoteMeta.chunkState == ChunkState::COMMIT的case?

Originally created by @kaede11 on GitHub (Sep 30, 2025). Original GitHub issue: https://github.com/deepseek-ai/3FS/issues/345 出现问题的场景如下: 三副本同步NodeA -> NodeB -> NodeC,在写数据时,最后一个节点NodeC完成了commit操作,返回response给前驱节点前进程crash了,当前在处理的chunk的状态如下: updateVer == commitVer == $seqNum chunkState == COMMIT 而此时,前驱节点engine的状态如下 updateVer == $seqNum commitVer == $seqNum - 1 chunkState == CLEAN 此时NodeC重启恢复数据,在跟NodeB进行resync期间,在如下阶段报错返回 ` } else if (meta.checksum() != remoteMeta.checksum) { if (meta.chainVer != vChainId.chainVer) { XLOGF(DFATAL, "chain {} checksum not equal, local {}, remote {}", vChainId, meta, remoteMeta); ++currentSyncingRemoteFullSyncLightCount; hasFatalEvents = true; break; } else { ` 这个场景算是个常规case,长期卡在OFFLINE的状态,应该是不符合预期的。此外,代码中判断meta.chainVer != vChainId.chainVer也有点匪夷所思,有哪些特殊考虑吗? 为什么要拿chain最新的版本去跟engine存量数据去比较?NodeC停服期间,chainVer还是有可能发生变化的。 修复: 是不是可以考虑在meta.chainVer != vChainId.chainVer判断之前,跳过remoteMeta.chunkState == ChunkState::COMMIT的case?
Author
Owner

@SF-Zhou commented on GitHub (Sep 30, 2025):

建议查看一下详细的 chunk meta 信息,如果已经走到了 meta.checksum != remoteMeta.checksum 的判断,那么意味着 meta.chainVer == removeMeta.chainVer,仍然都处于旧的 crash 前的 chain 版本上,此时二者的 checksum 数据应该是完全一致的(没有新的写入发生)。

判断 meta.chainVer != vChainId.chainVer 是必要的,如果 meta.chainVer 处于当前最新的版本,那么 checksum 不一致、其他均一致可以解释为在当前最新的 chain 版本上发生了一次 写入-删除-再写入 的情况。

<!-- gh-comment-id:3350444637 --> @SF-Zhou commented on GitHub (Sep 30, 2025): 建议查看一下详细的 chunk meta 信息,如果已经走到了 `meta.checksum != remoteMeta.checksum` 的判断,那么意味着 meta.chainVer == removeMeta.chainVer,仍然都处于旧的 crash 前的 chain 版本上,此时二者的 checksum 数据应该是完全一致的(没有新的写入发生)。 判断 meta.chainVer != vChainId.chainVer 是必要的,如果 meta.chainVer 处于当前最新的版本,那么 checksum 不一致、其他均一致可以解释为在当前最新的 chain 版本上发生了一次 写入-删除-再写入 的情况。
Author
Owner

@kaede11 commented on GitHub (Sep 30, 2025):

chunksum 确实是不一致的。目前我通过fullsync临时恢复了,仅存的日志如下:
[2025-09-29T09:23:13.273778636+08:00 Sync2: 156 ResyncWorker.cc:254 FATAL] chain {"chainId":900200002,"chainVer":117} checksum not equal, local {"commitVer":0,"updateVer":1,"chainVer":107,"size":1048576,"chunkSt ate":"CLEAN","recycleState":"NORMAL","checksumType":"CRC32C","checksumValue":1757205870,"lastNodeId":0,"lastRequestId":4656501,"innerOffset":"4504686254107530","innerFileId":{"chunkSize":1048576,"chunkIdx":256}," lastClientUuid":"60dd9a60-75f3-4a3c-b390-69cd318d9cba","timestamp":"2025-09-26 17:53:41"}, remote {"chunkId":"00000000-00000017-616A0000-00001624","updateVer":1,"commitVer":1,"chainVer":107,"chunkState":"COMMIT", "checksum":{"type":"CRC32C","value":2131067927},"length":1048576}

<!-- gh-comment-id:3351044438 --> @kaede11 commented on GitHub (Sep 30, 2025): chunksum 确实是不一致的。目前我通过fullsync临时恢复了,仅存的日志如下: ` [2025-09-29T09:23:13.273778636+08:00 Sync2: 156 ResyncWorker.cc:254 FATAL] chain {"chainId":900200002,"chainVer":117} checksum not equal, local {"commitVer":0,"updateVer":1,"chainVer":107,"size":1048576,"chunkSt ate":"CLEAN","recycleState":"NORMAL","checksumType":"CRC32C","checksumValue":1757205870,"lastNodeId":0,"lastRequestId":4656501,"innerOffset":"4504686254107530","innerFileId":{"chunkSize":1048576,"chunkIdx":256}," lastClientUuid":"60dd9a60-75f3-4a3c-b390-69cd318d9cba","timestamp":"2025-09-26 17:53:41"}, remote {"chunkId":"00000000-00000017-616A0000-00001624","updateVer":1,"commitVer":1,"chainVer":107,"chunkState":"COMMIT", "checksum":{"type":"CRC32C","value":2131067927},"length":1048576} `
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
deepseek-ai/3FS#212
No description provided.