Skip to content

Commit

Permalink
refactor(storev2): update snapshot manager and migration manager tests (
Browse files Browse the repository at this point in the history
  • Loading branch information
sontrinh16 committed Jul 22, 2024
1 parent 8484dc5 commit 2d6f97e
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 1 deletion.
5 changes: 5 additions & 0 deletions store/v2/migration/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ func TestMigrateState(t *testing.T) {
err := m.Migrate(toVersion - 1)
require.NoError(t, err)

// expecting error for conflicting process, since Migrate trigger snapshotter create migration,
// which start a snapshot process already.
_, err = m.snapshotsManager.Create(toVersion - 1)
require.Error(t, err)

if m.stateCommitment != nil {
// check the migrated state
for version := uint64(1); version < toVersion; version++ {
Expand Down
2 changes: 1 addition & 1 deletion store/v2/root/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -630,7 +630,7 @@ func (s *RootStoreTestSuite) TestMultiStore_PruningRestart() {
return false
}
// wait for async pruning process to finish
s.Require().Eventually(checkErr, 2*time.Second, 100*time.Millisecond, "expected error when loading height: %d", v)
s.Require().Eventually(checkErr, 5*time.Second, 100*time.Millisecond, "expected error when loading height: %d", v)
}
}

Expand Down
165 changes: 165 additions & 0 deletions store/v2/snapshots/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/stretchr/testify/require"

coretesting "cosmossdk.io/core/testing"
"cosmossdk.io/log"
"cosmossdk.io/store/v2/snapshots"
"cosmossdk.io/store/v2/snapshots/types"
)
Expand Down Expand Up @@ -254,3 +255,167 @@ func TestManager_TakeError(t *testing.T) {
_, err = manager.Create(1)
require.Error(t, err)
}

func TestSnapshot_Take_Restore(t *testing.T) {
store := setupStore(t)
items := [][]byte{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
commitSnapshotter := &mockCommitSnapshotter{
items: items,
}
extSnapshotter := newExtSnapshotter(10)

expectChunks := snapshotItems(items, extSnapshotter)
manager := snapshots.NewManager(store, opts, commitSnapshotter, &mockStorageSnapshotter{}, nil, coretesting.NewNopLogger())
err := manager.RegisterExtensions(extSnapshotter)
require.NoError(t, err)

// creating a snapshot at a higher height should be fine, and should return it
snapshot, err := manager.Create(5)
require.NoError(t, err)

assert.Equal(t, &types.Snapshot{
Height: 5,
Format: commitSnapshotter.SnapshotFormat(),
Chunks: 1,
Hash: []uint8{0xc5, 0xf7, 0xfe, 0xea, 0xd3, 0x4d, 0x3e, 0x87, 0xff, 0x41, 0xa2, 0x27, 0xfa, 0xcb, 0x38, 0x17, 0xa, 0x5, 0xeb, 0x27, 0x4e, 0x16, 0x5e, 0xf3, 0xb2, 0x8b, 0x47, 0xd1, 0xe6, 0x94, 0x7e, 0x8b},
Metadata: types.Metadata{
ChunkHashes: checksums(expectChunks),
},
}, snapshot)

storeSnapshot, chunks, err := store.Load(snapshot.Height, snapshot.Format)
require.NoError(t, err)
assert.Equal(t, snapshot, storeSnapshot)
assert.Equal(t, expectChunks, readChunks(chunks))

err = manager.Restore(*snapshot)
require.NoError(t, err)

// Feeding the chunks should work
for i, chunk := range readChunks(chunks) {
done, err := manager.RestoreChunk(chunk)
require.NoError(t, err)
if i == len(chunks)-1 {
assert.True(t, done)
} else {
assert.False(t, done)
}
}

// The snapshot is saved in local snapshot store
snapshots, err := store.List()
require.NoError(t, err)
require.Equal(t, uint64(5), snapshots[0].Height)
require.Equal(t, types.CurrentFormat, snapshots[0].Format)

// Starting a new restore should fail now, because the target already has contents.
err = manager.Restore(*snapshot)
require.Error(t, err)

storeSnapshot, chunks, err = store.Load(snapshot.Height, snapshot.Format)
require.NoError(t, err)
assert.Equal(t, snapshot, storeSnapshot)
assert.Equal(t, expectChunks, readChunks(chunks))

// Feeding the chunks should work
for i, chunk := range readChunks(chunks) {
done, err := manager.RestoreChunk(chunk)
require.NoError(t, err)
if i == len(chunks)-1 {
assert.True(t, done)
} else {
assert.False(t, done)
}
}

assert.Equal(t, items, commitSnapshotter.items)
assert.Equal(t, 10, len(extSnapshotter.state))

snapshots, err = store.List()
require.NoError(t, err)
require.Equal(t, uint64(5), snapshots[0].Height)
require.Equal(t, types.CurrentFormat, snapshots[0].Format)
}

func TestSnapshot_Take_Prune(t *testing.T) {
store := setupStore(t)

items := [][]byte{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
commitSnapshotter := &mockCommitSnapshotter{
items: items,
}
extSnapshotter := newExtSnapshotter(10)

expectChunks := snapshotItems(items, extSnapshotter)
manager := snapshots.NewManager(store, opts, commitSnapshotter, &mockStorageSnapshotter{}, nil, log.NewNopLogger())
err := manager.RegisterExtensions(extSnapshotter)
require.NoError(t, err)

// creating a snapshot at height 4
snapshot, err := manager.Create(4)
require.NoError(t, err)

assert.Equal(t, &types.Snapshot{
Height: 4,
Format: commitSnapshotter.SnapshotFormat(),
Chunks: 1,
Hash: []uint8{0xc5, 0xf7, 0xfe, 0xea, 0xd3, 0x4d, 0x3e, 0x87, 0xff, 0x41, 0xa2, 0x27, 0xfa, 0xcb, 0x38, 0x17, 0xa, 0x5, 0xeb, 0x27, 0x4e, 0x16, 0x5e, 0xf3, 0xb2, 0x8b, 0x47, 0xd1, 0xe6, 0x94, 0x7e, 0x8b},
Metadata: types.Metadata{
ChunkHashes: checksums(expectChunks),
},
}, snapshot)

pruned, err := manager.Prune(1)
require.NoError(t, err)
assert.EqualValues(t, 4, pruned)

// creating a snapshot at a same height 4, should be error
// since we prune all the previous snapshot except the latest at height 4
_, err = manager.Create(4)
require.Error(t, err)

// prune all
pruned, err = manager.Prune(0)
require.NoError(t, err)
assert.EqualValues(t, 1, pruned)

// creating a snapshot at a same height 4, should be true since we prune all the previous snapshot
snapshot, err = manager.Create(4)
require.NoError(t, err)

assert.Equal(t, &types.Snapshot{
Height: 4,
Format: commitSnapshotter.SnapshotFormat(),
Chunks: 1,
Hash: []uint8{0xc5, 0xf7, 0xfe, 0xea, 0xd3, 0x4d, 0x3e, 0x87, 0xff, 0x41, 0xa2, 0x27, 0xfa, 0xcb, 0x38, 0x17, 0xa, 0x5, 0xeb, 0x27, 0x4e, 0x16, 0x5e, 0xf3, 0xb2, 0x8b, 0x47, 0xd1, 0xe6, 0x94, 0x7e, 0x8b},
Metadata: types.Metadata{
ChunkHashes: checksums(expectChunks),
},
}, snapshot)

storeSnapshot, chunks, err := store.Load(snapshot.Height, snapshot.Format)
require.NoError(t, err)
assert.Equal(t, snapshot, storeSnapshot)
assert.Equal(t, expectChunks, readChunks(chunks))

pruned, err = manager.Prune(2)
require.NoError(t, err)
assert.EqualValues(t, 0, pruned)

list, err := manager.List()
require.NoError(t, err)
assert.Len(t, list, 1)

// Prune should error while a snapshot is being taken
manager = setupBusyManager(t)
_, err = manager.Prune(2)
require.Error(t, err)
}

0 comments on commit 2d6f97e

Please sign in to comment.