mirror of
1
Fork 0

[bugfix] fix possible domain blockcache nil ptr + add debug String() func (#1755)

This commit is contained in:
kim 2023-05-09 15:18:51 +01:00 committed by GitHub
parent 8275d70e38
commit 11e843a273
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 6 deletions

View File

@ -80,6 +80,14 @@ func (b *BlockCache) Clear() {
atomic.StorePointer(&b.rootptr, nil) 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 // root is the root node in the domain
// block cache radix trie. this is the // block cache radix trie. this is the
// singular access point to the trie. // singular access point to the trie.
@ -104,6 +112,13 @@ func (r *root) Sort() {
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 { type node struct {
part string part string
child []*node child []*node
@ -152,12 +167,7 @@ func (n *node) add(parts []string) {
} }
func (n *node) match(parts []string) bool { func (n *node) match(parts []string) bool {
if len(parts) == 0 { for len(parts) > 0 {
// Invalid domain.
return false
}
for {
// Pop next domain part. // Pop next domain part.
i := len(parts) - 1 i := len(parts) - 1
part := parts[i] part := parts[i]
@ -181,6 +191,10 @@ func (n *node) match(parts []string) bool {
// child node. // child node.
n = nn n = nn
} }
// Ran out of parts
// without a match.
return false
} }
// getChild fetches child node with given domain part string // getChild fetches child node with given domain part string
@ -222,3 +236,22 @@ func (n *node) sort() {
child.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)
}
}

View File

@ -69,7 +69,9 @@ func TestBlockCache(t *testing.T) {
} }
// Clear the cache // Clear the cache
t.Logf("%+v\n", c)
c.Clear() c.Clear()
t.Logf("%+v\n", c)
knownErr := errors.New("known error") knownErr := errors.New("known error")