Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
c2a382d9
Commit
c2a382d9
authored
Feb 14, 2019
by
liuyuhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add kvmvccMavl
parent
a09d4922
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
194 additions
and
93 deletions
+194
-93
round_state.go
plugin/consensus/tendermint/types/round_state.go
+3
-3
certutils.go
...rt/authority/tools/cryptogen/generator/utils/certutils.go
+6
-6
init.go
plugin/store/init/init.go
+3
-3
kvmvccMavl.go
plugin/store/kvmvccMavl/kvmvccMavl.go
+112
-46
kvmvccMavl_test.go
plugin/store/kvmvccMavl/kvmvccMavl_test.go
+63
-24
kvmvccdb.go
plugin/store/kvmvccMavl/kvmvccdb.go
+1
-4
mavl.go
plugin/store/kvmvccMavl/mavl.go
+6
-7
No files found.
plugin/consensus/tendermint/types/round_state.go
View file @
c2a382d9
...
...
@@ -117,9 +117,9 @@ type RoundState struct {
// RoundStateMessage ...
func
(
rs
*
RoundState
)
RoundStateMessage
()
*
tmtypes
.
NewRoundStepMsg
{
return
&
tmtypes
.
NewRoundStepMsg
{
Height
:
rs
.
Height
,
Round
:
int32
(
rs
.
Round
),
Step
:
int32
(
rs
.
Step
),
Height
:
rs
.
Height
,
Round
:
int32
(
rs
.
Round
),
Step
:
int32
(
rs
.
Step
),
SecondsSinceStartTime
:
int32
(
time
.
Since
(
rs
.
StartTime
)
.
Seconds
()),
LastCommitRound
:
int32
(
rs
.
LastCommit
.
Round
()),
}
...
...
plugin/dapp/cert/authority/tools/cryptogen/generator/utils/certutils.go
View file @
c2a382d9
...
...
@@ -78,9 +78,9 @@ func ParseX509CertificateToSm2(x509Cert *x509.Certificate) *sm2.Certificate {
UnknownExtKeyUsage
:
x509Cert
.
UnknownExtKeyUsage
,
BasicConstraintsValid
:
x509Cert
.
BasicConstraintsValid
,
IsCA
:
x509Cert
.
IsCA
,
MaxPathLen
:
x509Cert
.
MaxPathLen
,
MaxPathLenZero
:
x509Cert
.
MaxPathLenZero
,
IsCA
:
x509Cert
.
IsCA
,
MaxPathLen
:
x509Cert
.
MaxPathLen
,
MaxPathLenZero
:
x509Cert
.
MaxPathLenZero
,
SubjectKeyId
:
x509Cert
.
SubjectKeyId
,
AuthorityKeyId
:
x509Cert
.
AuthorityKeyId
,
...
...
@@ -141,9 +141,9 @@ func ParseSm2CertificateToX509(sm2Cert *sm2.Certificate) *x509.Certificate {
UnknownExtKeyUsage
:
sm2Cert
.
UnknownExtKeyUsage
,
BasicConstraintsValid
:
sm2Cert
.
BasicConstraintsValid
,
IsCA
:
sm2Cert
.
IsCA
,
MaxPathLen
:
sm2Cert
.
MaxPathLen
,
MaxPathLenZero
:
sm2Cert
.
MaxPathLenZero
,
IsCA
:
sm2Cert
.
IsCA
,
MaxPathLen
:
sm2Cert
.
MaxPathLen
,
MaxPathLenZero
:
sm2Cert
.
MaxPathLenZero
,
SubjectKeyId
:
sm2Cert
.
SubjectKeyId
,
AuthorityKeyId
:
sm2Cert
.
AuthorityKeyId
,
...
...
plugin/store/init/init.go
View file @
c2a382d9
package
init
import
(
_
"github.com/33cn/plugin/plugin/store/kvdb"
//auto gen
_
"github.com/33cn/plugin/plugin/store/kvmvcc"
//auto gen
_
"github.com/33cn/plugin/plugin/store/mpt"
//auto gen
_
"github.com/33cn/plugin/plugin/store/kvdb"
//auto gen
_
"github.com/33cn/plugin/plugin/store/kvmvcc"
//auto gen
_
"github.com/33cn/plugin/plugin/store/kvmvccMavl"
//auto gen
_
"github.com/33cn/plugin/plugin/store/mpt"
//auto gen
)
plugin/store/kvmvccMavl/kvmvccMavl.go
View file @
c2a382d9
...
...
@@ -2,29 +2,45 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
kvmvccMavl
// Package kvmvccmavl kvmvcc+mavl接口
package
kvmvccmavl
import
(
"bytes"
"errors"
"fmt"
"sync"
"sync/atomic"
dbm
"github.com/33cn/chain33/common/db"
clog
"github.com/33cn/chain33/common/log"
log
"github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/queue"
drivers
"github.com/33cn/chain33/system/store"
"github.com/33cn/chain33/types"
"github.com/hashicorp/golang-lru"
"errors"
)
var
(
kmlog
=
log
.
New
(
"module"
,
"kvmvccMavl"
)
ErrStateHashLost
=
errors
.
New
(
"ErrStateHashLost"
)
kvmvccMavlFork
int64
=
200
*
10000
// ErrStateHashLost ...
ErrStateHashLost
=
errors
.
New
(
"ErrStateHashLost"
)
kvmvccMavlFork
int64
=
200
*
10000
isDelMavlData
=
false
delMavlDataHeight
=
kvmvccMavlFork
+
10000
delMavlDataState
int32
wg
sync
.
WaitGroup
quit
bool
)
const
(
canceSize
=
2048
//可以缓存2048个roothash, height对
canceSize
=
2048
//可以缓存2048个roothash, height对
batchDataSize
=
1024
*
1024
*
1
delMavlStateStart
=
1
delMavlStateEnd
=
0
mvccPrefix
=
".-mvcc-."
//同common/db中的mvccPrefix一致
)
// SetLogLevel set log level
func
SetLogLevel
(
level
string
)
{
clog
.
SetLogLevel
(
level
)
...
...
@@ -39,13 +55,12 @@ func init() {
drivers
.
Reg
(
"kvmvccMavl"
,
New
)
}
// KV
MVCC
MavlStore provide kvmvcc and mavl store interface implementation
type
KV
MVCC
MavlStore
struct
{
// KV
m
MavlStore provide kvmvcc and mavl store interface implementation
type
KV
m
MavlStore
struct
{
*
drivers
.
BaseStore
*
KVMVCCStore
*
MavlStore
cance
*
lru
.
Cache
}
type
subKVMVCCConfig
struct
{
...
...
@@ -70,7 +85,7 @@ type subConfig struct {
// New construct KVMVCCStore module
func
New
(
cfg
*
types
.
Store
,
sub
[]
byte
)
queue
.
Module
{
bs
:=
drivers
.
NewBaseStore
(
cfg
)
var
kvms
*
KV
MVCC
MavlStore
var
kvms
*
KV
m
MavlStore
var
subcfg
subConfig
var
subKVMVCCcfg
subKVMVCCConfig
var
subMavlcfg
subMavlConfig
...
...
@@ -78,31 +93,38 @@ func New(cfg *types.Store, sub []byte) queue.Module {
types
.
MustDecode
(
sub
,
&
subcfg
)
subKVMVCCcfg
.
EnableMVCCIter
=
subcfg
.
EnableMVCCIter
subMavlcfg
.
EnableMavlPrefix
=
subcfg
.
EnableMavlPrefix
subMavlcfg
.
EnableMVCC
=
subcfg
.
EnableMVCC
subMavlcfg
.
EnableMavlPrune
=
subcfg
.
EnableMavlPrune
subMavlcfg
.
PruneHeight
=
subcfg
.
PruneHeight
subMavlcfg
.
EnableMVCC
=
subcfg
.
EnableMVCC
subMavlcfg
.
EnableMavlPrune
=
subcfg
.
EnableMavlPrune
subMavlcfg
.
PruneHeight
=
subcfg
.
PruneHeight
}
cance
,
err
:=
lru
.
New
(
canceSize
)
if
err
!=
nil
{
panic
(
"new KV
MVCC
MavlStore fail"
)
panic
(
"new KV
m
MavlStore fail"
)
}
kvms
=
&
KV
MVCC
MavlStore
{
bs
,
NewKVMVCC
(
&
subKVMVCCcfg
,
bs
.
GetDB
()),
kvms
=
&
KV
m
MavlStore
{
bs
,
NewKVMVCC
(
&
subKVMVCCcfg
,
bs
.
GetDB
()),
NewMavl
(
&
subMavlcfg
,
bs
.
GetDB
()),
cance
}
// 查询是否已经删除mavl
_
,
err
=
bs
.
GetDB
()
.
Get
(
genDelMavlKey
(
mvccPrefix
))
if
err
==
nil
{
isDelMavlData
=
true
}
bs
.
SetChild
(
kvms
)
return
kvms
}
// Close the KVMVCCMavlStore module
func
(
kvmMavls
*
KVMVCCMavlStore
)
Close
()
{
// Close the KVmMavlStore module
func
(
kvmMavls
*
KVmMavlStore
)
Close
()
{
quit
=
true
wg
.
Wait
()
kvmMavls
.
BaseStore
.
Close
()
kvmMavls
.
KVMVCCStore
.
Close
()
kvmMavls
.
MavlStore
.
Close
()
kmlog
.
Info
(
"store kvmMavls closed"
)
}
// Set kvs with statehash to KV
MVCC
MavlStore
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
Set
(
datas
*
types
.
StoreSet
,
sync
bool
)
([]
byte
,
error
)
{
// Set kvs with statehash to KV
m
MavlStore
func
(
kvmMavls
*
KV
m
MavlStore
)
Set
(
datas
*
types
.
StoreSet
,
sync
bool
)
([]
byte
,
error
)
{
// 这里后续需要考虑分叉回退
if
datas
.
Height
<
kvmvccMavlFork
{
hash
,
err
:=
kvmMavls
.
MavlStore
.
Set
(
datas
,
sync
)
...
...
@@ -123,13 +145,18 @@ func (kvmMavls *KVMVCCMavlStore) Set(datas *types.StoreSet, sync bool) ([]byte,
if
err
==
nil
{
kvmMavls
.
cance
.
Add
(
string
(
hash
),
datas
.
Height
)
}
// 删除Mavl数据
if
datas
.
Height
>
delMavlDataHeight
&&
!
isDelMavlData
&&
!
isDelMavling
()
{
wg
.
Add
(
1
)
go
DelMavl
(
kvmMavls
.
GetDB
())
}
return
hash
,
err
}
// Get kvs with statehash from KV
MVCC
MavlStore
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
Get
(
datas
*
types
.
StoreGet
)
[][]
byte
{
// Get kvs with statehash from KV
m
MavlStore
func
(
kvmMavls
*
KV
m
MavlStore
)
Get
(
datas
*
types
.
StoreGet
)
[][]
byte
{
if
value
,
ok
:=
kvmMavls
.
cance
.
Get
(
string
(
datas
.
StateHash
));
ok
{
if
value
.
(
int64
)
<
kvmvccMavlFork
{
if
value
.
(
int64
)
<
kvmvccMavlFork
{
return
kvmMavls
.
MavlStore
.
Get
(
datas
)
}
return
kvmMavls
.
KVMVCCStore
.
Get
(
datas
)
...
...
@@ -137,8 +164,8 @@ func (kvmMavls *KVMVCCMavlStore) Get(datas *types.StoreGet) [][]byte {
return
kvmMavls
.
KVMVCCStore
.
Get
(
datas
)
}
// MemSet set kvs to the mem of KV
MVCC
MavlStore module and return the StateHash
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
MemSet
(
datas
*
types
.
StoreSet
,
sync
bool
)
([]
byte
,
error
)
{
// MemSet set kvs to the mem of KV
m
MavlStore module and return the StateHash
func
(
kvmMavls
*
KV
m
MavlStore
)
MemSet
(
datas
*
types
.
StoreSet
,
sync
bool
)
([]
byte
,
error
)
{
// 这里后续需要考虑分叉回退
if
datas
.
Height
<
kvmvccMavlFork
{
hash
,
err
:=
kvmMavls
.
MavlStore
.
MemSet
(
datas
,
sync
)
...
...
@@ -159,21 +186,23 @@ func (kvmMavls *KVMVCCMavlStore) MemSet(datas *types.StoreSet, sync bool) ([]byt
if
err
==
nil
{
kvmMavls
.
cance
.
Add
(
string
(
hash
),
datas
.
Height
)
}
// 删除Mavl数据
if
datas
.
Height
>
delMavlDataHeight
&&
!
isDelMavlData
&&
!
isDelMavling
()
{
wg
.
Add
(
1
)
go
DelMavl
(
kvmMavls
.
GetDB
())
}
return
hash
,
err
}
// Commit kvs in the mem of KV
MVCC
MavlStore module to state db and return the StateHash
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
Commit
(
req
*
types
.
ReqHash
)
([]
byte
,
error
)
{
// Commit kvs in the mem of KV
m
MavlStore module to state db and return the StateHash
func
(
kvmMavls
*
KV
m
MavlStore
)
Commit
(
req
*
types
.
ReqHash
)
([]
byte
,
error
)
{
if
value
,
ok
:=
kvmMavls
.
cance
.
Get
(
string
(
req
.
Hash
));
ok
{
if
value
.
(
int64
)
<
kvmvccMavlFork
{
hash
,
err
:=
kvmMavls
.
MavlStore
.
Commit
(
req
)
hash
,
err
:=
kvmMavls
.
MavlStore
.
Commit
(
req
)
if
err
!=
nil
{
return
hash
,
err
}
_
,
err
=
kvmMavls
.
KVMVCCStore
.
Commit
(
req
)
if
err
!=
nil
{
return
hash
,
err
}
return
hash
,
err
}
return
kvmMavls
.
KVMVCCStore
.
Commit
(
req
)
...
...
@@ -181,18 +210,15 @@ func (kvmMavls *KVMVCCMavlStore) Commit(req *types.ReqHash) ([]byte, error) {
return
kvmMavls
.
KVMVCCStore
.
Commit
(
req
)
}
// Rollback kvs in the mem of KV
MVCC
MavlStore module and return the StateHash
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
Rollback
(
req
*
types
.
ReqHash
)
([]
byte
,
error
)
{
// Rollback kvs in the mem of KV
m
MavlStore module and return the StateHash
func
(
kvmMavls
*
KV
m
MavlStore
)
Rollback
(
req
*
types
.
ReqHash
)
([]
byte
,
error
)
{
if
value
,
ok
:=
kvmMavls
.
cance
.
Get
(
string
(
req
.
Hash
));
ok
{
if
value
.
(
int64
)
<
kvmvccMavlFork
{
hash
,
err
:=
kvmMavls
.
MavlStore
.
Rollback
(
req
)
if
value
.
(
int64
)
<
kvmvccMavlFork
{
hash
,
err
:=
kvmMavls
.
MavlStore
.
Rollback
(
req
)
if
err
!=
nil
{
return
hash
,
err
}
_
,
err
=
kvmMavls
.
KVMVCCStore
.
Rollback
(
req
)
if
err
!=
nil
{
return
hash
,
err
}
return
hash
,
err
}
return
kvmMavls
.
KVMVCCStore
.
Rollback
(
req
)
...
...
@@ -201,9 +227,9 @@ func (kvmMavls *KVMVCCMavlStore) Rollback(req *types.ReqHash) ([]byte, error) {
}
// IterateRangeByStateHash travel with Prefix by StateHash to get the latest version kvs.
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
IterateRangeByStateHash
(
statehash
[]
byte
,
start
[]
byte
,
end
[]
byte
,
ascending
bool
,
fn
func
(
key
,
value
[]
byte
)
bool
)
{
func
(
kvmMavls
*
KV
m
MavlStore
)
IterateRangeByStateHash
(
statehash
[]
byte
,
start
[]
byte
,
end
[]
byte
,
ascending
bool
,
fn
func
(
key
,
value
[]
byte
)
bool
)
{
if
value
,
ok
:=
kvmMavls
.
cance
.
Get
(
string
(
statehash
));
ok
{
if
value
.
(
int64
)
<
kvmvccMavlFork
{
if
value
.
(
int64
)
<
kvmvccMavlFork
{
kvmMavls
.
MavlStore
.
IterateRangeByStateHash
(
statehash
,
start
,
end
,
ascending
,
fn
)
return
}
...
...
@@ -211,16 +237,15 @@ func (kvmMavls *KVMVCCMavlStore) IterateRangeByStateHash(statehash []byte, start
return
}
kvmMavls
.
KVMVCCStore
.
IterateRangeByStateHash
(
statehash
,
start
,
end
,
ascending
,
fn
)
return
}
// ProcEvent handles supported events
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
ProcEvent
(
msg
queue
.
Message
)
{
msg
.
ReplyErr
(
"KV
MVCC
MavlStore"
,
types
.
ErrActionNotSupport
)
func
(
kvmMavls
*
KV
m
MavlStore
)
ProcEvent
(
msg
queue
.
Message
)
{
msg
.
ReplyErr
(
"KV
m
MavlStore"
,
types
.
ErrActionNotSupport
)
}
// Del set kvs to nil with StateHash
func
(
kvmMavls
*
KV
MVCC
MavlStore
)
Del
(
req
*
types
.
StoreDel
)
([]
byte
,
error
)
{
func
(
kvmMavls
*
KV
m
MavlStore
)
Del
(
req
*
types
.
StoreDel
)
([]
byte
,
error
)
{
// 这里后续需要考虑分叉回退
if
req
.
Height
<
kvmvccMavlFork
{
hash
,
err
:=
kvmMavls
.
MavlStore
.
Del
(
req
)
...
...
@@ -244,6 +269,48 @@ func (kvmMavls *KVMVCCMavlStore) Del(req *types.StoreDel) ([]byte, error) {
return
hash
,
err
}
//
TODO
数据库中mavl的清除
//
DelMavl
数据库中mavl的清除
// 达到kvmvccMavlFork + 100000 后触发清除
// it := db.Iterator(nil, mvccPrefix, true)
\ No newline at end of file
func
DelMavl
(
db
dbm
.
DB
)
{
defer
wg
.
Done
()
setDelMavl
(
delMavlStateStart
)
defer
setDelMavl
(
delMavlStateEnd
)
isDel
:=
delMavlData
(
db
)
if
isDel
{
isDelMavlData
=
true
kmlog
.
Info
(
"DelMavl success"
)
}
}
func
delMavlData
(
db
dbm
.
DB
)
bool
{
it
:=
db
.
Iterator
(
nil
,
nil
,
true
)
batch
:=
db
.
NewBatch
(
true
)
for
it
.
Rewind
();
it
.
Valid
();
it
.
Next
()
{
if
quit
{
return
false
}
if
!
bytes
.
HasPrefix
(
it
.
Key
(),
[]
byte
(
mvccPrefix
))
{
// 将非mvcc的mavl数据全部删除
batch
.
Delete
(
it
.
Key
())
if
batch
.
ValueSize
()
>
batchDataSize
{
batch
.
Write
()
batch
.
Reset
()
}
}
}
batch
.
Set
(
genDelMavlKey
(
mvccPrefix
),
[]
byte
(
""
))
batch
.
Write
()
return
true
}
func
genDelMavlKey
(
prefix
string
)
[]
byte
{
delMavl
:=
"--delMavlData--"
return
[]
byte
(
fmt
.
Sprintf
(
"%s%s"
,
prefix
,
delMavl
))
}
func
isDelMavling
()
bool
{
return
atomic
.
LoadInt32
(
&
delMavlDataState
)
==
1
}
func
setDelMavl
(
state
int32
)
{
atomic
.
StoreInt32
(
&
delMavlDataState
,
state
)
}
plugin/store/kvmvccMavl/kvmvccMavl_test.go
View file @
c2a382d9
...
...
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
kvmvcc
M
avl
package
kvmvcc
m
avl
import
(
"encoding/json"
...
...
@@ -37,7 +37,7 @@ func TestKvmvccMavlNewClose(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
store
.
Close
()
...
...
@@ -49,7 +49,7 @@ func TestKvmvccMavlSetGet(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
kvmvccMavlFork
=
50
...
...
@@ -82,7 +82,7 @@ func TestKvmvccMavlMemSet(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
kvmvccMavlFork
=
50
...
...
@@ -120,7 +120,7 @@ func TestKvmvccMavlCommit(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
var
kv
[]
*
types
.
KeyValue
...
...
@@ -166,7 +166,7 @@ func TestKvmvccMavlCommit(t *testing.T) {
get
:=
&
types
.
StoreGet
{
StateHash
:
frontHash
,
Keys
:
keys
}
values
:=
store
.
Get
(
get
)
require
.
Equal
(
t
,
len
(
values
),
len
(
keys
))
for
i
,
_
:=
range
keys
{
for
i
:=
range
keys
{
require
.
Equal
(
t
,
kv
[
i
]
.
Value
,
values
[
i
])
}
}
...
...
@@ -175,7 +175,7 @@ func TestKvmvccMavlCommit(t *testing.T) {
get
:=
&
types
.
StoreGet
{
StateHash
:
hash
,
Keys
:
keys
}
values
:=
store
.
Get
(
get
)
require
.
Equal
(
t
,
len
(
values
),
len
(
keys
))
for
i
,
_
:=
range
keys
{
for
i
:=
range
keys
{
require
.
Equal
(
t
,
kv
[
i
]
.
Value
,
values
[
i
])
}
}
...
...
@@ -187,7 +187,7 @@ func TestKvmvccMavlRollback(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
var
kv
[]
*
types
.
KeyValue
...
...
@@ -250,7 +250,7 @@ func TestKvmvccdbRollbackBatch(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
var
kv
[]
*
types
.
KeyValue
...
...
@@ -351,7 +351,7 @@ func TestIterateRangeByStateHash(t *testing.T) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
storeCfg
,
sub
:=
newStoreCfgIter
(
dir
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
t
,
store
)
execaddr
:=
"0111vcBNSEA7fZhAdLJphDwQRQJa111"
...
...
@@ -499,6 +499,45 @@ func GetRandomString(length int) string {
return
common
.
GetRandPrintString
(
20
,
length
)
}
func
TestDelMavlData
(
t
*
testing
.
T
)
{
dir
,
err
:=
ioutil
.
TempDir
(
""
,
"example"
)
assert
.
Nil
(
t
,
err
)
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
storeCfg
,
sub
:=
newStoreCfgIter
(
dir
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KVmMavlStore
)
assert
.
NotNil
(
t
,
store
)
db
:=
store
.
GetDB
()
db
.
Set
([]
byte
(
mvccPrefix
),
[]
byte
(
"value1"
))
db
.
Set
([]
byte
(
fmt
.
Sprintf
(
"%s123"
,
mvccPrefix
)),
[]
byte
(
"value2"
))
db
.
Set
([]
byte
(
fmt
.
Sprintf
(
"%s546"
,
mvccPrefix
)),
[]
byte
(
"value3"
))
db
.
Set
([]
byte
(
fmt
.
Sprintf
(
"123%s"
,
mvccPrefix
)),
[]
byte
(
"value4"
))
db
.
Set
([]
byte
(
"key11"
),
[]
byte
(
"value11"
))
db
.
Set
([]
byte
(
"key22"
),
[]
byte
(
"value22"
))
delMavlData
(
db
)
v
,
err
:=
db
.
Get
([]
byte
(
mvccPrefix
))
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
[]
byte
(
"value1"
),
v
)
v
,
err
=
db
.
Get
([]
byte
(
fmt
.
Sprintf
(
"%s123"
,
mvccPrefix
)))
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
[]
byte
(
"value2"
),
v
)
v
,
err
=
db
.
Get
([]
byte
(
fmt
.
Sprintf
(
"%s546"
,
mvccPrefix
)))
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
[]
byte
(
"value3"
),
v
)
_
,
err
=
db
.
Get
([]
byte
(
fmt
.
Sprintf
(
"123%s"
,
mvccPrefix
)))
require
.
Error
(
t
,
err
)
_
,
err
=
db
.
Get
([]
byte
(
"key11"
))
require
.
Error
(
t
,
err
)
_
,
err
=
db
.
Get
([]
byte
(
"key22"
))
require
.
Error
(
t
,
err
)
_
,
err
=
db
.
Get
(
genDelMavlKey
(
mvccPrefix
))
require
.
NoError
(
t
,
err
)
}
func
BenchmarkGetkmvccMavl
(
b
*
testing
.
B
)
{
benchmarkGet
(
b
,
false
)
}
func
BenchmarkGetkmvcc
(
b
*
testing
.
B
)
{
benchmarkGet
(
b
,
true
)
}
...
...
@@ -509,7 +548,7 @@ func benchmarkGet(b *testing.B, isResetForkHeight bool) {
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -570,7 +609,7 @@ func benchmarkStoreGetKvs4N(b *testing.B, isResetForkHeight bool) {
}
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
var
kv
[]
*
types
.
KeyValue
...
...
@@ -618,7 +657,7 @@ func benchmarkStoreGetKvsForNN(b *testing.B, isResetForkHeight bool) {
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -688,7 +727,7 @@ func benchmarkStoreGetKvsFor10000(b *testing.B, isResetForkHeight bool) {
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -763,7 +802,7 @@ func benchmarkGetIter(b *testing.B, isResetForkHeight bool) {
os
.
RemoveAll
(
dir
)
//删除已存在目录
storeCfg
,
sub
:=
newStoreCfgIter
(
dir
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -816,7 +855,7 @@ func benchmarkSet(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
b
.
Log
(
dir
)
...
...
@@ -863,7 +902,7 @@ func benchmarkStoreSet(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -908,7 +947,7 @@ func benchmarkSetIter(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
storeCfg
,
sub
:=
newStoreCfgIter
(
dir
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
b
.
Log
(
dir
)
...
...
@@ -955,7 +994,7 @@ func benchmarkMemSet(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -999,7 +1038,7 @@ func benchmarkStoreMemSet(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -1047,7 +1086,7 @@ func benchmarkCommit(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -1097,7 +1136,7 @@ func benchmarkStoreCommit(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
var
storeCfg
=
newStoreCfg
(
dir
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
nil
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -1151,7 +1190,7 @@ func benchmarkIterMemSet(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
storeCfg
,
sub
:=
newStoreCfgIter
(
dir
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
@@ -1194,7 +1233,7 @@ func benchmarkIterCommit(b *testing.B, isResetForkHeight bool) {
defer
os
.
RemoveAll
(
dir
)
// clean up
os
.
RemoveAll
(
dir
)
//删除已存在目录
storeCfg
,
sub
:=
newStoreCfgIter
(
dir
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
MVCC
MavlStore
)
store
:=
New
(
storeCfg
,
sub
)
.
(
*
KV
m
MavlStore
)
assert
.
NotNil
(
b
,
store
)
if
isResetForkHeight
{
...
...
plugin/store/kvmvccMavl/kvmvccdb.go
View file @
c2a382d9
...
...
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
kvmvcc
M
avl
package
kvmvcc
m
avl
import
(
"github.com/33cn/chain33/common"
...
...
@@ -12,10 +12,8 @@ import (
"github.com/golang/protobuf/proto"
)
var
maxRollbackNum
=
200
// KVMVCCStore provide kvmvcc store interface implementation
type
KVMVCCStore
struct
{
db
dbm
.
DB
...
...
@@ -24,7 +22,6 @@ type KVMVCCStore struct {
enableMVCCIter
bool
}
// NewKVMVCC construct KVMVCCStore module
func
NewKVMVCC
(
sub
*
subKVMVCCConfig
,
db
dbm
.
DB
)
*
KVMVCCStore
{
var
kvs
*
KVMVCCStore
...
...
plugin/store/kvmvccMavl/mavl.go
View file @
c2a382d9
...
...
@@ -2,20 +2,19 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package mavl 默克尔平衡树接口
package
kvmvccMavl
package
kvmvccmavl
import
(
"sync"
"github.com/33cn/chain33/common"
dbm
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/queue"
"github.com/33cn/chain33/system/store/mavl/db"
"github.com/33cn/chain33/types"
dbm
"github.com/33cn/chain33/common/db"
)
// Store mavl store struct
//
Mavl
Store mavl store struct
type
MavlStore
struct
{
db
dbm
.
DB
trees
*
sync
.
Map
...
...
@@ -30,9 +29,9 @@ func NewMavl(sub *subMavlConfig, db dbm.DB) *MavlStore {
var
subcfg
subMavlConfig
if
sub
!=
nil
{
subcfg
.
EnableMavlPrefix
=
sub
.
EnableMavlPrefix
subcfg
.
EnableMVCC
=
sub
.
EnableMVCC
subcfg
.
EnableMavlPrune
=
sub
.
EnableMavlPrune
subcfg
.
PruneHeight
=
sub
.
PruneHeight
subcfg
.
EnableMVCC
=
sub
.
EnableMVCC
subcfg
.
EnableMavlPrune
=
sub
.
EnableMavlPrune
subcfg
.
PruneHeight
=
sub
.
PruneHeight
}
mavls
:=
&
MavlStore
{
db
,
&
sync
.
Map
{},
subcfg
.
EnableMavlPrefix
,
subcfg
.
EnableMVCC
,
subcfg
.
EnableMavlPrune
,
subcfg
.
PruneHeight
}
mavl
.
EnableMavlPrefix
(
subcfg
.
EnableMavlPrefix
)
...
...
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