raft收到请求,首先做的事情其实就写log了。
jraft中是通过LogManagerImpl来实现的
日志入口
LogEntryAndClosureHandler
image.png
executeApplyingTasks:构建日志对象LogEntry,准备写入
image.png
appendEntries:转成事件,异步处理
image.png
StableClosureEventHandler#onEvent :异步处理事件
image.png
image.png
flush:交给Storage来处理,
image.png
appendToStorage:调appendEntries继续处理
final int nAppent = this.logStorage.appendEntries(toAppend);
appendEntries:再调addDataBatch
image.png
addDataBatch:把数据放到WriteBatch
image.png
最后用RocksDB的write方法,处理WriteBatch
image.png
这里只是看到write,按道理raft的每条日志都应该是立即flush到磁盘的,这里的write就有个writeOptions,来控制是否同步flush了。
image.pngRaftOptions:可以看到默认的配置是同步flush的
image.png
网友评论