55 "context"
66 "encoding/json"
77 "fmt"
8- "io "
8+ "os "
99 "path"
10+ "path/filepath"
1011 "reflect"
1112 "sort"
1213 "sync"
@@ -29,6 +30,8 @@ import (
2930
3031 "github.com/filecoin-project/lotus/api"
3132 "github.com/filecoin-project/lotus/blockstore"
33+ badgerbs "github.com/filecoin-project/lotus/blockstore/badger"
34+ "github.com/filecoin-project/lotus/blockstore/splitstore"
3235 "github.com/filecoin-project/lotus/chain/actors"
3336 "github.com/filecoin-project/lotus/chain/actors/builtin"
3437 "github.com/filecoin-project/lotus/chain/consensus"
@@ -226,41 +229,70 @@ func loadChainStore(ctx context.Context, repoPath string) (*StoreHandle, error)
226229 return nil , xerrors .Errorf ("lotus repo doesn't exist" )
227230 }
228231
229- lr , err := r .Lock (repo .FullNode )
232+ lkrepo , err := r .Lock (repo .FullNode )
230233 if err != nil {
231234 return nil , err
232235 }
233236
234- bs , err := lr .Blockstore (ctx , repo .UniversalBlockstore )
237+ cold , err := lkrepo .Blockstore (ctx , repo .UniversalBlockstore )
235238 if err != nil {
236- return nil , fmt .Errorf ("failed to open blockstore: %w" , err )
239+ return nil , xerrors .Errorf ("failed to open universal blockstore %w" , err )
237240 }
238241
242+ path , err := lkrepo .SplitstorePath ()
243+ if err != nil {
244+ return nil , xerrors .Errorf ("failed to get splitstore path: %w" , err )
245+ }
246+
247+ path = filepath .Join (path , "hot.badger" )
248+ if err := os .MkdirAll (path , 0755 ); err != nil {
249+ return nil , xerrors .Errorf ("failed to create hot.badger dir: %w" , err )
250+ }
251+
252+ opts , err := repo .BadgerBlockstoreOptions (repo .HotBlockstore , path , lkrepo .Readonly ())
253+ if err != nil {
254+ return nil , xerrors .Errorf ("failed to get badger blockstore options: %w" , err )
255+ }
256+
257+ hot , err := badgerbs .Open (opts )
258+ if err != nil {
259+ return nil , xerrors .Errorf ("failed to open badger blockstore: %w" , err )
260+ }
261+
262+ mds , err := lkrepo .Datastore (context .Background (), "/metadata" )
263+ if err != nil {
264+ return nil , xerrors .Errorf ("failed to open metadata datastore: %w" , err )
265+ }
266+
267+ cfg := & splitstore.Config {
268+ MarkSetType : "map" ,
269+ DiscardColdBlocks : true ,
270+ }
271+ ss , err := splitstore .Open (path , mds , hot , cold , cfg )
272+ if err != nil {
273+ return nil , xerrors .Errorf ("failed to open splitstore: %w" , err )
274+ }
275+
276+ bs := ss
277+
239278 closer := func () {
240- if err := lr .Close (); err != nil {
279+ if err := lkrepo .Close (); err != nil {
241280 log .Warnf ("failed to close locked repo: %s" , err )
242281 }
243- if c , ok := bs .(io.Closer ); ok {
244- if err := c .Close (); err != nil {
245- log .Warnf ("failed to close blockstore: %s" , err )
246- }
282+ if err := ss .Close (); err != nil {
283+ log .Warnf ("failed to close blockstore: %s" , err )
247284 }
248285 }
249286
250- mds , err := lr .Datastore (context .Background (), "/metadata" )
251- if err != nil {
252- return nil , err
253- }
254-
255- cs := store .NewChainStore (bs , bs , mds , nil , nil )
287+ cs := store .NewChainStore (bs , bs , mds , filcns .Weight , nil )
256288 if err := cs .Load (ctx ); err != nil {
257- return nil , fmt .Errorf ("failed to load chain store: %w" , err )
289+ return nil , xerrors .Errorf ("failed to load chain store: %w" , err )
258290 }
259291
260292 tsExec := consensus .NewTipSetExecutor (filcns .RewardFunc )
261293 sm , err := stmgr .NewStateManager (cs , tsExec , vm .Syscalls (proofsffi .ProofVerifier ), filcns .DefaultUpgradeSchedule (), nil , mds , nil )
262294 if err != nil {
263- return nil , fmt .Errorf ("failed to open state manager: %w" , err )
295+ return nil , xerrors .Errorf ("failed to open state manager: %w" , err )
264296 }
265297 handle := StoreHandle {
266298 bs : bs ,
0 commit comments