20200210
Plan
- 60min: UNP
- 20min: RocksDB Write Procedure
Notes
UNP
TCP 的 "三次握手建立 connection、四次挥手关闭 connection" 中的 "次" 实际上是指过程中交换的 数据报(segment)。
TCP 的状态转换图新发现
- 虚线表示 server 端(被动打开、关闭),实线代表 client 端(主动打开、关闭)(这个 server/client 只是经验上的,毕竟 TCP 是全双工的)。
- Closed、Established 状态是两端同时可以达到的状态。
- 存在同时建立连接+关闭连接的情况
- 被动关闭进入 CLOSED_WAIT 状态后,会发送 FIN 包,发送完会进入 LAST_ACK 状态,等待 ACK 包,但是大部分时间情况是还是处于 CLOSED_WAIT 状态,这一点不清楚。
TCP 的 TIME_WAIT 状态目的
- 实现全双工的连接终止: 主动关闭之后,并且接收到对端的 FIN 包,发送 ACK 包,就进入 TIME_WAIT 状态了,然而并不能保证 ACK 包一定被对方接收到,因此 TIME_WAIT 状态可以在对端因为没有接收到 ACK 包的情况下重发 FIN 包的时候再次发送 ACK 包。
- 处理老的重复数据报(wandering duplicate segments): 至少维持 2MSL(maximium segment lifetime),保证网络中游荡的数据报不会污染使用相同 ip 和 port 的 socket,至于为什么 CLOSE_WAIT 不需要等待的原因是 TCP 是全双工的,如果一端保证了 2MSL 不可用的话,那么就不会有相同 ip 和 port 的 socket 再次被建立。
TCP MSS 选项
MSS = maximum segment size,计算方法是 <= MTU(maximum transmission unit,通常为 1500B) - IP_HEADER(v4=20B,v6=40B) - TCP_HEADER(20B)
RocksDB Write Procedure
相关文件:
- db_impl_write.cc:WriterImpl
- write_thread.h
- write_batch.h
目前的进展:
- 过了一遍 WriteImpl 流程,分支比较多,看到写入的实际触发动作是在写入流程触发的(无论是 leader 还是 follower),leader 需要触发 follower 的写入,这个和我一开始设想的单独维护线程池不同,不过确实是很好的设计,本来就是上层控制写入线程的数量的,单独维护线程池本身就是一个简单、低效的做法。
- 发现含有 merge 操作的 batch 写入是不支持 concurrent update memtable 的。
明天的安排: 仔细研究几个分支
More
- 被动关闭进入 CLOSED_WAIT 状态后,会发送 FIN 包,发送完会进入 LAST_ACK 状态,等待 ACK 包,但是大部分时间情况是还是处于 CLOSED_WAIT 状态,这一点不清楚。
- std::aligned_storage
- TEST_SYNC_POINT