Skip to content

Commit 88437c0

Browse files
committed
Correctly linearize in ctrie iterator
1 parent de8ae95 commit 88437c0

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

trie/ctrie/ctrie.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ func (c *Ctrie) Iterator(cancel <-chan struct{}) <-chan *Entry {
363363
ch := make(chan *Entry)
364364
snapshot := c.ReadOnlySnapshot()
365365
go func() {
366-
traverse(snapshot.root, ch, cancel)
366+
snapshot.traverse(snapshot.readRoot(), ch, cancel)
367367
close(ch)
368368
}()
369369
return ch
@@ -385,13 +385,14 @@ func (c *Ctrie) Size() uint {
385385

386386
var errCanceled = errors.New("canceled")
387387

388-
func traverse(i *iNode, ch chan<- *Entry, cancel <-chan struct{}) error {
388+
func (c *Ctrie) traverse(i *iNode, ch chan<- *Entry, cancel <-chan struct{}) error {
389+
main := gcasRead(i, c)
389390
switch {
390-
case i.main.cNode != nil:
391-
for _, br := range i.main.cNode.array {
391+
case main.cNode != nil:
392+
for _, br := range main.cNode.array {
392393
switch b := br.(type) {
393394
case *iNode:
394-
if err := traverse(b, ch, cancel); err != nil {
395+
if err := c.traverse(b, ch, cancel); err != nil {
395396
return err
396397
}
397398
case *sNode:
@@ -402,8 +403,8 @@ func traverse(i *iNode, ch chan<- *Entry, cancel <-chan struct{}) error {
402403
}
403404
}
404405
}
405-
case i.main.lNode != nil:
406-
for _, e := range i.main.lNode.Map(func(sn interface{}) interface{} {
406+
case main.lNode != nil:
407+
for _, e := range main.lNode.Map(func(sn interface{}) interface{} {
407408
return sn.(*sNode).Entry
408409
}) {
409410
select {

0 commit comments

Comments
 (0)