From 4c85ff8ca55176464f0ce74d5fb0953265bb8ccf Mon Sep 17 00:00:00 2001 From: Gary Rong Date: Sun, 25 May 2025 21:04:19 +0800 Subject: [PATCH] trie: add sync pool --- trie/hasher.go | 13 ++++++++++++- trie/node_enc.go | 10 +++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/trie/hasher.go b/trie/hasher.go index cd65115777..9a0b55530a 100644 --- a/trie/hasher.go +++ b/trie/hasher.go @@ -110,10 +110,19 @@ func (h *hasher) encodeShortNode(n *shortNode) []byte { return h.encodedBytes() } +var fnEncoderPool = sync.Pool{ + New: func() interface{} { + var enc fullnodeEncoder + return &enc + }, +} + // encodeFullNode returns a copy of the supplied fullNode, with its child // being replaced by either the hash or an embedded node if the child is small. func (h *hasher) encodeFullNode(n *fullNode) []byte { - var fn fullnodeEncoder + fn := fnEncoderPool.Get().(*fullnodeEncoder) + fn.reset() + if h.parallel { var wg sync.WaitGroup for i := 0; i < 16; i++ { @@ -142,6 +151,8 @@ func (h *hasher) encodeFullNode(n *fullNode) []byte { fn.Children[16] = n.Children[16].(valueNode) } fn.encode(h.encbuf) + fnEncoderPool.Put(fn) + return h.encodedBytes() } diff --git a/trie/node_enc.go b/trie/node_enc.go index cd863002c5..81b3677f06 100644 --- a/trie/node_enc.go +++ b/trie/node_enc.go @@ -43,7 +43,7 @@ func (n *fullNode) encode(w rlp.EncoderBuffer) { func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) { offset := w.List() for i, c := range n.Children { - if c == nil { + if len(c) == 0 { w.Write(rlp.EmptyString) } else { if i == 16 { @@ -60,6 +60,14 @@ func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) { w.ListEnd(offset) } +func (n *fullnodeEncoder) reset() { + for i, c := range n.Children { + if len(c) != 0 { + n.Children[i] = n.Children[i][:0] + } + } +} + func (n *shortNode) encode(w rlp.EncoderBuffer) { offset := w.List() w.WriteBytes(n.Key)