From c2f70a179b589d746bf2b7506c3851027887505d Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Fri, 25 Dec 2020 18:13:41 +0300 Subject: [PATCH] Revert "mpt: do not allocate new buffer when updating dirty node" This reverts commit 168ba7960c3f36af72a2e4dc7a2588b5785401b3. It seems, there are some problems with it: `2020-12-25T18:13:07.476+0300 WARN blockQueue: failed adding block into the blockchain {"error": "error while trying to apply MPT changes: unexpected EOF", "blockHeight": 9729, "nextIndex": 9730}` --- pkg/core/mpt/base.go | 2 +- pkg/core/mpt/trie.go | 17 +++++++++-------- pkg/io/binaryBufWriter.go | 6 ------ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/pkg/core/mpt/base.go b/pkg/core/mpt/base.go index c81bfe6be..1c4ebd8a6 100644 --- a/pkg/core/mpt/base.go +++ b/pkg/core/mpt/base.go @@ -63,7 +63,7 @@ func (b *BaseNode) updateHash(n Node) { // updateCache updates hash and bytes fields for this BaseNode. func (b *BaseNode) updateBytes(n Node) { - buf := io.NewBufBinWriterPreAlloc(b.bytes) + buf := io.NewBufBinWriter() encodeNodeWithType(n, buf.BinWriter) b.bytes = buf.Bytes() b.bytesValid = true diff --git a/pkg/core/mpt/trie.go b/pkg/core/mpt/trie.go index acc11639c..751b1b2f3 100644 --- a/pkg/core/mpt/trie.go +++ b/pkg/core/mpt/trie.go @@ -418,29 +418,31 @@ func (t *Trie) updateRefCount(h util.Uint256) int32 { func (t *Trie) addRef(h util.Uint256, bs []byte) { node := t.refcount[h] if node == nil { - data := make([]byte, len(bs)) - copy(data, bs) t.refcount[h] = &cachedNode{ refcount: 1, - bytes: data, + bytes: bs, } return } node.refcount++ + if node.bytes == nil { + node.bytes = bs + } } func (t *Trie) removeRef(h util.Uint256, bs []byte) { node := t.refcount[h] if node == nil { - data := make([]byte, len(bs)) - copy(data, bs) t.refcount[h] = &cachedNode{ refcount: -1, - bytes: data, + bytes: bs, } return } node.refcount-- + if node.bytes == nil { + node.bytes = bs + } } func (t *Trie) getFromStore(h util.Uint256) (Node, error) { @@ -460,8 +462,7 @@ func (t *Trie) getFromStore(h util.Uint256) (Node, error) { data = data[:len(data)-4] node := t.refcount[h] if node != nil { - node.bytes = make([]byte, len(data)) - copy(node.bytes, data) + node.bytes = data node.initial = int32(r.ReadU32LE()) } } diff --git a/pkg/io/binaryBufWriter.go b/pkg/io/binaryBufWriter.go index 3e1245d3a..7015082e1 100644 --- a/pkg/io/binaryBufWriter.go +++ b/pkg/io/binaryBufWriter.go @@ -19,12 +19,6 @@ func NewBufBinWriter() *BufBinWriter { return &BufBinWriter{BinWriter: NewBinWriterFromIO(b), buf: b} } -// NewBufBinWriterPreAlloc makes a BufBinWriter using preallocated buffer. -func NewBufBinWriterPreAlloc(buf []byte) *BufBinWriter { - b := bytes.NewBuffer(buf[:0]) - return &BufBinWriter{BinWriter: NewBinWriterFromIO(b), buf: b} -} - // Len returns the number of bytes of the unread portion of the buffer. func (bw *BufBinWriter) Len() int { return bw.buf.Len()