Commit 00ff43ff authored by 张振华's avatar 张振华

修改内容

parent 13f3e16f
# 一、现状 # # 一、现状 #
...@@ -49,7 +49,7 @@ dbCache=128 ...@@ -49,7 +49,7 @@ dbCache=128
[exec] [exec]
enableMVCC=true enableMVCC=true
上述字段置为true,则说明系统开启了MVCC能力。 上述字段置为true,则说明系统开启了MVCC能力。
开启该功能,需要重新开始同步区块,因为系统对于数据的存储格式及存储位置都有变化调整,如果不重新开始,会出现问题。 开启该功能,需要从头开始同步区块,因为系统对于数据的存储格式及存储位置都有变化调整,如果不从头开始同步区块数据,会出问题。
### 新增区块 ### 新增区块
1.ExecBlock的处理中,通过EventExecTxList触发执行器,执行交易(检查交易,处理手续费,调用具体执行器执行交易),获得交易执行结果KV及日志,存储在receipts,并将kv及StateHash写入Store数据库(通过EventStoreMemSet、EventStoreRollback、EventStoreCommit几个消息触发,分为Set-获得stateHash、Rollback-失败回滚、Commit-提交存储几个步骤)。 1.ExecBlock的处理中,通过EventExecTxList触发执行器,执行交易(检查交易,处理手续费,调用具体执行器执行交易),获得交易执行结果KV及日志,存储在receipts,并将kv及StateHash写入Store数据库(通过EventStoreMemSet、EventStoreRollback、EventStoreCommit几个消息触发,分为Set-获得stateHash、Rollback-失败回滚、Commit-提交存储几个步骤)。
...@@ -57,28 +57,34 @@ enableMVCC=true ...@@ -57,28 +57,34 @@ enableMVCC=true
关于AddMVCC的处理过程描述如下: 关于AddMVCC的处理过程描述如下:
1).首先从本地数据库使用prevHash来获得对应的version 1).首先从本地数据库使用prevHash来获得对应的version
本地数据库中的对应关系:.-mvcc-m.hash->version 本地数据库中的对应关系:
.-mvcc-m.hash->version
校验版本号信息是对的(hash对应的version与preHash对应的preVersion相差1) 校验版本号信息是对的(hash对应的version与preHash对应的preVersion相差1)
2).SetVersionKV 2).SetVersionKV
按如下对应的key-value关系,加入kvset 按如下对应的key-value关系,加入kvset
.-mvcc-m.hash->version .-mvcc-m.hash->version
.-mvcc-m.version.000000000000xx->hash .-mvcc-m.version.000000000000xx->hash
3).对于原有的kv进行GetSaveKV处理,生成MVCC的对应version的kv数据,并加入kvset 3).对于原有的kv进行GetSaveKV处理,生成MVCC的对应version的kv数据,并加入kvset
.-mvcc-.d.key.version->value .-mvcc-.d.key.version->value
4).生成对应版本的versionkeylist数据,并加入kvset 4).生成对应版本的versionkeylist数据,并加入kvset
.-mvcc-.m.versionkl.000000000000xx->delkeys .-mvcc-.m.versionkl.000000000000xx->delkeys
这个数据用于回滚删除数据 这个数据用于回滚区块时删除数据使用
### 删除区块 ### 删除区块
1.从本地数据中,通过批量删除tx信息 1.从本地数据中,通过批量删除tx信息
通过EventDelBlock消息触发执行器执行删除交易,获得要删除的kv的正确格式,如果系统配置为支持MVCC,则相关kv要使用DelMVCC处理改造,才能从本地数据库中正确删除;也包括要删除的手续费信息:TotalFeeKey:hash->fee 通过EventDelBlock消息触发执行器执行删除交易,获得要删除的kv的正确格式,如果系统配置为支持MVCC,则相关kv要使用DelMVCC处理改造,才能从本地数据库中正确删除;也包括要删除的手续费信息:
TotalFeeKey:hash->fee
关于DelMVCC的处理过程描述如下: 关于DelMVCC的处理过程描述如下:
1).获取最大的version,检查与要删除的version相等。(删除区块必须从最高区块开始序删除)。 1).获取最大的version,检查与要删除的version相等。(删除区块必须从最高区块开始序删除)。
2).DelVersionKV 2).DelVersionKV
按如下对应的key-value关系,加入要删除的kvset 按如下对应的key-value关系,加入要删除的kvset
.-mvcc-m.hash->version .-mvcc-m.hash->version
.-mvcc-m.version.000000000000xx->hash .-mvcc-m.version.000000000000xx->hash
新增区块时,保存的对应版本的versionkeylist数据也加入要删除的kvset:
.-mvcc-.m.versionkl.000000000000xx->delkeys
2.从db中删除block相关的信息 2.从db中删除block相关的信息
### 开启MVCC与关闭MVCC时的数据读写区别 ### 开启MVCC与关闭MVCC时的数据读写区别
...@@ -121,7 +127,7 @@ Store需要新增接口EventStoreDel,按照要删除的区块高度height,St ...@@ -121,7 +127,7 @@ Store需要新增接口EventStoreDel,按照要删除的区块高度height,St
![kvdb-mvcc结构层次示意图](./resource/kvdb-mvcc-arch.png) ![kvdb-mvcc结构层次示意图](./resource/kvdb-mvcc-arch.png)
底层为leveldb数据库,提供基础的数据存取能力。 底层为leveldb数据库,提供基础的数据存取能力。
上层为对外接口,支持Store原来的对外接口,并提供对回滚区块删除数据的新接口EventStoreDel的支持。 上层为对外接口,支持Store原来的对外接口,并提供对回滚区块删除数据的新接口EventStoreDel的支持。
MVCC处理层作为中间层,对传入的kv或者要查询的k,先进行mvcc的加工处理,再进行数据的存储或者读取,使MVCC的机制能够正常工作。这一层的处理参考现有系统的MVCC实现方式进行改造。 MVCC处理层作为中间层,对传入的kv或者要查询的k,先进行mvcc的加工处理(主要是数据Key的的加工处理:Prefix+Key+version,以便和数据库中的存储数据格式对应起来),再进行数据的存储或者读取,使MVCC的机制能够正常工作。这一层的处理参考现有系统的MVCC实现方式进行改造。
## 5.与当前实现的差异点分析,参见"开启MVCC与关闭MVCC时的数据读写区别"中的表格描述 ## 5.与当前实现的差异点分析,参见"开启MVCC与关闭MVCC时的数据读写区别"中的表格描述
![kvdb-mvcc示意图](./resource/mvcc-diff.png) ![kvdb-mvcc示意图](./resource/mvcc-diff.png)
\ No newline at end of file
resource/mvcc.png

58.3 KB | W: | H:

resource/mvcc.png

62.7 KB | W: | H:

resource/mvcc.png
resource/mvcc.png
resource/mvcc.png
resource/mvcc.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment