feat: snapshot: Store tipset key cids in chain store during snapshot import (#10042)
* Store tipset key cids in chain store during snapshot import * make gen * fix circle ci config * fix lint * address comments
This commit is contained in:
parent
fcefc87840
commit
ee54a7f3f5
@ -22,6 +22,8 @@ import (
|
||||
"github.com/filecoin-project/lotus/chain/types"
|
||||
)
|
||||
|
||||
const TIPSETKEY_BACKFILL_RANGE = 2 * build.Finality
|
||||
|
||||
func (cs *ChainStore) UnionStore() bstore.Blockstore {
|
||||
return bstore.Union(cs.stateBlockstore, cs.chainBlockstore)
|
||||
}
|
||||
@ -113,6 +115,20 @@ func (cs *ChainStore) Import(ctx context.Context, r io.Reader) (*types.TipSet, e
|
||||
return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err)
|
||||
}
|
||||
|
||||
ts := root
|
||||
for i := 0; i < int(TIPSETKEY_BACKFILL_RANGE); i++ {
|
||||
err = cs.PersistTipset(ctx, ts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
parentTsKey := ts.Parents()
|
||||
ts, err = cs.LoadTipSet(ctx, parentTsKey)
|
||||
if ts == nil || err != nil {
|
||||
log.Warnf("Only able to load the last %d tipsets", i)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return root, nil
|
||||
}
|
||||
|
||||
|
@ -1097,6 +1097,10 @@ func (cs *ChainStore) StateBlockstore() bstore.Blockstore {
|
||||
return cs.stateBlockstore
|
||||
}
|
||||
|
||||
func (cs *ChainStore) ChainLocalBlockstore() bstore.Blockstore {
|
||||
return cs.chainLocalBlockstore
|
||||
}
|
||||
|
||||
func ActorStore(ctx context.Context, bs bstore.Blockstore) adt.Store {
|
||||
return adt.WrapStore(ctx, cbor.NewCborStore(bs))
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/ipfs/go-datastore"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/filecoin-project/go-state-types/abi"
|
||||
"github.com/filecoin-project/go-state-types/crypto"
|
||||
@ -124,6 +125,51 @@ func TestChainExportImport(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test to check if tipset key cids are being stored on snapshot
|
||||
func TestChainImportTipsetKeyCid(t *testing.T) {
|
||||
|
||||
ctx := context.Background()
|
||||
cg, err := gen.NewGenerator()
|
||||
require.NoError(t, err)
|
||||
|
||||
buf := new(bytes.Buffer)
|
||||
var last *types.TipSet
|
||||
var tsKeys []types.TipSetKey
|
||||
for i := 0; i < 10; i++ {
|
||||
ts, err := cg.NextTipSet()
|
||||
require.NoError(t, err)
|
||||
last = ts.TipSet.TipSet()
|
||||
tsKeys = append(tsKeys, last.Key())
|
||||
}
|
||||
|
||||
if err := cg.ChainStore().Export(ctx, last, last.Height(), false, buf); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
nbs := blockstore.NewMemorySync()
|
||||
cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil)
|
||||
defer cs.Close() //nolint:errcheck
|
||||
|
||||
root, err := cs.Import(ctx, buf)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Truef(t, root.Equals(last), "imported chain differed from exported chain")
|
||||
|
||||
err = cs.SetHead(ctx, last)
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, tsKey := range tsKeys {
|
||||
_, err := cs.LoadTipSet(ctx, tsKey)
|
||||
require.NoError(t, err)
|
||||
|
||||
tsCid, err := tsKey.Cid()
|
||||
require.NoError(t, err)
|
||||
_, err = cs.ChainLocalBlockstore().Get(ctx, tsCid)
|
||||
require.NoError(t, err)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func TestChainExportImportFull(t *testing.T) {
|
||||
//stm: @CHAIN_GEN_NEXT_TIPSET_001
|
||||
//stm: @CHAIN_STORE_IMPORT_001, @CHAIN_STORE_EXPORT_001, @CHAIN_STORE_SET_HEAD_001
|
||||
|
Loading…
Reference in New Issue
Block a user