Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
share
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张振华
share
Commits
19f3eab3
Commit
19f3eab3
authored
Sep 03, 2018
by
张振华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
change format
parent
6050fddd
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
18 additions
and
18 deletions
+18
-18
Store新增支持MVCC的KVDB实现.md
Store新增支持MVCC的KVDB实现.md
+18
-18
No files found.
Store新增支持MVCC的KVDB实现.md
View file @
19f3eab3
# 一、现
状 #
# 一、现
状 #
...
...
@@ -2,40 +2,40 @@
## 1.Store与外部的交互消息接口 ##

###EventStoreSet
###
EventStoreSet
该消息接口实际未被调用
###EventStoreGet
###
EventStoreGet
(1)接口由rpc接口调用时,逐层调用,比如GetAddrOverView/GetBalance/GetTokenBalance等,调用到channelClient的accountdb.LoadAccounts、accountdb.LoadExecAccountQueue等接口时,触发调用QueueProtocol的StoreGet接口,触发向Store发起EventStoreGet消息。
(2)执行器框架调用StateDB.Get接口时,如果系统配置不支持MVCC,则将通过EventStoreGet消息接口向Store发起数据查询。
Store在收到EventStoreGet消息时,将根据系统配置调用KVDB或者Mavl的Get接口查询数据,并返回结果。
###EventStoreMemSet
###
EventStoreMemSet
当同步区块或者生成区块时,Chain模块将调用connectBlock->ExecBlock->ExecTx->ExecKVMemSet将执行区块交易的kvset结果通过消息EventStoreMemSet写入Store的缓存。
Store在收到EventStoreMemSet消息时,将根据系统配置调用KVDB或者Mavl的MemSet接口将中间结果放入缓存,并返回kvset对应的StateHash。
###EventStoreRollback
###
EventStoreRollback
Chain在ExecBlock的处理中,校验EventStoreMemSet响应消息中的StateHash,如果不一致,则触发ExecKVSetRollback调用,将通过EventStoreRollback消息发起回滚。
Store收到回滚消息后,会将上一步缓存的内容删除。
###EventStoreCommit
###
EventStoreCommit
Chain在ExecBlock的处理中,校验EventStoreMemSet响应消息中的StateHash,如果一致,且后续执行正确,触发ExecKVSetCommit调用,将通过EventStoreCommit消息,通知Store持久化对应数据,Store根据系统配置调用KVDB或者Mavl的Commit接口将数据落盘。
###EventStoreGetTotalCoins
###
EventStoreGetTotalCoins
RPC接口调用GetTotalCoins,将通过channelClient调用accountdb.GetTotalCoins接口->调用QueueProtocol的StoreGetTotalCoins接口->通过消息EventStoreGetTotalCoins向Store发起数据查询
Store目前只有在配置为Mavl时,才支持该消息接口。(Mval实现了IterateRangeByStateHash接口,KVDB未实现该接口)
## 2.Store相关的类图关系 ##

##配置文件中和Store相关的配置
##
配置文件中和Store相关的配置
[
store
]
name="mavl"
driver="leveldb"
dbPath="datadir/kvdb"
dbCache=128
##结合类图关系有如下要点说明:
##
结合类图关系有如下要点说明:
1.
Store根据系统配置决定选择KVStore还是Store(Mavl)。
2.
Store的底层最终使用的db类型根据配置文件来定,可以是GoLevelDB或者GoMemDB,它们都实现的DB interface。
3.
KVStore的实现中,对数据的最新值进行存储,无法保存KV历史值,不能进行版本回滚。
...
...
@@ -45,13 +45,13 @@ dbCache=128

上图展示了新增区块和删除区块的主要处理逻辑及消息交互。
###MVCC的控制开关
###
MVCC的控制开关
[
exec
]
enableMVCC=true
上述字段置为true,则说明系统开启了MVCC能力。
开启该功能,需要重新开始同步区块,因为系统对于数据的存储格式及存储位置都有变化调整,如果不重新开始,会出现问题。
###新增区块
###
新增区块
1.
ExecBlock的处理中,通过EventExecTxList触发执行器,执行交易(检查交易,处理手续费,调用具体执行器执行交易),获得交易执行结果KV及日志,存储在receipts,并将kv及StateHash写入Store数据库(通过EventStoreMemSet、EventStoreRollback、EventStoreCommit几个消息触发,分为Set-获得stateHash、Rollback-失败回滚、Commit-提交存储几个步骤)。
2.
AddTxs将tx信息(KV)保存到本地数据库,其中要保存的KV数据,经过执行器的处理,如果系统配置为支持MVCC,则对相关KV按MVCC的处理方式进行改造,结果存储本地数据库;也包括手续费信息:TotalFeeKey:hash->fee
...
...
@@ -69,7 +69,7 @@ enableMVCC=true
.-mvcc-.m.versionkl.000000000000xx->delkeys
这个数据用于回滚删除数据。
###删除区块
###
删除区块
1.
从本地数据中,通过批量删除tx信息
通过EventDelBlock消息触发执行器执行删除交易,获得要删除的kv的正确格式,如果系统配置为支持MVCC,则相关kv要使用DelMVCC处理改造,才能从本地数据库中正确删除;也包括要删除的手续费信息:TotalFeeKey:hash->fee
...
...
@@ -81,7 +81,7 @@ enableMVCC=true
.-mvcc-m.version.000000000000xx->hash
2.
从db中删除block相关的信息
###开启MVCC与关闭MVCC时的数据读写区别
###
开启MVCC与关闭MVCC时的数据读写区别

...
...
@@ -105,19 +105,19 @@ dbCache=128
enableMVCC=true
##当配置为kvmvcc时,Store将按照如下方式进行statedb数据的维护
##
当配置为kvmvcc时,Store将按照如下方式进行statedb数据的维护

###1.增加区块
###
1.增加区块
Store收到EventStoreMemSet,会将收到的kvset数据打包生成hash(N)(假定新生成的块高为N),并和前一区块的StateHash(N-1)一起生成StateHash(N),即StateHash(N)=hash(StateHash(N-1)+hash(N))。Store将StateHash(N)及对应的version(height)关系数据存入statedb,将增加了MVCC版本号信息的KVSet数据存入statedb,将存入的KVSet的KeyVersionList数据存入statedb(用于在回滚区块时删除数据使用)。
###2.删除区块(回滚)
###
2.删除区块(回滚)
Store需要新增接口EventStoreDel,按照要删除的区块高度height,StateHash信息,删除在statedb中存储的对应version(height)的KVSet数据(先找到KeyVersionList数据,然后根据列表进行删除即可)。
删除区块的mvcc数据时,遵循倒序删除的规则,比如生成区块数据是0->1->2->3,删除区块数据只能从顶部开始删0->1->2->3->3(删除)->3'->4...
###3.查询数据
###
3.查询数据
当Store收到EventStoreGet消息,可以根据携带的StateHash或者height信息,从statedb中查找相应的key对应的value的值,查询时,key要拼接上version信息(height),以便查找到正确的版本数据。
###4.结构层次
###
4.结构层次

底层为leveldb数据库,提供基础的数据存取能力。
上层为对外接口,支持Store原来的对外接口,并提供对回滚区块删除数据的新接口EventStoreDel的支持。
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment