知识卡片

用数组下标而非指针引用子bucket

专业/工作 · 237.h.5

内容

crush_bucket 结构里的 items 数组存的不是指向子 bucket 的指针,而是子 bucket 在 crush_map 全局 buckets 数组里的下标,所有 bucket 结构统一挂在 crush_map 的这一个数组上。这个看似琐碎的实现细节背后是一个明确约束:CRUSH 需要在完全不同的进程(Monitor、各个 OSD、各个客户端)里独立计算出一致的结果,Cluster Map 必须能被整体序列化后通过网络分发。指针在不同进程的地址空间里没有意义,下标却可以随数据一起序列化、在任何进程反序列化后原样还原引用关系——数据结构的设计要服务于”这份数据要怎么被传输和复用”,而不只是本地内存里怎么方便。

参考来源

《Ceph源码分析》第4章《CRUSH数据分布算法》