Skip to content

Commit b77b662

Browse files
committed
[db] add ReadState() method
1 parent 7ee866e commit b77b662

File tree

4 files changed

+37
-36
lines changed

4 files changed

+37
-36
lines changed

db/kvstore.go

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
package db
77

88
import (
9-
"github.com/iotexproject/iotex-core/v2/pkg/lifecycle"
9+
"github.com/pkg/errors"
1010

1111
"github.com/iotexproject/iotex-core/v2/db/batch"
12+
"github.com/iotexproject/iotex-core/v2/pkg/lifecycle"
13+
"github.com/iotexproject/iotex-core/v2/state"
1214
)
1315

1416
type (
@@ -62,3 +64,34 @@ type (
6264
SeekPrev([]byte, uint64) ([]byte, error)
6365
}
6466
)
67+
68+
func ReadStates(kvStore KVStore, namespace string, keys [][]byte) ([][]byte, [][]byte, error) {
69+
var (
70+
ks, values [][]byte
71+
err error
72+
)
73+
if keys == nil {
74+
ks, values, err = kvStore.Filter(namespace, func(k, v []byte) bool { return true }, nil, nil)
75+
if err != nil {
76+
if errors.Cause(err) == ErrNotExist || errors.Cause(err) == ErrBucketNotExist {
77+
return nil, nil, errors.Wrapf(state.ErrStateNotExist, "failed to get states of ns = %x", namespace)
78+
}
79+
return nil, nil, err
80+
}
81+
return ks, values, nil
82+
}
83+
for _, key := range keys {
84+
value, err := kvStore.Get(namespace, key)
85+
switch errors.Cause(err) {
86+
case ErrNotExist, ErrBucketNotExist:
87+
values = append(values, nil)
88+
ks = append(ks, key)
89+
case nil:
90+
values = append(values, value)
91+
ks = append(ks, key)
92+
default:
93+
return nil, nil, err
94+
}
95+
}
96+
return ks, values, nil
97+
}

state/factory/statedb.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ func (sdb *stateDB) States(opts ...protocol.StateOption) (uint64, state.Iterator
393393
if cfg.Key != nil {
394394
return sdb.currentChainHeight, nil, errors.Wrap(ErrNotSupported, "Read states with key option has not been implemented yet")
395395
}
396-
keys, values, err := readStates(sdb.dao.atHeight(sdb.currentChainHeight), cfg.Namespace, cfg.Keys)
396+
keys, values, err := db.ReadStates(sdb.dao.atHeight(sdb.currentChainHeight), cfg.Namespace, cfg.Keys)
397397
if err != nil {
398398
return 0, nil, err
399399
}

state/factory/util.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/iotexproject/iotex-core/v2/db"
2020
"github.com/iotexproject/iotex-core/v2/db/trie"
2121
"github.com/iotexproject/iotex-core/v2/db/trie/mptrie"
22-
"github.com/iotexproject/iotex-core/v2/state"
2322
)
2423

2524
func processOptions(opts ...protocol.StateOption) (*protocol.StateConfig, error) {
@@ -117,37 +116,6 @@ func protocolCommit(ctx context.Context, sr protocol.StateManager) error {
117116
return nil
118117
}
119118

120-
func readStates(kvStore db.KVStore, namespace string, keys [][]byte) ([][]byte, [][]byte, error) {
121-
var (
122-
ks, values [][]byte
123-
err error
124-
)
125-
if keys == nil {
126-
ks, values, err = kvStore.Filter(namespace, func(k, v []byte) bool { return true }, nil, nil)
127-
if err != nil {
128-
if errors.Cause(err) == db.ErrNotExist || errors.Cause(err) == db.ErrBucketNotExist {
129-
return nil, nil, errors.Wrapf(state.ErrStateNotExist, "failed to get states of ns = %x", namespace)
130-
}
131-
return nil, nil, err
132-
}
133-
return ks, values, nil
134-
}
135-
for _, key := range keys {
136-
value, err := kvStore.Get(namespace, key)
137-
switch errors.Cause(err) {
138-
case db.ErrNotExist, db.ErrBucketNotExist:
139-
values = append(values, nil)
140-
ks = append(ks, key)
141-
case nil:
142-
values = append(values, value)
143-
ks = append(ks, key)
144-
default:
145-
return nil, nil, err
146-
}
147-
}
148-
return ks, values, nil
149-
}
150-
151119
func newTwoLayerTrie(ns string, dao db.KVStore, rootKey string, create bool) (trie.TwoLayerTrie, error) {
152120
dbForTrie, err := trie.NewKVStore(ns, dao)
153121
if err != nil {

state/factory/workingsetstore.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ func (store *stateDBWorkingSetStore) Get(ns string, key []byte) ([]byte, error)
138138
func (store *stateDBWorkingSetStore) States(ns string, keys [][]byte) ([][]byte, [][]byte, error) {
139139
if store.readBuffer {
140140
// TODO: after the 180 HF, we can revert readBuffer, and always go this case
141-
return readStates(store.flusher.KVStoreWithBuffer(), ns, keys)
141+
return db.ReadStates(store.flusher.KVStoreWithBuffer(), ns, keys)
142142
}
143-
return readStates(store.flusher.BaseKVStore(), ns, keys)
143+
return db.ReadStates(store.flusher.BaseKVStore(), ns, keys)
144144
}
145145

146146
func (store *stateDBWorkingSetStore) Finalize(height uint64) error {

0 commit comments

Comments
 (0)