Skip to content

Commit 1d29261

Browse files
authored
fix(shed): open ChainStore from splitstore on export (#13347)
1 parent 5c68dfa commit 1d29261

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

cmd/lotus-shed/export.go

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import (
3333
"github.com/filecoin-project/go-state-types/abi"
3434

3535
"github.com/filecoin-project/lotus/blockstore"
36+
badgerbs "github.com/filecoin-project/lotus/blockstore/badger"
37+
"github.com/filecoin-project/lotus/blockstore/splitstore"
3638
"github.com/filecoin-project/lotus/chain/store"
3739
lcli "github.com/filecoin-project/lotus/cli"
3840
"github.com/filecoin-project/lotus/cmd/lotus-shed/shedgen"
@@ -97,24 +99,61 @@ var exportChainCmd = &cli.Command{
9799

98100
defer fi.Close() //nolint:errcheck
99101

100-
bs, err := lr.Blockstore(ctx, repo.UniversalBlockstore)
102+
cold, err := lr.Blockstore(ctx, repo.UniversalBlockstore)
101103
if err != nil {
102104
return fmt.Errorf("failed to open blockstore: %w", err)
103105
}
104106

105107
defer func() {
106-
if c, ok := bs.(io.Closer); ok {
108+
if c, ok := cold.(io.Closer); ok {
107109
if err := c.Close(); err != nil {
108110
log.Warnf("failed to close blockstore: %s", err)
109111
}
110112
}
111113
}()
112114

115+
path, err := lr.SplitstorePath()
116+
if err != nil {
117+
return xerrors.Errorf("failed to get splitstore path: %w", err)
118+
}
119+
120+
path = filepath.Join(path, "hot.badger")
121+
if err := os.MkdirAll(path, 0755); err != nil {
122+
return xerrors.Errorf("failed to create hot.badger dir: %w", err)
123+
}
124+
125+
opts, err := repo.BadgerBlockstoreOptions(repo.HotBlockstore, path, lr.Readonly())
126+
if err != nil {
127+
return xerrors.Errorf("failed to get badger blockstore options: %w", err)
128+
}
129+
130+
hot, err := badgerbs.Open(opts)
131+
if err != nil {
132+
return xerrors.Errorf("failed to open badger blockstore: %w", err)
133+
}
134+
113135
mds, err := lr.Datastore(context.Background(), "/metadata")
114136
if err != nil {
115-
return err
137+
return xerrors.Errorf("failed to open metadata datastore: %w", err)
138+
}
139+
140+
cfg := &splitstore.Config{
141+
MarkSetType: "map",
142+
DiscardColdBlocks: true,
143+
}
144+
ss, err := splitstore.Open(path, mds, hot, cold, cfg)
145+
if err != nil {
146+
return xerrors.Errorf("failed to open splitstore: %w", err)
116147
}
117148

149+
defer func() {
150+
if err := ss.Close(); err != nil {
151+
log.Warnf("failed to close blockstore: %s", err)
152+
}
153+
}()
154+
155+
bs := ss
156+
118157
cs := store.NewChainStore(bs, bs, mds, nil, nil)
119158
defer cs.Close() //nolint:errcheck
120159

0 commit comments

Comments
 (0)