refactor(cluster): 删死代码与已失真的桩,上提为顶层包 - #265
Conversation
删除完全无人引用的代码: - BoundedRing(101 行 + 88 行测试):有界负载一致性哈希,全仓零引用,连包内也没用到, 实际在跑的是 HashRing。 删除注释已与事实不符的桩(三者均零调用方): - Placement.Forward、ForwardFunc、Placement.Rebalance。它们的说明称「跨节点数据传输 未实现,属传输层重写范围」——该前提已不成立:跨节点转发早已由 Router + PeerPool 经 BanNet 落地。留着一个说明失真的桩比删掉更糟,读者会据此以为该能力缺失。 gateway.go 随之只剩 IsLocal,并入 placement.go 后删除;errNotImplemented 一并移除。 把「所有节点恒存活」这一事实显式化:生产代码原先直接传 100*365*24*time.Hour 这个魔数, 把「尚无心跳」伪装成一个会过期的存活窗口。改为具名常量 assumeAliveTTL 并写明——此处不能 换成有限 TTL:没有心跳刷新,任何有限窗口都会让全部节点在窗口后被判失联,OwnerOf 返回 空串、路由整体中断。 包上提 service/cluster → cluster:它只依赖 bannet、不依赖 service,且同时被 service 与 service/shardkv 使用,嵌在 service/ 下会误导归属;它是与 storage/raft/bannet 同级的 分布式控制面。 包文档重写为「哪些已在生产路径上运行、哪些仍是不产生行为的骨架」,其中明确 Registry 的 存活视图当前等价于直接用 HashRing.NodeFor。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
删除 BoundedRing 与两个控制面桩后,这两篇记录会描述代码库中不存在的东西——这正是我们 删掉 architecture-diagram.md 的理由。但它们与那张图不同:它们是带日期的决策记录,本身 并没有说错当时的事,故保留原文、在文末追加「后续状态」,指明该实现已移除及其原因。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (19)
📝 WalkthroughWalkthroughThe cluster package adds TTL-based peer liveness, peer connection pooling, and bootstrap helpers. Routing and P2C behavior gain broader tests. Service imports move to the top-level package. Legacy bounded-ring and forwarding stubs are removed. ChangesCluster runtime
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Client
participant PeerPool
participant BanNetClient
Client->>PeerPool: Submit PUT, GET, or DELETE
PeerPool->>BanNetClient: Dial or reuse cached connection
BanNetClient-->>PeerPool: Return operation result
PeerPool-->>Client: Return forwarded result
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🐯 BanGD 数据库内核评审整体风险:🟢 低 变更总结:这是一个纯重构/清理性质的 PR:把
架构问题(共 2 项)
普通问题(共 1 项)
本次评审消耗 token:共 113534 tokens(输入 100074,输出 3860,缓存命中 9600,缓存写入 0)|维度 [concurrency, memory, lock, storage, schema]|补充阅读周边文件 [cluster/registry.go, cluster/peerpool.go]|对抗式复核 3 票/条,过滤疑似误报 0 条 |
起因是一个问题:
service/cluster这层逻辑到底有什么用?逐符号查了外部引用后,答案是一部分在真跑,一部分从落地起就没产生过任何行为。一、它到底在做什么
已在生产路径上运行(有调用方、有行为)
HashRing/ShardOf/ShardReplicasservice/shardkv的分片归属、Router的属主计算P(P2C 两选一延迟择优)shardkv的转发读PeerPoolRouter的跨节点属主转发仍是骨架,当前不产生行为
Registry的存活视图:Heartbeat无任何非测试调用方,且生产代码传入的 TTL 是100*365*24*time.Hour(100 年)。因此IsAlive恒为 true,Placement.OwnerOf与HashRing.NodeFor行为等价——我核对过两者的计算路径逐步相同(searchLocked(hashKey(key))→hashToNode[sortedHashes[idx]])。Placement.Failover:有行为(把节点摘出环),但没有故障检测来触发它,零调用方。二、删掉的
完全死代码:
BoundedRing(101 行 + 88 行测试)。有界负载一致性哈希,全仓零引用,连cluster包内部都没用到——实际承担归属计算的一直是HashRing。注释已与事实不符的桩(三者均零调用方):
Placement.Forward、ForwardFunc、Placement.Rebalance。它们的说明写着「跨节点数据传输未实现,属传输层重写范围」——该前提已不成立:跨节点转发早已由Router+PeerPool经 BanNet 落地(见iteration-2026-08-05-shard-routing-banNet)。留一个说明失真的桩比删掉更糟:读者会据此以为该能力缺失。gateway.go随之只剩IsLocal,并入placement.go后删除。按讨论保留
Registry与Failover作为存活视图的骨架。三、把「恒存活」这件事说清楚
生产代码原先直接写
100*365*24*time.Hour这个魔数,等于把「尚无心跳」伪装成一个会过期的存活窗口。改为具名常量并写明理由——这里不能换成有限 TTL:没有心跳刷新,任何有限窗口都会让全部节点在窗口后被判失联,OwnerOf返回空串、路由整体中断。四、上提为顶层
cluster/它只依赖
bannet、不依赖service,且同时被service与service/shardkv使用;嵌在service/下会误导归属。它是与storage/raft/bannet同级的分布式控制面。包文档重写为「哪些已在生产路径上跑、哪些仍是不产生行为的骨架」,把上面这份判断固定在代码里,而不是只留在 PR 里。
五、让记录保持诚实
删掉代码后,
iteration-2026-08-05-bounded-load-consistent-hashing与distributed-delivery-cluster-skeleton会描述不存在的东西——这正是我们删architecture-diagram.md的理由。但它们与那张图不同:它们是带日期的决策记录,并没有说错当时的事。故保留原文,仅在文末追加「后续状态」说明实现已移除及原因。验证
go build ./...(含-tags pprof)、go vet ./...、go test -race ./...、gofmt全绿;scripts/bench.sh实跑通过。顺带:p2c.go长期未通过gofmt的问题在本次编辑中一并修复。🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Changes
Documentation & Tests