Skip to content

Commit 4d240b0

Browse files
committed
add flag cache to set db cache size; use bigcache to replace gen-based trie cache
1 parent e254882 commit 4d240b0

9 files changed

Lines changed: 26 additions & 119 deletions

File tree

chain/ancestor_trie.go

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package chain
88
import (
99
"encoding/binary"
1010

11-
lru "github.com/hashicorp/golang-lru"
1211
"github.com/pkg/errors"
1312
"github.com/vechain/thor/block"
1413
"github.com/vechain/thor/kv"
@@ -21,14 +20,13 @@ const rootCacheLimit = 2048
2120
type ancestorTrie struct {
2221
kv kv.GetPutter
2322
rootsCache *cache
24-
trieCache *trieCache
2523
}
2624

2725
func newAncestorTrie(kv kv.GetPutter) *ancestorTrie {
2826
rootsCache := newCache(rootCacheLimit, func(key interface{}) (interface{}, error) {
2927
return loadBlockNumberIndexTrieRoot(kv, key.(thor.Bytes32))
3028
})
31-
return &ancestorTrie{kv, rootsCache, newTrieCache()}
29+
return &ancestorTrie{kv, rootsCache}
3230
}
3331

3432
func numberAsKey(num uint32) []byte {
@@ -48,7 +46,7 @@ func (at *ancestorTrie) Update(w kv.Putter, id, parentID thor.Bytes32) error {
4846
parentRoot = root.(thor.Bytes32)
4947
}
5048

51-
tr, err := at.trieCache.Get(parentRoot, at.kv, true)
49+
tr, err := trie.New(parentRoot, at.kv)
5250
if err != nil {
5351
return err
5452
}
@@ -64,7 +62,7 @@ func (at *ancestorTrie) Update(w kv.Putter, id, parentID thor.Bytes32) error {
6462
if err := saveBlockNumberIndexTrieRoot(w, id, root); err != nil {
6563
return err
6664
}
67-
at.trieCache.Add(root, tr, at.kv)
65+
6866
at.rootsCache.Add(id, root)
6967
return nil
7068
}
@@ -81,7 +79,7 @@ func (at *ancestorTrie) GetAncestor(descendantID thor.Bytes32, ancestorNum uint3
8179
if err != nil {
8280
return thor.Bytes32{}, errors.WithMessage(err, "load index root")
8381
}
84-
tr, err := at.trieCache.Get(root.(thor.Bytes32), at.kv, false)
82+
tr, err := trie.New(root.(thor.Bytes32), at.kv)
8583
if err != nil {
8684
return thor.Bytes32{}, err
8785
}
@@ -92,49 +90,3 @@ func (at *ancestorTrie) GetAncestor(descendantID thor.Bytes32, ancestorNum uint3
9290
}
9391
return thor.BytesToBytes32(id), nil
9492
}
95-
96-
///
97-
type trieCache struct {
98-
cache *lru.Cache
99-
}
100-
101-
type trieCacheEntry struct {
102-
trie *trie.Trie
103-
kv kv.GetPutter
104-
}
105-
106-
func newTrieCache() *trieCache {
107-
cache, _ := lru.New(16)
108-
return &trieCache{cache: cache}
109-
}
110-
111-
// to get a trie for writing, copy should be set to true
112-
func (tc *trieCache) Get(root thor.Bytes32, kv kv.GetPutter, copy bool) (*trie.Trie, error) {
113-
114-
if v, ok := tc.cache.Get(root); ok {
115-
entry := v.(*trieCacheEntry)
116-
if entry.kv == kv {
117-
if copy {
118-
cpy := *entry.trie
119-
return &cpy, nil
120-
}
121-
return entry.trie, nil
122-
}
123-
}
124-
tr, err := trie.New(root, kv)
125-
if err != nil {
126-
return nil, err
127-
}
128-
tr.SetCacheLimit(16)
129-
tc.cache.Add(root, &trieCacheEntry{tr, kv})
130-
if copy {
131-
cpy := *tr
132-
return &cpy, nil
133-
}
134-
return tr, nil
135-
}
136-
137-
func (tc *trieCache) Add(root thor.Bytes32, trie *trie.Trie, kv kv.GetPutter) {
138-
cpy := *trie
139-
tc.cache.Add(root, &trieCacheEntry{&cpy, kv})
140-
}

cmd/thor/flags.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,9 @@ var (
119119
Usage: "verify log db at startup",
120120
Hidden: true,
121121
}
122+
cacheFlag = cli.IntFlag{
123+
Name: "cache",
124+
Usage: "megabytes of ram allocated to internal caching",
125+
Value: 2048,
126+
}
122127
)

cmd/thor/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ func main() {
6666
networkFlag,
6767
configDirFlag,
6868
dataDirFlag,
69+
cacheFlag,
6970
beneficiaryFlag,
7071
targetGasLimitFlag,
7172
apiAddrFlag,

cmd/thor/must.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/vechain/thor/p2psrv"
3636
"github.com/vechain/thor/state"
3737
"github.com/vechain/thor/thor"
38+
"github.com/vechain/thor/trie"
3839
"github.com/vechain/thor/tx"
3940
"github.com/vechain/thor/txpool"
4041
cli "gopkg.in/urfave/cli.v1"
@@ -126,6 +127,11 @@ func makeInstanceDir(ctx *cli.Context, gene *genesis.Genesis) string {
126127
}
127128

128129
func openMainDB(ctx *cli.Context, dataDir string) *lvldb.LevelDB {
130+
cacheMB := ctx.Int(cacheFlag.Name)
131+
if cacheMB < 128 {
132+
cacheMB = 128
133+
}
134+
129135
limit, err := fdlimit.Current()
130136
if err != nil {
131137
fatal("failed to get fd limit:", err)
@@ -141,12 +147,13 @@ func openMainDB(ctx *cli.Context, dataDir string) *lvldb.LevelDB {
141147

142148
dir := filepath.Join(dataDir, "main.db")
143149
db, err := lvldb.New(dir, lvldb.Options{
144-
CacheSize: 256,
150+
CacheSize: cacheMB / 2,
145151
OpenFilesCacheCapacity: fileCache,
146152
})
147153
if err != nil {
148154
fatal(fmt.Sprintf("open chain database [%v]: %v", dir, err))
149155
}
156+
trie.SetCache(trie.NewCache(cacheMB / 2))
150157
return db
151158
}
152159

lvldb/leveldb.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func New(path string, opts Options) (*LevelDB, error) {
4646
CompactionTableSizeMultiplier: 2,
4747
OpenFilesCacheCapacity: opts.OpenFilesCacheCapacity,
4848
BlockCacheCapacity: opts.CacheSize / 2 * opt.MiB,
49-
WriteBuffer: opts.CacheSize / 4 * opt.MiB, // Two of these are used internally
49+
WriteBuffer: 32 * opt.MiB, // Two of these are used internally
5050
Filter: filter.NewBloomFilter(10),
5151
})
5252

state/cached_object.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
lru "github.com/hashicorp/golang-lru"
1111
"github.com/vechain/thor/kv"
1212
"github.com/vechain/thor/thor"
13+
"github.com/vechain/thor/trie"
1314
)
1415

1516
var codeCache, _ = lru.New(512)
@@ -37,7 +38,7 @@ func (co *cachedObject) getOrCreateStorageTrie() (trieReader, error) {
3738

3839
root := thor.BytesToBytes32(co.data.StorageRoot)
3940

40-
trie, err := trCache.Get(root, co.kv, false)
41+
trie, err := trie.NewSecure(root, co.kv, 0)
4142
if err != nil {
4243
return nil, err
4344
}

state/stage.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type codeWithHash struct {
2828

2929
func newStage(root thor.Bytes32, kv kv.GetPutter, changes map[thor.Address]*changedObject) *Stage {
3030

31-
accountTrie, err := trCache.Get(root, kv, true)
31+
accountTrie, err := trie.NewSecure(root, kv, 0)
3232
if err != nil {
3333
return &Stage{err: err}
3434
}
@@ -48,7 +48,7 @@ func newStage(root thor.Bytes32, kv kv.GetPutter, changes map[thor.Address]*chan
4848
// skip storage changes if account is empty
4949
if !dataCpy.IsEmpty() {
5050
if len(obj.storage) > 0 {
51-
strie, err := trCache.Get(thor.BytesToBytes32(dataCpy.StorageRoot), kv, true)
51+
strie, err := trie.NewSecure(thor.BytesToBytes32(dataCpy.StorageRoot), kv, 0)
5252
if err != nil {
5353
return &Stage{err: err}
5454
}
@@ -97,11 +97,10 @@ func (s *Stage) Commit() (thor.Bytes32, error) {
9797

9898
// commit storage tries
9999
for _, strie := range s.storageTries {
100-
root, err := strie.CommitTo(batch)
100+
_, err := strie.CommitTo(batch)
101101
if err != nil {
102102
return thor.Bytes32{}, err
103103
}
104-
trCache.Add(root, strie, s.kv)
105104
}
106105

107106
// commit accounts trie
@@ -114,7 +113,5 @@ func (s *Stage) Commit() (thor.Bytes32, error) {
114113
return thor.Bytes32{}, err
115114
}
116115

117-
trCache.Add(root, s.accountTrie, s.kv)
118-
119116
return root, nil
120117
}

state/state.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ type trieWriter interface {
4242

4343
// New create an state object.
4444
func New(root thor.Bytes32, kv kv.GetPutter) (*State, error) {
45-
trie, err := trCache.Get(root, kv, false)
45+
trie, err := trie.NewSecure(root, kv, 0)
4646
if err != nil {
4747
return nil, err
4848
}
@@ -372,7 +372,7 @@ func (s *State) BuildStorageTrie(addr thor.Address) (*trie.SecureTrie, error) {
372372
root := thor.BytesToBytes32(acc.StorageRoot)
373373

374374
// retrieve a copied trie
375-
trie, err := trCache.Get(root, s.kv, true)
375+
trie, err := trie.NewSecure(root, s.kv, 0)
376376
if err != nil {
377377
return nil, err
378378
}

state/trie_cache.go

Lines changed: 0 additions & 56 deletions
This file was deleted.

0 commit comments

Comments
 (0)