谭新宇的博客

谭新宇的博客

马上订阅 谭新宇的博客 RSS 更新: https://tanxinyu.work/atom.xml

Talent-Plan:用 Rust 实现 Percolator 算法

2022年8月25日 11:36

版本

前期准备

Rust 学习

Percolator 学习

过关思路

在基本环境搭建好之后,观察发现 lab 只有 13 个测试,测试全部 AC 即可通过项目。实际上一个生产级别的 Percolator 实现这些测试是远远不够的,需要考虑和测试的 case 很多。

由于本 lab 的主要目标是帮助学习 Rust,因此本次过关思路便是通过 TDD 的方式通关,将主要精力放在通过测试以及对应 Rust 语法的学习和练习上,对于实现的 Percolator 算法满足论文要求和当前的测试 case 即可,不再去新增更多的 test case 和并发情况。

过关过程

TSO 测试

  • test_get_timestamp_under_unreliable_network

该测试期望在不稳定网络下 client 的 get_timestamp 接口在超时重试时可以满足 backoff 幂增重试属性。

因此一方面在 TSO Server 端的 get_timestamp 接口处提供一个空实现,另一方面在 Client 中维护对应初始化时传入的 rpc client 字段并在 get_timestamp 函数中增加幂增 sleep 逻辑即可。

有关 async 和 await 的原理需要进一步理解学习,但仅就完成本 lab 而言,可以查看 labrpc example 中的使用样例来模仿使用,即使用 await 来驱动 async 的代码块执行,使用 block_on 达到同步执行的效果。

通过本测试的新增代码可查看 commit

TXN 正常测试

  • test_predicate_many_preceders_read_predicates
  • test_predicate_many_preceders_write_predicates
  • test_lost_update
  • test_read_skew_read_only
  • test_read_skew_predicate_dependencies
  • test_read_skew_write_predicate
  • test_write_skew
  • test_anti_dependency_cycles

以上测试要求在网络正常的情况下能够正确实现 Percolator 的事务提交,即可按照论文中的伪码实现即可。

client

对于 Client 的 new 函数,保存两个 rpc client 并初始化 start_ts 和 mem_buffer。注意,为了在客户端进行去重,mem_buffer 使用了 hashmap 而不是 Vec。

对于 Client 的 get_timestamp 函数,参照上一小节实现发 RPC 和对应的重试以及错误处理逻辑即可。

对于 Client 的 begin 函数,使用 get_timestamp 函数更新本地的 start_ts 即可,start_ts 将作为快照读取的依据。

对于 Client 的 set 函数,直接缓存到 mem_buffer 中即可。

对于 Client 的 commit 函数,开始 Percolator 的提交流程,即先 prewrite 再 commit。注意不论是 prewrite 还是 commit 都是先对 primary 进行处理再对 secondary 处理。

proto

参照论文写出了对应的 proto 文件如下,以下将分别分析四种 RPC 请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30...

剩余内容已隐藏

查看完整文章以阅读更多