44 "fmt"
55 "io"
66
7- dbm "github.com/cosmos/cosmos-db"
8-
9- "cosmossdk.io/store/dbadapter"
107 "cosmossdk.io/store/tracekv"
118 "cosmossdk.io/store/types"
129)
@@ -23,12 +20,11 @@ const storeNameCtxKey = "store_name"
2320// NOTE: a Store (and MultiStores in general) should never expose the
2421// keys for the substores.
2522type Store struct {
26- db types.CacheWrap
2723 stores map [types.StoreKey ]types.CacheWrap
28- keys map [string ]types.StoreKey
2924
3025 traceWriter io.Writer
3126 traceContext types.TraceContext
27+ parentStore func (types.StoreKey ) types.CacheWrap
3228}
3329
3430var _ types.CacheMultiStore = Store {}
@@ -37,29 +33,17 @@ var _ types.CacheMultiStore = Store{}
3733// CacheWrapper objects and a KVStore as the database. Each CacheWrapper store
3834// is a branched store.
3935func NewFromKVStore (
40- store types. CacheWrapper , stores map [types.StoreKey ]types.CacheWrapper ,
41- keys map [ string ]types. StoreKey , traceWriter io.Writer , traceContext types.TraceContext ,
36+ stores map [types.StoreKey ]types.CacheWrapper ,
37+ traceWriter io.Writer , traceContext types.TraceContext ,
4238) Store {
4339 cms := Store {
44- db : store .CacheWrap (),
4540 stores : make (map [types.StoreKey ]types.CacheWrap , len (stores )),
46- keys : keys ,
4741 traceWriter : traceWriter ,
4842 traceContext : traceContext ,
4943 }
5044
5145 for key , store := range stores {
52- if cms .TracingEnabled () {
53- // only support tracing on KVStore.
54- if kvstore , ok := store .(types.KVStore ); ok {
55- tctx := cms .traceContext .Clone ().Merge (types.TraceContext {
56- storeNameCtxKey : key .Name (),
57- })
58-
59- store = tracekv .NewStore (kvstore , cms .traceWriter , tctx )
60- }
61- }
62- cms .stores [key ] = store .CacheWrap ()
46+ cms .initStore (key , store )
6347 }
6448
6549 return cms
@@ -68,19 +52,35 @@ func NewFromKVStore(
6852// NewStore creates a new Store object from a mapping of store keys to
6953// CacheWrapper objects. Each CacheWrapper store is a branched store.
7054func NewStore (
71- db dbm. DB , stores map [types.StoreKey ]types.CacheWrapper , keys map [ string ]types. StoreKey ,
55+ stores map [types.StoreKey ]types.CacheWrapper ,
7256 traceWriter io.Writer , traceContext types.TraceContext ,
7357) Store {
74- return NewFromKVStore (dbadapter. Store { DB : db }, stores , keys , traceWriter , traceContext )
58+ return NewFromKVStore (stores , traceWriter , traceContext )
7559}
7660
7761func newCacheMultiStoreFromCMS (cms Store ) Store {
78- stores := make (map [types.StoreKey ]types.CacheWrapper )
79- for k , v := range cms .stores {
80- stores [k ] = v
62+ return Store {
63+ stores : make (map [types.StoreKey ]types.CacheWrap ),
64+ traceWriter : cms .traceWriter ,
65+ traceContext : cms .traceContext ,
66+ parentStore : cms .getCacheWrap ,
8167 }
68+ }
69+
70+ func (cms Store ) initStore (key types.StoreKey , store types.CacheWrapper ) types.CacheWrap {
71+ if cms .TracingEnabled () {
72+ // only support tracing on KVStore.
73+ if kvstore , ok := store .(types.KVStore ); ok {
74+ tctx := cms .traceContext .Clone ().Merge (types.TraceContext {
75+ storeNameCtxKey : key .Name (),
76+ })
8277
83- return NewFromKVStore (cms .db , stores , nil , cms .traceWriter , cms .traceContext )
78+ store = tracekv .NewStore (kvstore , cms .traceWriter , tctx )
79+ }
80+ }
81+ cache := store .CacheWrap ()
82+ cms .stores [key ] = cache
83+ return cache
8484}
8585
8686// SetTracer sets the tracer for the MultiStore that the underlying
@@ -118,7 +118,6 @@ func (cms Store) GetStoreType() types.StoreType {
118118
119119// Write calls Write on each underlying store.
120120func (cms Store ) Write () {
121- cms .db .Write ()
122121 for _ , store := range cms .stores {
123122 store .Write ()
124123 }
@@ -134,19 +133,23 @@ func (cms Store) CacheMultiStore() types.CacheMultiStore {
134133 return newCacheMultiStoreFromCMS (cms )
135134}
136135
137- // GetStore returns an underlying Store by key.
138- func (cms Store ) GetStore (key types.StoreKey ) types.Store {
139- s := cms .stores [key ]
140- if key == nil || s == nil {
136+ func (cms Store ) getCacheWrap (key types.StoreKey ) types.CacheWrap {
137+ store , ok := cms .stores [key ]
138+ if ! ok && cms .parentStore != nil {
139+ // load on demand
140+ store = cms .initStore (key , cms .parentStore (key ))
141+ }
142+ if key == nil || store == nil {
141143 panic (fmt .Sprintf ("kv store with key %v has not been registered in stores" , key ))
142144 }
143- return s .(types. Store )
145+ return store
144146}
145147
146- func (cms Store ) getCacheWrap (key types.StoreKey ) types.CacheWrap {
147- store := cms .stores [key ]
148- if key == nil || store == nil {
149- panic (fmt .Sprintf ("kv store with key %v has not been registered in stores" , key ))
148+ // GetStore returns an underlying Store by key.
149+ func (cms Store ) GetStore (key types.StoreKey ) types.Store {
150+ store , ok := cms .getCacheWrap (key ).(types.Store )
151+ if ! ok {
152+ panic (fmt .Sprintf ("store with key %v is not Store" , key ))
150153 }
151154 return store
152155}
0 commit comments