Skip to content

Commit ca68534

Browse files
committed
fix delete nodes
1 parent e2c4e7e commit ca68534

File tree

4 files changed

+117
-6
lines changed

4 files changed

+117
-6
lines changed

core/util/wmpt/trie.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type WeightedMerkleTrie struct {
2727
root Node
2828
db storage.StorageAdapter
2929
oldRoot hashNode
30-
deleted [][]byte
30+
deleted map[[32]byte]bool
3131
tempDeleted [][]byte
3232
created [][]byte
3333
sync.Mutex
@@ -38,7 +38,7 @@ func New(root Node, db storage.StorageAdapter) *WeightedMerkleTrie {
3838
if root == nil {
3939
root = emptyNode
4040
}
41-
return &WeightedMerkleTrie{db: db, root: root}
41+
return &WeightedMerkleTrie{db: db, root: root, deleted: make(map[[32]byte]bool)}
4242
}
4343

4444
func (t *WeightedMerkleTrie) CopyRoot(collapseLevel int) Node {
@@ -322,8 +322,8 @@ func (t *WeightedMerkleTrie) Rollback() {
322322
func (t *WeightedMerkleTrie) DeleteNodes() error {
323323
if len(t.deleted) > 0 {
324324
batcher := t.db.NewBatch()
325-
for _, key := range t.deleted {
326-
err := batcher.Delete(key)
325+
for key := range t.deleted {
326+
err := batcher.Delete(key[:])
327327
if err != nil {
328328
return err
329329
}
@@ -333,7 +333,12 @@ func (t *WeightedMerkleTrie) DeleteNodes() error {
333333
return err
334334
}
335335
}
336-
t.deleted = t.tempDeleted
336+
clear(t.deleted)
337+
for _, key := range t.tempDeleted {
338+
var k [32]byte
339+
copy(k[:], key)
340+
t.deleted[k] = true
341+
}
337342
t.tempDeleted = nil
338343
return nil
339344
}
@@ -541,6 +546,10 @@ func (t *WeightedMerkleTrie) collectDeleteAndCreated(deleteChan, createdChan cha
541546
}()
542547
go func() {
543548
for hash := range createdChan {
549+
//check if hash is in deleted, if so, remove it
550+
var k [32]byte
551+
copy(k[:], hash)
552+
delete(t.deleted, k)
544553
t.created = append(t.created, hash)
545554
}
546555
wg.Done()

core/util/wmpt/trie_test.go

+95
Original file line numberDiff line numberDiff line change
@@ -207,3 +207,98 @@ func TestUpdateTrie(t *testing.T) {
207207
assert.Equal(t, trie.root.Weight(), uint64(15))
208208
assert.NotEqual(t, h1, h2)
209209
}
210+
211+
func TestCommitAndRollback(t *testing.T) {
212+
wd, err := os.Getwd()
213+
assert.NoError(t, err)
214+
pebDir := filepath.Join(wd, "pebble_storage")
215+
assert.NoError(t, os.RemoveAll(pebDir))
216+
assert.NoError(t, os.MkdirAll(pebDir, 0777))
217+
db, err := kv.NewPebbleAdapter(pebDir, nil)
218+
if err != nil {
219+
t.Fatal(err)
220+
}
221+
defer func() {
222+
db.Close()
223+
os.RemoveAll(pebDir)
224+
}()
225+
t1 := New(nil, db)
226+
keys := make([][]byte, 0, 5)
227+
for i := 0; i < 5; i++ {
228+
hash := sha256.Sum256([]byte(strconv.Itoa(i)))
229+
keys = append(keys, hash[:])
230+
}
231+
t1.SaveRoot()
232+
t1.Update(keys[0], []byte("a"), 10)
233+
b, err := t1.Commit(3)
234+
assert.NoError(t, err)
235+
err = b.Commit(true)
236+
assert.NoError(t, err)
237+
assert.NoError(t, t1.DeleteNodes())
238+
t1.SaveRoot()
239+
assert.NoError(t, t1.Update(keys[0], nil, 0))
240+
b, err = t1.Commit(3)
241+
assert.NoError(t, err)
242+
err = b.Commit(true)
243+
assert.NoError(t, err)
244+
assert.NoError(t, t1.DeleteNodes())
245+
h := t1.Root()
246+
assert.Equal(t, h, emptyState)
247+
data, err := t1.GetPath(nil)
248+
assert.NoError(t, err)
249+
t2 := New(nil, nil)
250+
assert.NoError(t, t2.Deserialize(data))
251+
h2 := t2.GetRoot().CalcHash()
252+
assert.Equal(t, h2, h)
253+
t1.SaveRoot()
254+
t1.Rollback()
255+
assert.Equal(t, t1.Root(), h)
256+
}
257+
258+
func TestUploadDelete(t *testing.T) {
259+
wd, err := os.Getwd()
260+
assert.NoError(t, err)
261+
pebDir := filepath.Join(wd, "pebble_storage")
262+
assert.NoError(t, os.RemoveAll(pebDir))
263+
assert.NoError(t, os.MkdirAll(pebDir, 0777))
264+
db, err := kv.NewPebbleAdapter(pebDir, nil)
265+
if err != nil {
266+
t.Fatal(err)
267+
}
268+
defer func() {
269+
db.Close()
270+
os.RemoveAll(pebDir)
271+
}()
272+
t1 := New(nil, db)
273+
keys := make([][]byte, 0, 5)
274+
for i := 0; i < 5; i++ {
275+
hash := sha256.Sum256([]byte(strconv.Itoa(i)))
276+
keys = append(keys, hash[:])
277+
}
278+
t1.SaveRoot()
279+
t1.Update(keys[0], []byte("a"), 10)
280+
b, err := t1.Commit(3)
281+
assert.NoError(t, err)
282+
err = b.Commit(true)
283+
assert.NoError(t, err)
284+
assert.NoError(t, t1.DeleteNodes())
285+
t1.SaveRoot()
286+
assert.NoError(t, t1.Update(keys[0], nil, 0))
287+
b, err = t1.Commit(3)
288+
assert.NoError(t, err)
289+
err = b.Commit(true)
290+
assert.NoError(t, err)
291+
assert.NoError(t, t1.DeleteNodes())
292+
t1.Update(keys[0], []byte("a"), 10)
293+
b, err = t1.Commit(3)
294+
assert.NoError(t, err)
295+
err = b.Commit(true)
296+
assert.NoError(t, err)
297+
assert.NoError(t, t1.DeleteNodes())
298+
t2 := New(&hashNode{
299+
weight: 10,
300+
hash: t1.GetRoot().CalcHash(),
301+
}, db)
302+
_, _, err = t2.GetBlockProof(6)
303+
assert.NoError(t, err)
304+
}

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/0chain/common
22

3-
go 1.18
3+
go 1.21
44

55
require (
66
github.com/cockroachdb/pebble v1.1.2

go.sum

+7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ github.com/0chain/msgp v1.1.62 h1:D/s/TYygUwQnMlvfHUjh56FEaI0wP2VfPVS0TTGGu9I=
4040
github.com/0chain/msgp v1.1.62/go.mod h1:g7jEyb18KPe65d9RRhGw+ThaJr5duyBH8eaFgBUor7Y=
4141
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4242
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
43+
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
4344
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
4445
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
4546
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
@@ -67,6 +68,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
6768
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
6869
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
6970
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
71+
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
7072
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
7173
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
7274
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
@@ -90,13 +92,15 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
9092
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
9193
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
9294
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
95+
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
9396
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
9497
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
9598
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
9699
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
97100
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
98101
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
99102
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
103+
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
100104
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
101105
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
102106
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -154,6 +158,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
154158
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
155159
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
156160
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
161+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
157162
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
158163
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
159164
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -228,6 +233,7 @@ github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaF
228233
github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9 h1:6ob53CVz+ja2i7easAStApZJlh7sxyq3Cm7g1Di6iqA=
229234
github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
230235
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
236+
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
231237
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
232238
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
233239
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -632,6 +638,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
632638
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
633639
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
634640
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
641+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
635642
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
636643
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
637644
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=

0 commit comments

Comments
 (0)