From 9883354c1df04765890936358c061e5a6b57030e Mon Sep 17 00:00:00 2001 From: Evolution404 <615598813@qq.com> Date: Tue, 1 Jun 2021 19:20:21 +0800 Subject: [PATCH 1/3] trie/trie.go improve the delete performance --- trie/trie.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/trie/trie.go b/trie/trie.go index 7ed235fa8ac..c0f4ae5f91f 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -405,6 +405,10 @@ func (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) { n.flags = t.newFlag() n.Children[key[0]] = nn + if nn != nil { + // n still contains at least two values and cannot be reduced. + return true, n, nil + } // Check how many non-nil entries are left after deleting and // reduce the full node to a short node if only one entry is // left. Since n must've contained at least two children From 1dbb8f6118c3f61157de6b0596aec0cadc36251f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 18 Jun 2021 14:30:58 +0200 Subject: [PATCH 2/3] trie: improve comment about skipping reduction in delete --- trie/trie.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trie/trie.go b/trie/trie.go index c0f4ae5f91f..d3c852d6a0f 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -405,10 +405,14 @@ func (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) { n.flags = t.newFlag() n.Children[key[0]] = nn + // Because n is a full node, it must've contained at least two children + // before the delete operation. If the new child value is non-nil, n still + // has at least two children after the deletion, and cannot be reduced to + // a short node. if nn != nil { - // n still contains at least two values and cannot be reduced. return true, n, nil - } + } + // Reduction: // Check how many non-nil entries are left after deleting and // reduce the full node to a short node if only one entry is // left. Since n must've contained at least two children From 69ff42e8c90d6835d68b3e9d08f300101c252a39 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 18 Jun 2021 14:54:11 +0200 Subject: [PATCH 3/3] trie: whitespace --- trie/trie.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trie/trie.go b/trie/trie.go index d3c852d6a0f..e492a532cb2 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -411,7 +411,7 @@ func (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) { // a short node. if nn != nil { return true, n, nil - } + } // Reduction: // Check how many non-nil entries are left after deleting and // reduce the full node to a short node if only one entry is