语句
|
|
如何查看rocksdb存储内容
扫描node1数据目录下的rocksdb数据库
|
|
InsertRow将value转换成Client.Batch
如果一条语句中包含多行insert,有利于批量传递修改
涉及到的文件和结构体
pkg/sql/insert.go insertNode
pkg/sql/tablewriter.go tableInserter
pkg/sql/sqlbase/rowwriter.go RowInserter
pkg/internal/client/batch.go Batch
pkg/roachpb/api.go Batch
堆栈代码
|
|
key & value结构
Primary Index
key
: tableid, indexid, pk1, pk2 …
value
: encoded values. EncodeTableValue
encoded value
: colid|Type, len, value
Secondary Index
Unique
key
: tableid, indexid, key1, key2…
value
: pk1, pk2…
Non-Unique
key
: tableid, indexid, key1, key2…, pk1, pk2…
value
: empty
txn.Run将client.batch写入到rocksdb
堆栈代码
|
|
添加开始事务request
由于insert是写入操作,且是事务中的第一条写入操作,故需要在所有的request之前插入
pkg/internal/client/txn.go Send
|
|
生成BeginTransactionRequest, key的取值和第一条write request的key一致, 此行数据即为Transaction record
.
TxnCoordSender负责生成事务相关的元数据,并后台执行heartbeat request
pkg/kv/txn_coord_sender.go Send
修改txnMeta.keys
txnMeta.Keys记载修改了哪些key,方便之后commit或者rollback进行处理。
|
|
添加heartbeat request
|
|
tc.updateState会调用tc.heartbeatLoop
循环给transaction record发送heartbeat request。
默认心跳间隔为1秒。
DistSender根据不同的key,选择不同的range
pkg/kv/dist_sender.go DistSender
获取不同range描述的堆栈
|
|
发送请求堆栈
|
|
GRPC transport
初始化
pkg/kv/transport.go
|
|
GRPC服务定义
pkg/roachpb/api.proto
|
|
服务实现
pkg/server/node.go Batch
|
|
gRPC调用
pkg/kv/transport.go func (gt *grpcTransport) send
- 如果range在当前node,则直接使用localserver
|
|
- 如果range不在当前node,则调用远程方法
|
|
node, store, range传递Batch Request
pkg/server/node.go
pkg/storage/stores.go
pkg/storage/store.go
调用堆栈
|
|
replica转换batch request为replica command
pkg/storage/replica.go
调用堆栈
|
|
batch request到replica command对应表
pkg/storage/replica_command.go
|
|
BeginTransactionRequest对应的engine KV操作
pkg/storage/replica_command.go
|
|
key
: 包含了TRX ID
value
: reply.Txn包含了TxnMeta
|
|
Transaciton Record
|
|
key
: recordkey+ transaction uuid
value
: trx meta
ConditionalPutRequest对应的engine KV操作
pkg/storage/replica_command.go
pkg/storage/engine/engine.go
pkg/storage/engine/rocksdb.go
|
|
metaKey
:
|
|
versionKey
:
|
|
newMeta
:
|
|
|
|