【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/
作者
IceLocke
发布于
2025年8月1日
许可协议