lotus/blockstore/splitstore/markset_test.go

226 lines
3.7 KiB
Go
Raw Normal View History

2020-11-26 16:58:03 +00:00
package splitstore
import (
"io/ioutil"
2021-07-30 06:42:20 +00:00
"os"
2020-11-26 16:58:03 +00:00
"testing"
cid "github.com/ipfs/go-cid"
"github.com/multiformats/go-multihash"
)
2021-07-07 13:39:37 +00:00
func TestMapMarkSet(t *testing.T) {
testMarkSet(t, "map")
2021-07-30 06:42:20 +00:00
testMarkSetVisitor(t, "map")
2021-02-27 10:50:48 +00:00
}
func TestBloomMarkSet(t *testing.T) {
testMarkSet(t, "bloom")
2021-02-28 08:35:27 +00:00
}
2021-07-22 09:16:44 +00:00
func TestBadgerMarkSet(t *testing.T) {
bs := badgerMarkSetBatchSize
badgerMarkSetBatchSize = 1
t.Cleanup(func() {
badgerMarkSetBatchSize = bs
})
testMarkSet(t, "badger")
2021-07-30 06:42:20 +00:00
testMarkSetVisitor(t, "badger")
2021-07-22 09:16:44 +00:00
}
func testMarkSet(t *testing.T, lsType string) {
2021-02-27 10:50:48 +00:00
t.Helper()
2020-11-26 16:58:03 +00:00
2021-07-30 06:42:20 +00:00
path, err := ioutil.TempDir("", "markset.*")
2020-11-26 16:58:03 +00:00
if err != nil {
t.Fatal(err)
}
2021-07-30 06:42:20 +00:00
t.Cleanup(func() {
_ = os.RemoveAll(path)
})
env, err := OpenMarkSetEnv(path, lsType)
2020-11-26 16:58:03 +00:00
if err != nil {
t.Fatal(err)
}
2021-02-27 10:50:48 +00:00
defer env.Close() //nolint:errcheck
2020-11-26 16:58:03 +00:00
hotSet, err := env.Create("hot", 0)
2020-11-26 16:58:03 +00:00
if err != nil {
t.Fatal(err)
}
coldSet, err := env.Create("cold", 0)
2020-11-26 16:58:03 +00:00
if err != nil {
t.Fatal(err)
}
makeCid := func(key string) cid.Cid {
h, err := multihash.Sum([]byte(key), multihash.SHA2_256, -1)
if err != nil {
t.Fatal(err)
}
return cid.NewCidV1(cid.Raw, h)
}
mustHave := func(s MarkSet, cid cid.Cid) {
2020-11-26 16:58:03 +00:00
has, err := s.Has(cid)
if err != nil {
t.Fatal(err)
}
if !has {
t.Fatal("mark not found")
}
}
mustNotHave := func(s MarkSet, cid cid.Cid) {
2020-11-26 16:58:03 +00:00
has, err := s.Has(cid)
if err != nil {
t.Fatal(err)
}
if has {
t.Fatal("unexpected mark")
}
}
k1 := makeCid("a")
k2 := makeCid("b")
k3 := makeCid("c")
k4 := makeCid("d")
2020-11-26 17:47:54 +00:00
hotSet.Mark(k1) //nolint
hotSet.Mark(k2) //nolint
coldSet.Mark(k3) //nolint
2020-11-26 16:58:03 +00:00
mustHave(hotSet, k1)
mustHave(hotSet, k2)
mustNotHave(hotSet, k3)
mustNotHave(hotSet, k4)
mustNotHave(coldSet, k1)
mustNotHave(coldSet, k2)
mustHave(coldSet, k3)
mustNotHave(coldSet, k4)
// close them and reopen to redo the dance
err = hotSet.Close()
if err != nil {
t.Fatal(err)
}
err = coldSet.Close()
if err != nil {
t.Fatal(err)
}
hotSet, err = env.Create("hot", 0)
2020-11-26 16:58:03 +00:00
if err != nil {
t.Fatal(err)
}
coldSet, err = env.Create("cold", 0)
2020-11-26 16:58:03 +00:00
if err != nil {
t.Fatal(err)
}
2020-11-26 17:47:54 +00:00
hotSet.Mark(k3) //nolint
hotSet.Mark(k4) //nolint
coldSet.Mark(k1) //nolint
2020-11-26 16:58:03 +00:00
mustNotHave(hotSet, k1)
mustNotHave(hotSet, k2)
mustHave(hotSet, k3)
mustHave(hotSet, k4)
mustHave(coldSet, k1)
mustNotHave(coldSet, k2)
mustNotHave(coldSet, k3)
mustNotHave(coldSet, k4)
err = hotSet.Close()
if err != nil {
t.Fatal(err)
}
err = coldSet.Close()
if err != nil {
t.Fatal(err)
}
}
2021-07-30 06:42:20 +00:00
func testMarkSetVisitor(t *testing.T, lsType string) {
t.Helper()
path, err := ioutil.TempDir("", "markset.*")
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
_ = os.RemoveAll(path)
})
env, err := OpenMarkSetEnv(path, lsType)
if err != nil {
t.Fatal(err)
}
defer env.Close() //nolint:errcheck
visitor, err := env.CreateVisitor("test", 0)
if err != nil {
t.Fatal(err)
}
defer visitor.Close() //nolint:errcheck
makeCid := func(key string) cid.Cid {
h, err := multihash.Sum([]byte(key), multihash.SHA2_256, -1)
if err != nil {
t.Fatal(err)
}
return cid.NewCidV1(cid.Raw, h)
}
mustVisit := func(v ObjectVisitor, cid cid.Cid) {
visit, err := v.Visit(cid)
if err != nil {
t.Fatal(err)
}
if !visit {
t.Fatal("object should be visited")
}
}
mustNotVisit := func(v ObjectVisitor, cid cid.Cid) {
visit, err := v.Visit(cid)
if err != nil {
t.Fatal(err)
}
if visit {
t.Fatal("unexpected visit")
}
}
k1 := makeCid("a")
k2 := makeCid("b")
k3 := makeCid("c")
k4 := makeCid("d")
mustVisit(visitor, k1)
mustVisit(visitor, k2)
mustVisit(visitor, k3)
mustVisit(visitor, k4)
mustNotVisit(visitor, k1)
mustNotVisit(visitor, k2)
mustNotVisit(visitor, k3)
mustNotVisit(visitor, k4)
}