Talent-Plan:用 Rust 实现 Percolator 算法
版本
前期准备
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 请求: 剩余内容已隐藏 Rust 学习 Percolator 学习 在基本环境搭建好之后,观察发现 lab 只有 13 个测试,测试全部 AC 即可通过项目。实际上一个生产级别的 Percolator 实现这些测试是远远不够的,需要考虑和测试的 case 很多。 由于本 lab 的主要目标是帮助学习 Rust,因此本次过关思路便是通过 TDD 的方式通关,将主要精力放在通过测试以及对应 Rust 语法的学习和练习上,对于实现的 Percolator 算法满足论文要求和当前的测试 case 即可,不再去新增更多的 test case 和并发情况。 该测试期望在不稳定网络下 client 的 get_timestamp 接口在超时重试时可以满足 backoff 幂增重试属性。 因此一方面在 TSO Server 端的 get_timestamp 接口处提供一个空实现,另一方面在 Client 中维护对应初始化时传入的 rpc client 字段并在 get_timestamp 函数中增加幂增 sleep 逻辑即可。 有关 async 和 await 的原理需要进一步理解学习,但仅就完成本 lab 而言,可以查看 labrpc example 中的使用样例来模仿使用,即使用 await 来驱动 async 的代码块执行,使用 block_on 达到同步执行的效果。 通过本测试的新增代码可查看 commit 以上测试要求在网络正常的情况下能够正确实现 Percolator 的事务提交,即可按照论文中的伪码实现即可。 对于 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 文件如下,以下将分别分析四种 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...Talent-Plan:用 Rust 实现 Percolator 算法
版本
前期准备
过关思路

过关过程
TSO 测试



TXN 正常测试
client


proto
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...