问题
带着问题撸源码系列-zookeeper-内存的数据如何持久化到硬盘
猜测
这种一般都是有个定时任务往硬盘写吧
源码
吸取经验,直接从底层打断点最舒服,直接搂出调用栈美美哒。
于是我们开始猜哪个是写硬盘的类。
搂了一遍,大胆猜测是这个:
org.apache.zookeeper.common.AtomicFileOutputStream
断点打起来
debug
客户端发起写请求,create /w1
没有停在断点。。
看来找错地方了。
再猜:org.apache.zookeeper.server.ByteBufferOutputStream
也不对。。
org.apache.zookeeper.server.persistence.FileSnap#serialize(org.apache.zookeeper.server.DataTree, java.util.Map<java.lang.Long,java.lang.Integer>, java.io.File, boolean)
这个很有信心!
还是不对。。
好像又没招了。。看来自底向上是不行了。
那再来自顶向下?
从启动过程开始看:找到了定时purge清除的地方:
好吧我投降了,上网搜到是这样的:http://www.guobingwei.tech/articles/2019/04/01/1554076444476.html
在zkDatabase.append里整的
终究还是网上的大哥牛皮:
看调用栈,是SyncRequestProcessor调用的。
将请求写到硬盘。将请求batch了,提升io效率。只有写完硬盘才会将请求pass到下一个requestProcessor
3个不同的case会用到:
1、Leader: 同步请求到硬盘,转发到AckRequestProcessor, 然后AckRequestProcessor 又发ack发回来
2、Follower:同步请求到硬盘,转发到SendAckRequestProcessor, AckRequestProcessor发包给leader。AckRequestProcessor 是flushable的,允许我们强行推送packet给leader
3、Observer先不管了。