给自己定了3个带Lab作业的课程
MIT6.824 2020
分布式系统 开始于 2020-04-20
Lab1 MapReduce
Lab2 Raft
暂时只打算做 Lab1 和 Lab2 , Lab2 太耗时了而且后面的 两个lab 都依赖于它, 目前做完了 Lab1 和Lab 2A ,2B , 还是相当耗时的一个课程
2A , Raft 的选举阶段 重写了 2 遍 ,
第一次重写是因为代码太乱 ,担心后面的 lab 会被影响 (结果还是发生了)
第二次重写是因为写完复制阶段发现选举阶段有 bug , 又重新跑回去 debug 了
2B 重写了一遍 , 主要是因为没有一个一个测试过 , 直接把整个阶段的代码先写完导致到处都是 bug
重写的时候抽出了很多 helper 方法, 减少阅读压力
日志也全部重新打了一遍 , 并且按照阶段分开写到不同的文件中 , 多线程也只能靠打日志了,如果日志打好了 debug 起来事半功倍
看论文和资料 , 还有 debug 的过程相当耗时,有时候一个 bug 就是一天,不过整理了日志之后有所改善
做到 2B 这里整整花了 13 天,后面还有一个2c ,持久化的lab , 6 月再做..

有两个case大概率不能通过 , 排查了一天没找到 , 只能先搁置了 , 是有关网络请求丢失和延迟的case
遇到的一些问题和收获
debug ++
打日志 ++
日志打的太频繁(磁盘 IO)导致一个 test 超时了 , 日志开销也是要注意的点
某个线程忘记 sleep 导致 cpu 百分百
follower 断开导致candidate 无法发出后续的投票请求, 所有 peer频繁选举超时 , 需要把每个请求放到新的线程里执行, 只要满足了过半投票就可以不用继续等待超时的请求
各种因为没有理解论文和忘记维护变量的 bug
....
go 相关
1.不要在 for 里用 defer,不可预测
2.shared memory+lock 的多线程开发模式时 , 有的变量要用闭包包起来, copy 一份线程独立的 , 比如 for 循环时候的 i 变量
3.利用 select+time.After() 实现超时机制
4.go race 检测死锁
....
资料
schedule 里给的资料很完善 ,不过做的时候还是另外找了些中文资料
两个动画:
https://raft.github.io/
http://thesecretlivesofdata.com/
CMU15/445 2019
数据库
Lab1 BufferPoolManager / ClockReplacer
前置知识 C++还没看完
A tour of C++
CMU15/441 2019
计算机网络
Lab1 HTTP Web Server
前置知识 C, UNIX 网络编程 , 并发编程,同步原语 ,直接看前置课程 CMU15-213 和 CSAPP , 然后实现前置课程 Lab7的 Proxy Lab