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"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const TIPSETKEY_BACKFILL_RANGE = 2 * build.Finality
|
||||||
|
|
||||||
func (cs *ChainStore) UnionStore() bstore.Blockstore {
|
func (cs *ChainStore) UnionStore() bstore.Blockstore {
|
||||||
return bstore.Union(cs.stateBlockstore, cs.chainBlockstore)
|
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)
|
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
|
return root, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1097,6 +1097,10 @@ func (cs *ChainStore) StateBlockstore() bstore.Blockstore {
|
|||||||
return cs.stateBlockstore
|
return cs.stateBlockstore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cs *ChainStore) ChainLocalBlockstore() bstore.Blockstore {
|
||||||
|
return cs.chainLocalBlockstore
|
||||||
|
}
|
||||||
|
|
||||||
func ActorStore(ctx context.Context, bs bstore.Blockstore) adt.Store {
|
func ActorStore(ctx context.Context, bs bstore.Blockstore) adt.Store {
|
||||||
return adt.WrapStore(ctx, cbor.NewCborStore(bs))
|
return adt.WrapStore(ctx, cbor.NewCborStore(bs))
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ipfs/go-datastore"
|
"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/abi"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"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) {
|
func TestChainExportImportFull(t *testing.T) {
|
||||||
//stm: @CHAIN_GEN_NEXT_TIPSET_001
|
//stm: @CHAIN_GEN_NEXT_TIPSET_001
|
||||||
//stm: @CHAIN_STORE_IMPORT_001, @CHAIN_STORE_EXPORT_001, @CHAIN_STORE_SET_HEAD_001
|
//stm: @CHAIN_STORE_IMPORT_001, @CHAIN_STORE_EXPORT_001, @CHAIN_STORE_SET_HEAD_001
|
||||||
|
Loading…
Reference in New Issue
Block a user