2047a74958
The union blockstore takes a list of blockstores. It returns the first satisfying read, and broadcasts writes to all stores. It can be used for operations that require reading from any two blockstores, for example WalkSnapshot.
103 lines
1.8 KiB
Go
103 lines
1.8 KiB
Go
package blockstore
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
blocks "github.com/ipfs/go-block-format"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
var (
|
|
b0 = blocks.NewBlock([]byte("abc"))
|
|
b1 = blocks.NewBlock([]byte("foo"))
|
|
b2 = blocks.NewBlock([]byte("bar"))
|
|
)
|
|
|
|
func TestUnionBlockstore_Get(t *testing.T) {
|
|
m1 := NewMemory()
|
|
m2 := NewMemory()
|
|
|
|
_ = m1.Put(b1)
|
|
_ = m2.Put(b2)
|
|
|
|
u := Union(m1, m2)
|
|
|
|
v1, err := u.Get(b1.Cid())
|
|
require.NoError(t, err)
|
|
require.Equal(t, b1.RawData(), v1.RawData())
|
|
|
|
v2, err := u.Get(b2.Cid())
|
|
require.NoError(t, err)
|
|
require.Equal(t, b2.RawData(), v2.RawData())
|
|
}
|
|
|
|
func TestUnionBlockstore_Put_PutMany_Delete_AllKeysChan(t *testing.T) {
|
|
m1 := NewMemory()
|
|
m2 := NewMemory()
|
|
|
|
u := Union(m1, m2)
|
|
|
|
err := u.Put(b0)
|
|
require.NoError(t, err)
|
|
|
|
var has bool
|
|
|
|
// write was broadcasted to all stores.
|
|
has, _ = m1.Has(b0.Cid())
|
|
require.True(t, has)
|
|
|
|
has, _ = m2.Has(b0.Cid())
|
|
require.True(t, has)
|
|
|
|
has, _ = u.Has(b0.Cid())
|
|
require.True(t, has)
|
|
|
|
// put many.
|
|
err = u.PutMany([]blocks.Block{b1, b2})
|
|
require.NoError(t, err)
|
|
|
|
// write was broadcasted to all stores.
|
|
has, _ = m1.Has(b1.Cid())
|
|
require.True(t, has)
|
|
|
|
has, _ = m1.Has(b2.Cid())
|
|
require.True(t, has)
|
|
|
|
has, _ = m2.Has(b1.Cid())
|
|
require.True(t, has)
|
|
|
|
has, _ = m2.Has(b2.Cid())
|
|
require.True(t, has)
|
|
|
|
// also in the union store.
|
|
has, _ = u.Has(b1.Cid())
|
|
require.True(t, has)
|
|
|
|
has, _ = u.Has(b2.Cid())
|
|
require.True(t, has)
|
|
|
|
// deleted from all stores.
|
|
err = u.DeleteBlock(b1.Cid())
|
|
require.NoError(t, err)
|
|
|
|
has, _ = u.Has(b1.Cid())
|
|
require.False(t, has)
|
|
|
|
has, _ = m1.Has(b1.Cid())
|
|
require.False(t, has)
|
|
|
|
has, _ = m2.Has(b1.Cid())
|
|
require.False(t, has)
|
|
|
|
// check that AllKeysChan returns b0 and b2, twice (once per backing store)
|
|
ch, err := u.AllKeysChan(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
var i int
|
|
for range ch {
|
|
i++
|
|
}
|
|
require.Equal(t, 4, i)
|
|
}
|