Skip to content

Commit

Permalink
[bugfix] fix possible domain blockcache nil ptr + add debug String() …
Browse files Browse the repository at this point in the history
…func (#1755)
  • Loading branch information
NyaaaWhatsUpDoc authored May 9, 2023
1 parent 8275d70 commit 11e843a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
45 changes: 39 additions & 6 deletions internal/cache/domain/domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,14 @@ func (b *BlockCache) Clear() {
atomic.StorePointer(&b.rootptr, nil)
}

// String returns a string representation of stored domains in block cache.
func (b *BlockCache) String() string {
if ptr := atomic.LoadPointer(&b.rootptr); ptr != nil {
return (*root)(ptr).String()
}
return "<empty>"
}

// root is the root node in the domain
// block cache radix trie. this is the
// singular access point to the trie.
Expand All @@ -104,6 +112,13 @@ func (r *root) Sort() {
r.root.sort()
}

// String returns a string representation of node (and its descendants).
func (r *root) String() string {
buf := new(strings.Builder)
r.root.writestr(buf, "")
return buf.String()
}

type node struct {
part string
child []*node
Expand Down Expand Up @@ -152,12 +167,7 @@ func (n *node) add(parts []string) {
}

func (n *node) match(parts []string) bool {
if len(parts) == 0 {
// Invalid domain.
return false
}

for {
for len(parts) > 0 {
// Pop next domain part.
i := len(parts) - 1
part := parts[i]
Expand All @@ -181,6 +191,10 @@ func (n *node) match(parts []string) bool {
// child node.
n = nn
}

// Ran out of parts
// without a match.
return false
}

// getChild fetches child node with given domain part string
Expand Down Expand Up @@ -222,3 +236,22 @@ func (n *node) sort() {
child.sort()
}
}

func (n *node) writestr(buf *strings.Builder, prefix string) {
if prefix != "" {
// Suffix joining '.'
prefix += "."
}

// Append current part.
prefix += n.part

// Dump current prefix state.
buf.WriteString(prefix)
buf.WriteByte('\n')

// Iterate through node children.
for _, child := range n.child {
child.writestr(buf, prefix)
}
}
2 changes: 2 additions & 0 deletions internal/cache/domain/domain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ func TestBlockCache(t *testing.T) {
}

// Clear the cache
t.Logf("%+v\n", c)
c.Clear()
t.Logf("%+v\n", c)

knownErr := errors.New("known error")

Expand Down

0 comments on commit 11e843a

Please sign in to comment.