|
1 | 1 | package splitstore
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "context" |
| 5 | + "encoding/json" |
4 | 6 | "fmt"
|
5 | 7 | "os"
|
6 | 8 | "path/filepath"
|
7 | 9 | "runtime"
|
8 | 10 | "sync"
|
9 | 11 | "testing"
|
10 | 12 |
|
11 |
| - blocks "github.com/ipfs/go-block-format" |
| 13 | + "github.com/filecoin-project/go-state-types/abi" |
| 14 | + "github.com/filecoin-project/venus/venus-shared/types" |
12 | 15 | cid "github.com/ipfs/go-cid"
|
13 | 16 | "github.com/stretchr/testify/require"
|
14 | 17 | )
|
15 | 18 |
|
16 | 19 | func TestNewSplitstore(t *testing.T) {
|
| 20 | + ctx := context.Background() |
17 | 21 | tempDir := t.TempDir()
|
18 |
| - tempBlocks := []blocks.Block{ |
19 |
| - newBlock("b1"), |
20 |
| - newBlock("b2"), |
21 |
| - newBlock("b3"), |
22 |
| - newBlock("b4"), |
23 |
| - newBlock("b4"), |
| 22 | + mockTipset := []*types.TipSet{ |
| 23 | + newTipSet(100), |
| 24 | + newTipSet(200), |
| 25 | + newTipSet(300), |
| 26 | + newTipSet(400), |
| 27 | + newTipSet(500), |
24 | 28 | }
|
25 | 29 |
|
26 |
| - for i, b := range tempBlocks { |
27 |
| - storePath := fmt.Sprintf("base_%d_%s.db", 10+i, b.Cid()) |
28 |
| - storePath = filepath.Join(tempDir, storePath) |
29 |
| - err := os.MkdirAll(storePath, 0777) |
| 30 | + var tskCids []cid.Cid |
| 31 | + for i, ts := range mockTipset { |
| 32 | + tsk := ts.Key() |
| 33 | + tskCid, err := tsk.Cid() |
30 | 34 | require.NoError(t, err)
|
| 35 | + tskCids = append(tskCids, tskCid) |
| 36 | + |
| 37 | + s, err := newLayer(tempDir, int64(100+i*100), tskCid) |
| 38 | + require.NoError(t, err) |
| 39 | + |
| 40 | + rawBlk, err := ts.Blocks()[0].ToStorageBlock() |
| 41 | + require.NoError(t, err) |
| 42 | + err = s.Put(ctx, rawBlk) |
| 43 | + require.NoError(t, err) |
| 44 | + |
| 45 | + rawTsk, err := tsk.ToStorageBlock() |
| 46 | + require.NoError(t, err) |
| 47 | + err = s.Put(ctx, rawTsk) |
| 48 | + require.NoError(t, err) |
| 49 | + |
| 50 | + if s, ok := s.Blockstore.(Closer); ok { |
| 51 | + err := s.Close() |
| 52 | + require.NoError(t, err) |
| 53 | + } |
31 | 54 | }
|
32 | 55 |
|
33 | 56 | ss, err := NewSplitstore(tempDir, nil)
|
34 | 57 | require.NoError(t, err)
|
35 |
| - require.Len(t, ss.layers, ss.maxLayerCount) |
| 58 | + require.Equal(t, 5, ss.layers.Len()) |
36 | 59 | }
|
37 | 60 |
|
38 | 61 | func TestSethead(t *testing.T) {
|
@@ -60,42 +83,53 @@ func TestSethead(t *testing.T) {
|
60 | 83 | }
|
61 | 84 |
|
62 | 85 | func TestScan(t *testing.T) {
|
| 86 | + ctx := context.Background() |
63 | 87 | tempDir := t.TempDir()
|
64 |
| - tempBlocks := []blocks.Block{ |
65 |
| - newBlock("b1"), |
66 |
| - newBlock("b2"), |
67 |
| - newBlock("b3"), |
| 88 | + mockTipset := []*types.TipSet{ |
| 89 | + newTipSet(100), |
| 90 | + newTipSet(200), |
| 91 | + newTipSet(300), |
68 | 92 | }
|
69 | 93 |
|
70 |
| - for i, b := range tempBlocks { |
71 |
| - s, err := newLayer(tempDir, int64(10+i), b.Cid()) |
| 94 | + var tskCids []cid.Cid |
| 95 | + for i, ts := range mockTipset { |
| 96 | + tsk := ts.Key() |
| 97 | + tskCid, err := tsk.Cid() |
| 98 | + require.NoError(t, err) |
| 99 | + tskCids = append(tskCids, tskCid) |
| 100 | + |
| 101 | + s, err := newLayer(tempDir, int64(100+i*100), tskCid) |
72 | 102 | require.NoError(t, err)
|
| 103 | + |
| 104 | + rawBlk, err := ts.Blocks()[0].ToStorageBlock() |
| 105 | + require.NoError(t, err) |
| 106 | + err = s.Put(ctx, rawBlk) |
| 107 | + require.NoError(t, err) |
| 108 | + |
| 109 | + rawTsk, err := tsk.ToStorageBlock() |
| 110 | + require.NoError(t, err) |
| 111 | + err = s.Put(ctx, rawTsk) |
| 112 | + require.NoError(t, err) |
| 113 | + |
73 | 114 | if s, ok := s.Blockstore.(Closer); ok {
|
74 | 115 | err := s.Close()
|
75 | 116 | require.NoError(t, err)
|
76 | 117 | }
|
77 | 118 | }
|
78 | 119 |
|
79 |
| - // base_init.db(place holder) |
80 |
| - _, err := newLayer(tempDir, int64(0), cid.Undef) |
81 |
| - require.NoError(t, err) |
82 |
| - |
83 | 120 | // any.db will not be scanned in
|
84 |
| - err = os.MkdirAll(filepath.Join(tempDir, "any.db"), 0777) |
| 121 | + err := os.MkdirAll(filepath.Join(tempDir, "any.db"), 0777) |
85 | 122 | require.NoError(t, err)
|
86 | 123 |
|
87 | 124 | bs, err := scan(tempDir)
|
88 | 125 | require.NoError(t, err)
|
89 | 126 |
|
90 | 127 | t.Run("scan in", func(t *testing.T) {
|
91 |
| - require.Len(t, bs, len(tempBlocks)+1) |
| 128 | + require.Len(t, bs, len(mockTipset)) |
92 | 129 |
|
93 |
| - for i, b := range tempBlocks { |
94 |
| - require.Equal(t, b.Cid(), bs[i+1].Base()) |
| 130 | + for i, c := range tskCids { |
| 131 | + require.Equal(t, c, bs[i].Base()) |
95 | 132 | }
|
96 |
| - |
97 |
| - // store from place holder should be empty |
98 |
| - require.Nil(t, bs[0].Blockstore) |
99 | 133 | })
|
100 | 134 |
|
101 | 135 | t.Run("clean up", func(t *testing.T) {
|
@@ -125,3 +159,20 @@ func TestExtractHeightAndCid(t *testing.T) {
|
125 | 159 | _, _, err = extractHeightAndCid("base_10_bafy2bzacedyokdqa4mnkercuk5hcufi52w5q2xannm567ij2njiqovgwiicx6.db.del")
|
126 | 160 | require.Error(t, err)
|
127 | 161 | }
|
| 162 | + |
| 163 | +const blkRaw = `{"Miner":"t038057","Ticket":{"VRFProof":"kfggWR2GcEbfTuJ20hkAFNRbF7xusDuAQR7XwTjJ2/gc1rwIDmaXbSVxXe4j1njcCBoMhmlYIn9D/BLqQuIOayMHPYvDmOJGc9M27Hwg1UZkiuJmXji+iM/JBNYaOA61"},"ElectionProof":{"WinCount":1,"VRFProof":"tI7cWWM9sGsKc69N9DjN41glaO5Hg7r742H56FPzg7szbhTrxj8kw0OsiJzcPJdiAa6D5jZ1S2WKoLK7lwg2R5zYvCRwwWLGDiExqbqsvqmH5z/e6YGpaD7ghTPRH1SR"},"BeaconEntries":[{"Round":2118576,"Data":"rintMKcvVAslYpn9DcshDBmlPN6hUR+wjvVQSkkVUK5klx1kOSpcDvzODSc2wXFQA7BVbEcXJW/5KLoL0KHx2alLUWDOwxhsIQnAydXdZqG8G76nTIgogthfIMgSGdB2"}],"WinPoStProof":[{"PoStProof":3,"ProofBytes":"t0ZgPHFv0ao9fVZJ/fxbBrzATmOiIv9/IueSyAjtcqEpxqWViqchaaxnz1afwzAbhahpfZsGiGWyc408WYh7Q8u0Aa52KGPmUNtf3pAvxWfsUDMz9QUfhLZVg/p8/PUVC/O/E7RBNq4YPrRK5b6Q8PVwzIOxGOS14ge6ys8Htq+LfNJbcqY676qOYF4lzMuMtQIe3CxMSAEaEBfNpHhAEs83dO6vll9MZKzcXYpNWeqmMIz4xSdF18StQq9vL/Lo"}],"Parents":[{"/":"bafy2bzacecf4wtqz3kgumeowhdulejk3xbfzgibfyhs42x4vx2guqgudem2hg"},{"/":"bafy2bzacebkpxh2k63xreigl6a3ggdr2adwk67b4zw5dddckhqex2tmha6hee"},{"/":"bafy2bzacecor3xq4ykmhhrgq55rdo5w7up65elc4qwx5uwjy25ffynidskbxw"},{"/":"bafy2bzacedr2mztmef65fodqzvyjcdnsgpcjthstseinll4maqg24avnv7ljo"}],"ParentWeight":"21779626255","Height":1164251,"ParentStateRoot":{"/":"bafy2bzacecypgutbewmyop2wfuafvxt7dm7ew4u3ssy2p4rn457f6ynrj2i6a"},"ParentMessageReceipts":{"/":"bafy2bzaceaflsspsxuxew2y4g6o72wp5i2ewp3fcolga6n2plw3gycam7s4lg"},"Messages":{"/":"bafy2bzaceanux5ivzlxzvhqxtwc5vkktcfqepubwtwgv26dowzbl3rtgqk54k"},"BLSAggregate":{"Type":2,"Data":"lQg9jBfYhY2vvjB/RPlWg6i+MBTlH1u0lmdasiab5BigsKAuZSeLNlTGbdoVZhAsDUT59ZdGsMmueHjafygDUN2KLhZoChFf6LQHH42PTSXFlkRVHvmKVz9DDU03FLMB"},"Timestamp":1658988330,"BlockSig":{"Type":2,"Data":"rMOv2tXKqV5VDOq5IQ35cP0cCAzGmaugVr/g5JTrilhAn4LYK0h6ByPL5cX5ONzlDTx9+zYZFteIzaenirZhw7G510Lh0J8lbTLP5X2EX251rEA8dpkPZPcNylzN0r8X"},"ForkSignaling":0,"ParentBaseFee":"100"}` |
| 164 | + |
| 165 | +func newTipSet(height abi.ChainEpoch) *types.TipSet { |
| 166 | + var blk types.BlockHeader |
| 167 | + err := json.Unmarshal([]byte(blkRaw), &blk) |
| 168 | + if err != nil { |
| 169 | + panic(err) |
| 170 | + } |
| 171 | + blk.Height = height |
| 172 | + |
| 173 | + ts, err := types.NewTipSet([]*types.BlockHeader{&blk}) |
| 174 | + if err != nil { |
| 175 | + panic(err) |
| 176 | + } |
| 177 | + return ts |
| 178 | +} |
0 commit comments