记录一下 PPCA 吧。 此文已沦为 diary。
值得一提的是,ACM 班的 Raft 仓库使用的是 MIT 6.5840 2023 年的代码,实为落后。
由于兼容性,后文用 3A, 3B, 3C, 3D 指代 6.584 2025 仓库的 Lab3,用 4A, 4B 指代 2023 年仓库的 Lab3。
介绍项目+分组,落选了第一志愿 Network,遗憾进入 Raft,据说工作量爆炸。 在此提醒后人,如果有想选的项目,可以把二、三志愿选成火爆的 AI 和图形学,这样助教就不得不满足你的第一志愿了。 下午蹭了一下 Network 的讲解,学习了不可言说的简史。
重温 The Effective Go ,但很显然高中写的 Go 已经忘光了 。没怎么读论文就开始实现 Lab 3A,过于心急,错误百出,并发想晕了。感觉要潜心读一读论文。
Yorushika swing 大学习。
学习 yyu 伟大精神,我就好这口.jpg
2h 沉浸式读论文,今天连编辑器都没打开,yyu 心心念念的小黑板也是用上了,但是因为没读完论文所以交流效率有点低下,叽里呱啦不知道在说什么。希望明天能把 section 5 读完,适度同步一下 6.824 Schedule ,虽然 PPCA 其实把 Lab 六周的量压到了四周🥵。
机考 B 卷速通了 7 题的暴力,yet another Turing complete language🤣,然后对着 Hanoi 臆想了 2h,满脑子都是 continuation 和栈模拟递归,最后细节爆炸弃疗了,没有题解那么好的想法,前面的暴力也没时间优化了,有点玉玉()。感觉 Hanoi 和前几题 gap 有点大(暴力太好写导致的),当时不应该直接放弃优化前几题()。Rico orz。赛后听说 A 卷好水,不过还是 B 卷更有意思。
继续 Yorushika swing 大学习,高强度揉弦有点撑不住,疑似没有找到正确的发力方式。
并没有读完 section 5,但是把 3A 勉强写完了。多线程加锁太容易写错了,测 1000 个点才 1 个点出问题属实难绷,若干次以为写对但其实写错了。不过加锁这种东西居然不能在语言层面上保证正确🤔(吗?)
坏消息:写代码写出班味了。好消息:看乐联 Jam 可以去班味()。不过这次氛围没有前一场好,有了雅座大家光看手机去了()。
写 3B,今天并没有继续读论文,但是 3B 有些细节还需要重新看看。昨天还在想 votedFor 有什么用,今天才发现是因为 follower 不是一定要投给 term 大于自己的 candidate,还要满足 up-to-date 条件。不过其实只需要维护 isVoted bool
就好了?
训练。拿了一道一血,然后被神奇构造题硬控到比赛结束。
去邮局寄明信片,发现邮局四点就下班了。
练琴把音箱弹没电了。
明信片寄出去了,贴三张邮票有点唐😥
训练,又挂题了。
痛失一枚拨片。感觉霸占活动室练琴似乎不太好。
继续上班。 多线程的行为有点捉摸不透,开始写了好几个 assertion 最后发现都假了。有点好奇 Raft 论文里说的形式化证明是怎么做的。Debug 了一天,最后的问题在 Start 函数加锁要很久才能加上,可能是因为 ticker 速度太快了 Start 反应不过来?
小小加班了一下,发现抢不到锁是因为被 RPC 卡住了,RPC 前记得释放锁就好了。还发现之前写出了几个看起来极其危险的操作,也不知道写成这样 3A 是怎么过的...大概类似于
for i := range rf.peers {
go func() {
someFunction(i)
}()
}
正确的写法应该是
for i := range rf.peers {
go func(i int) {
someFunction(i)
}(i)
}
为什么加班效率这么高啊,半个小时就写过了。 明天可以多跑些测试,优化一下时间,然后读论文 / 启动 3C。另外之前提到的 isVoted 也需要加上去。今天的加班就到这里。
上午半摸半写过了 3B。
下午 3C 写完调了很久,原因见此 commit:
When the tester tries to shutdown a server, and restarts it, the tester does not use a new ApplyCh. So the original server may still be able to send commands to the the channel, where the commands are thought by the tester to come from the new server and cause the tester to raise an error.
我原本的写法是发完一组 AppendEntries 之后再通过 matchIndex 更新 leader 的 commitIndex,但有可能发完一组 AppendEntries 之后 tester 已经把 old leader 下线了,而 old leader 依然会在更新 commitIndex 之后 apply 新的 command,于是 tester 会认为这个 command 顺序错了。
3C 勉强过了,但是时间堪忧,正确性还未知,明天再测吧。
丢失的拨片从裤子口袋里自动掉了出来!
效率++,但不知为何会占用很多内存,导致我只敢开 150 个进程测。
TestFigure8Unreliable3C 挂了。
机考喝到了奶茶,上次喝还是在第零次机考。但是传奇赛后三秒过题。
有的题没做出来感觉有点遗憾,其实想法都挺接近正解了。比如 float 那题已经甚至试过了输入 nan 和 inf,但却没有继续往下做。再比如最后一题,有过用指针偏移量修改结构体数据的念头,但是看了函数参数发现没有传地址的于是就放弃了。有位同学把函数签名改成引用获得了地址,大概是非预期解吧。最尴尬的是 T0 离了搜索引擎居然就束手无策了……果然还是水平不够。
盼望已久的 Luv(Sic) Hexalogy! OMA 水平还是挺高的,鼓手身体全程反拍律动比较神奇,现场灯光和布景都很好看。Shing02 出场后全场氛围才真正调动起来。最后一首 Battlecry 燃起来了!
编写多线程程序首先要正确地上锁/释放锁,确保每个函数/片段的原子性,然后还要防止互锁的情况出现。
天天上班,好像没什么时间学新知识了,之前开的猫论坑写了一篇就停更了……
TestFigure8Unreliable3C 这个点几乎可以暴露出 3A 到 3C 的所有问题。内存占用过多应该是 AppendEntries 没有用 empty 试错就直接发过去的缘故,或者是同一个包发了很多次。打算试试把 ticker 时间调长一点,然后记一下 nextIndex 是否正确,只有当正确的时候才把完整的 entry 发过去。这样其实仍有优化的余地,比如可以确保同一时刻每个 follower 只能有一个非空的 AppendEntry。但不加这个优化已经达到了预期效果。
简单阅读了一下 6.5840 Schedule 里的笔记 / FAQ。非常遗憾, Raft does not Guarantee Liveness in the face of Network Faults. 然而,如果你实现了文末提到的解决方案,即 leader 如果没有收到 majority 的 AppendEntries 回复就主动退位,那么你似乎无法通过 Lab 的测试点(?)
又因为 tester 的 chan ApplyMsg 挂了,有点唐,而且换 2023 年的 tester 10000 组未能复现😥。MIT 太愚昧了!更唐的地方是 2025 年的 test 没测出来的问题 2023 年的 test 测出来了。
挂了很多发,发现有可能是电脑极端负载导致的……
清醒了……tester 不需要老 leader 的时候会调用 rf.Kill()……MIT 对不起。
现在对 3C 处于一种睁一只眼闭一只眼假装自己已经过了的状态。开始写 4A,死锁的问题又出现了。
CCPC 上海市赛。
Sleep.
4A 通过。跳槽!开始看 Network。lxc 和 lxd 配了半天,这东西一跑起来直接反噬主机的 dns。
记一个看了很久才看出来的问题:
One major problem is that the leader probably won't commit the newest
command, because new leader election causes the term to increase,
unaligning with last log term. To solve this problem, we need to set a
oneShotTimeout for the KVServer. If a KVServer send a command that is
not committed for a while, it resends that command, instead of waiting
forever.
lxd 会把自己的 dns 加到 /etc/resolv.conf
里,手动删掉就好了……
唐完啦!
被代理硬控了一上午。本来想用 nftables 接管一下 docker 容器向外 443 端口的请求,结果请求被优先级更高的 v2raya 抢走了。
下午测试端口连通性的时候用 darkhttpd 搭了个临时 http 服,结果作死要在 docker 里用 curl https 请求,darkhttpd 日志都没有直接拒绝了,我还以为是 nftables 的问题,又唐完啦!
在 AI 的帮助下完成了 MiTM。Sleep.
出游,练琴。
练琴,出游。
新编译器简介, 佬们别卷了 。阅读 sing-box 文档/源码,用了一下 claude code, 总体上摸了一天 。
阅读 sing-box 代码,有了一点头猪,写了一点点 Inbound。
快写完 SNI proxy 了,不过这个东西真的没有流量特征吗?机考是随机化大乱斗。
发现 SNI proxy 写假了,写成 TLS in TLS 了,重写。
CR?
怀旧。
Basic Verilog and RISC-V。
系统课讲了很多 cliché。
The final version!