【MIT 6.5840】Lab 2: Key/Value Server
本文最后更新于 2025年8月1日 下午
介绍
Lab 2 主要任务是实现一个基于 KV 服务器的分布式锁,需要保证不可信网络条件下 Put
操作满足至多一次(at-most-once)原则,并且保证所有操作满足线性一致性。
实现
这个 Lab 较为简单,能流畅阅读 Lab 文档大约 1~2 个小时内就可以完成。注意 Hint 条条有用,需要仔细阅读并且理解其意味。
主要需要注意的是在 KV 服务器可能丢失消息时,对 Put
操作返回的讨论。当服务器回复一个 rpc.ErrVersion
作为对一个重试的 RPC 的回复时,客户端无法仅通过这个消息知道它的 Put
是否被服务器执行:
- 第一个 RPC 可能已经被服务器执行,但网络可能丢弃了来自服务器的成功响应;
- 另一个客户端(这里称为 客户端2️⃣ )在第一个 RPC 到达服务器之前更新了键,以至于服务器既没有执行 客户端1️⃣ 的 RPC,也对两个 客户端1️⃣ 发送的 RPC 都回复了
rpc.ErrVersion
。
因此,客户端不是第一次发送 RPC 时,收到 rpc.ErrVersion
并不可以确定对应的 KV 对是否被修改。这时 KV 客户端返回 rpc.ErrMaybe
给应用程序处理。
在我们实现的分布式锁中,通过 value 存储分布式锁客户端的 ID,如果返回 rpc.ErrMaybe
,则再次 Get(l)
来查询锁是否已经被(自己)持有,这样就可以确认 Put
是否被服务器执行。
通关记录
【MIT 6.5840】Lab 2: Key/Value Server
https://blog.icel.site/2025/08/01/MIT-6-5840-Lab-2/