20200312
Plan
60min: ClickHouse Write Procedure
Notes
今天借助 lldb 的调试功能,迅速摸清了写入流程:
┌──────────────────────────────┐
│TCPHandler.cpp:249 │
│executeQuery │
└──────────────────────────────┘
┌──────────────────────────────┐
│executeQuery.cpp:572 │
│executeQueryImpl │
└──────────────────────────────┘
┌──────────────────────────────┐
│executeQuery.cpp:328 │
│res = interpreter->execute(); │
└──────────────────────────────┘
┌───────────────────────────────────────┐
│InterpreterInsertQuery.cpp:204 │
│res.pipeline.addStorageHolder(table); │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│InterpreterInsertQuery.cpp:146 │
│make PushingToViewsBlockOutputStream │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│PushingToViewsBlockOutputStream.cpp:23 │
│make PushingToViewsBlockOutputStream │
└───────────────────────────────────────┘
┌──────────────────────────────┐
│TCPHandler.cpp:660 │
│state.io.onFinish(); │
└──────────────────────────────┘
目前发现写入流程的关键控制在于 PushingToViewsBlockOutputStream.cpp 里面的实现,明天需要再深入研究一下,明天的断点可以设置在:
breakpoint set --file src/DataStreams/PushingToViewsBlockOutputStream.cpp --line 168
ClickHouse 的主体流程是一个 TCP server,定义在 TCPHandler.cpp 里面,处理所有的 query,其中 Insert 也是 query。