Skip to content

Commit cf6eedc

Browse files
author
Dan Laine
authored
merkledb -- codec remove err checks (#1899)
1 parent 5caabf1 commit cf6eedc

File tree

5 files changed

+55
-116
lines changed

5 files changed

+55
-116
lines changed

x/merkledb/codec.go

Lines changed: 36 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ var (
3333
trueBytes = []byte{trueByte}
3434
falseBytes = []byte{falseByte}
3535

36-
errEncodeNil = errors.New("can't encode nil pointer or interface")
3736
errDecodeNil = errors.New("can't decode nil")
3837
errNegativeNumChildren = errors.New("number of children is negative")
3938
errTooManyChildren = fmt.Errorf("length of children list is larger than branching factor of %d", NodeBranchFactor)
@@ -55,8 +54,10 @@ type encoderDecoder interface {
5554
}
5655

5756
type encoder interface {
58-
encodeDBNode(n *dbNode) ([]byte, error)
59-
encodeHashValues(hv *hashValues) ([]byte, error)
57+
// Assumes [n] is non-nil.
58+
encodeDBNode(n *dbNode) []byte
59+
// Assumes [hv] is non-nil.
60+
encodeHashValues(hv *hashValues) []byte
6061
}
6162

6263
type decoder interface {
@@ -73,71 +74,45 @@ func newCodec() encoderDecoder {
7374
}
7475
}
7576

77+
// Note that bytes.Buffer.Write always returns nil so we
78+
// can ignore its return values in [codecImpl] methods.
7679
type codecImpl struct {
7780
varIntPool sync.Pool
7881
}
7982

80-
func (c *codecImpl) encodeDBNode(n *dbNode) ([]byte, error) {
81-
if n == nil {
82-
return nil, errEncodeNil
83-
}
84-
83+
func (c *codecImpl) encodeDBNode(n *dbNode) []byte {
8584
buf := &bytes.Buffer{}
86-
if err := c.encodeMaybeByteSlice(buf, n.value); err != nil {
87-
return nil, err
88-
}
85+
c.encodeMaybeByteSlice(buf, n.value)
8986
childrenLength := len(n.children)
90-
if err := c.encodeInt(buf, childrenLength); err != nil {
91-
return nil, err
92-
}
87+
c.encodeInt(buf, childrenLength)
9388
for index := byte(0); index < NodeBranchFactor; index++ {
9489
if entry, ok := n.children[index]; ok {
95-
if err := c.encodeInt(buf, int(index)); err != nil {
96-
return nil, err
97-
}
90+
c.encodeInt(buf, int(index))
9891
path := entry.compressedPath.Serialize()
99-
if err := c.encodeSerializedPath(path, buf); err != nil {
100-
return nil, err
101-
}
102-
if _, err := buf.Write(entry.id[:]); err != nil {
103-
return nil, err
104-
}
92+
c.encodeSerializedPath(path, buf)
93+
_, _ = buf.Write(entry.id[:])
10594
}
10695
}
107-
return buf.Bytes(), nil
96+
return buf.Bytes()
10897
}
10998

110-
func (c *codecImpl) encodeHashValues(hv *hashValues) ([]byte, error) {
111-
if hv == nil {
112-
return nil, errEncodeNil
113-
}
114-
99+
func (c *codecImpl) encodeHashValues(hv *hashValues) []byte {
115100
buf := &bytes.Buffer{}
116101

117102
length := len(hv.Children)
118-
if err := c.encodeInt(buf, length); err != nil {
119-
return nil, err
120-
}
103+
c.encodeInt(buf, length)
121104

122105
// ensure that the order of entries is consistent
123106
for index := byte(0); index < NodeBranchFactor; index++ {
124107
if entry, ok := hv.Children[index]; ok {
125-
if err := c.encodeInt(buf, int(index)); err != nil {
126-
return nil, err
127-
}
128-
if _, err := buf.Write(entry.id[:]); err != nil {
129-
return nil, err
130-
}
108+
c.encodeInt(buf, int(index))
109+
_, _ = buf.Write(entry.id[:])
131110
}
132111
}
133-
if err := c.encodeMaybeByteSlice(buf, hv.Value); err != nil {
134-
return nil, err
135-
}
136-
if err := c.encodeSerializedPath(hv.Key, buf); err != nil {
137-
return nil, err
138-
}
112+
c.encodeMaybeByteSlice(buf, hv.Value)
113+
c.encodeSerializedPath(hv.Key, buf)
139114

140-
return buf.Bytes(), nil
115+
return buf.Bytes()
141116
}
142117

143118
func (c *codecImpl) decodeDBNode(b []byte, n *dbNode) error {
@@ -201,13 +176,12 @@ func (c *codecImpl) decodeDBNode(b []byte, n *dbNode) error {
201176
return err
202177
}
203178

204-
func (*codecImpl) encodeBool(dst io.Writer, value bool) error {
179+
func (*codecImpl) encodeBool(dst *bytes.Buffer, value bool) {
205180
bytesValue := falseBytes
206181
if value {
207182
bytesValue = trueBytes
208183
}
209-
_, err := dst.Write(bytesValue)
210-
return err
184+
_, _ = dst.Write(bytesValue)
211185
}
212186

213187
func (*codecImpl) decodeBool(src *bytes.Reader) (bool, error) {
@@ -228,8 +202,8 @@ func (*codecImpl) decodeBool(src *bytes.Reader) (bool, error) {
228202
}
229203
}
230204

231-
func (c *codecImpl) encodeInt(dst io.Writer, value int) error {
232-
return c.encodeInt64(dst, int64(value))
205+
func (c *codecImpl) encodeInt(dst *bytes.Buffer, value int) {
206+
c.encodeInt64(dst, int64(value))
233207
}
234208

235209
func (*codecImpl) decodeInt(src *bytes.Reader) (int, error) {
@@ -267,22 +241,18 @@ func (*codecImpl) decodeInt(src *bytes.Reader) (int, error) {
267241
return int(val64), nil
268242
}
269243

270-
func (c *codecImpl) encodeInt64(dst io.Writer, value int64) error {
244+
func (c *codecImpl) encodeInt64(dst *bytes.Buffer, value int64) {
271245
buf := c.varIntPool.Get().([]byte)
272246
size := binary.PutVarint(buf, value)
273-
_, err := dst.Write(buf[:size])
247+
_, _ = dst.Write(buf[:size])
274248
c.varIntPool.Put(buf)
275-
return err
276249
}
277250

278-
func (c *codecImpl) encodeMaybeByteSlice(dst io.Writer, maybeValue maybe.Maybe[[]byte]) error {
279-
if err := c.encodeBool(dst, !maybeValue.IsNothing()); err != nil {
280-
return err
281-
}
282-
if maybeValue.IsNothing() {
283-
return nil
251+
func (c *codecImpl) encodeMaybeByteSlice(dst *bytes.Buffer, maybeValue maybe.Maybe[[]byte]) {
252+
c.encodeBool(dst, !maybeValue.IsNothing())
253+
if maybeValue.HasValue() {
254+
c.encodeByteSlice(dst, maybeValue.Value())
284255
}
285-
return c.encodeByteSlice(dst, maybeValue.Value())
286256
}
287257

288258
func (c *codecImpl) decodeMaybeByteSlice(src *bytes.Reader) (maybe.Maybe[[]byte], error) {
@@ -338,16 +308,11 @@ func (c *codecImpl) decodeByteSlice(src *bytes.Reader) ([]byte, error) {
338308
return result, nil
339309
}
340310

341-
func (c *codecImpl) encodeByteSlice(dst io.Writer, value []byte) error {
342-
if err := c.encodeInt(dst, len(value)); err != nil {
343-
return err
344-
}
311+
func (c *codecImpl) encodeByteSlice(dst *bytes.Buffer, value []byte) {
312+
c.encodeInt(dst, len(value))
345313
if value != nil {
346-
if _, err := dst.Write(value); err != nil {
347-
return err
348-
}
314+
_, _ = dst.Write(value)
349315
}
350-
return nil
351316
}
352317

353318
func (*codecImpl) decodeID(src *bytes.Reader) (ids.ID, error) {
@@ -365,12 +330,9 @@ func (*codecImpl) decodeID(src *bytes.Reader) (ids.ID, error) {
365330
return id, nil
366331
}
367332

368-
func (c *codecImpl) encodeSerializedPath(s SerializedPath, dst io.Writer) error {
369-
if err := c.encodeInt(dst, s.NibbleLength); err != nil {
370-
return err
371-
}
372-
_, err := dst.Write(s.Value)
373-
return err
333+
func (c *codecImpl) encodeSerializedPath(s SerializedPath, dst *bytes.Buffer) {
334+
c.encodeInt(dst, s.NibbleLength)
335+
_, _ = dst.Write(s.Value)
374336
}
375337

376338
func (c *codecImpl) decodeSerializedPath(src *bytes.Reader) (SerializedPath, error) {

x/merkledb/codec_test.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func FuzzCodecBool(f *testing.F) {
129129

130130
// Encoding [got] should be the same as [b].
131131
var buf bytes.Buffer
132-
require.NoError(codec.encodeBool(&buf, got))
132+
codec.encodeBool(&buf, got)
133133
bufBytes := buf.Bytes()
134134
require.Len(bufBytes, numRead)
135135
require.Equal(b[:numRead], bufBytes)
@@ -157,7 +157,7 @@ func FuzzCodecInt(f *testing.F) {
157157

158158
// Encoding [got] should be the same as [b].
159159
var buf bytes.Buffer
160-
require.NoError(codec.encodeInt(&buf, got))
160+
codec.encodeInt(&buf, got)
161161
bufBytes := buf.Bytes()
162162
require.Len(bufBytes, numRead)
163163
require.Equal(b[:numRead], bufBytes)
@@ -185,7 +185,7 @@ func FuzzCodecSerializedPath(f *testing.F) {
185185

186186
// Encoding [got] should be the same as [b].
187187
var buf bytes.Buffer
188-
require.NoError(codec.encodeSerializedPath(got, &buf))
188+
codec.encodeSerializedPath(got, &buf)
189189
bufBytes := buf.Bytes()
190190
require.Len(bufBytes, numRead)
191191
require.Equal(b[:numRead], bufBytes)
@@ -211,8 +211,7 @@ func FuzzCodecDBNodeCanonical(f *testing.F) {
211211
}
212212

213213
// Encoding [node] should be the same as [b].
214-
buf, err := codec.encodeDBNode(node)
215-
require.NoError(err)
214+
buf := codec.encodeDBNode(node)
216215
require.Equal(b, buf)
217216
},
218217
)
@@ -264,8 +263,7 @@ func FuzzCodecDBNodeDeterministic(f *testing.F) {
264263
children: children,
265264
}
266265

267-
nodeBytes, err := codec.encodeDBNode(&node)
268-
require.NoError(err)
266+
nodeBytes := codec.encodeDBNode(&node)
269267

270268
var gotNode dbNode
271269
require.NoError(codec.decodeDBNode(nodeBytes, &gotNode))
@@ -274,8 +272,7 @@ func FuzzCodecDBNodeDeterministic(f *testing.F) {
274272
nilEmptySlices(&gotNode)
275273
require.Equal(node, gotNode)
276274

277-
nodeBytes2, err := codec.encodeDBNode(&gotNode)
278-
require.NoError(err)
275+
nodeBytes2 := codec.encodeDBNode(&gotNode)
279276
require.Equal(nodeBytes, nodeBytes2)
280277
},
281278
)
@@ -299,14 +296,13 @@ func TestCodec_DecodeDBNode(t *testing.T) {
299296
children: map[byte]child{},
300297
}
301298

302-
nodeBytes, err := codec.encodeDBNode(&proof)
303-
require.NoError(err)
299+
nodeBytes := codec.encodeDBNode(&proof)
304300

305301
// Remove num children (0) from end
306302
nodeBytes = nodeBytes[:len(nodeBytes)-minVarIntLen]
307303
proofBytesBuf := bytes.NewBuffer(nodeBytes)
308304
// Put num children -1 at end
309-
require.NoError(codec.(*codecImpl).encodeInt(proofBytesBuf, -1))
305+
codec.(*codecImpl).encodeInt(proofBytesBuf, -1)
310306

311307
err = codec.decodeDBNode(proofBytesBuf.Bytes(), &parsedDBNode)
312308
require.ErrorIs(err, errNegativeNumChildren)
@@ -316,7 +312,7 @@ func TestCodec_DecodeDBNode(t *testing.T) {
316312
nodeBytes = nodeBytes[:len(nodeBytes)-minVarIntLen]
317313
proofBytesBuf = bytes.NewBuffer(nodeBytes)
318314
// Put num children NodeBranchFactor+1 at end
319-
require.NoError(codec.(*codecImpl).encodeInt(proofBytesBuf, NodeBranchFactor+1))
315+
codec.(*codecImpl).encodeInt(proofBytesBuf, NodeBranchFactor+1)
320316

321317
err = codec.decodeDBNode(proofBytesBuf.Bytes(), &parsedDBNode)
322318
require.ErrorIs(err, errTooManyChildren)

x/merkledb/db.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -830,11 +830,7 @@ func (db *merkleDB) onEviction(n *node) error {
830830

831831
// Writes [n] to [batch]. Assumes [n] is non-nil.
832832
func writeNodeToBatch(batch database.Batch, n *node) error {
833-
nodeBytes, err := n.marshal()
834-
if err != nil {
835-
return err
836-
}
837-
833+
nodeBytes := n.marshal()
838834
return batch.Put(n.key.Bytes(), nodeBytes)
839835
}
840836

@@ -1167,12 +1163,8 @@ func (db *merkleDB) initializeRootIfNeeded() (ids.ID, error) {
11671163
}
11681164

11691165
// write the newly constructed root to the DB
1170-
rootBytes, err := db.root.marshal()
1171-
if err != nil {
1172-
return ids.Empty, err
1173-
}
1174-
11751166
batch := db.nodeDB.NewBatch()
1167+
rootBytes := db.root.marshal()
11761168
if err := batch.Put(rootKey, rootBytes); err != nil {
11771169
return ids.Empty, err
11781170
}

x/merkledb/node.go

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,12 @@ func (n *node) hasValue() bool {
8181
}
8282

8383
// Returns the byte representation of this node.
84-
func (n *node) marshal() ([]byte, error) {
85-
if n.nodeBytes != nil {
86-
return n.nodeBytes, nil
84+
func (n *node) marshal() []byte {
85+
if n.nodeBytes == nil {
86+
n.nodeBytes = codec.encodeDBNode(&n.dbNode)
8787
}
8888

89-
nodeBytes, err := codec.encodeDBNode(&n.dbNode)
90-
if err != nil {
91-
return nil, err
92-
}
93-
n.nodeBytes = nodeBytes
94-
return n.nodeBytes, nil
89+
return n.nodeBytes
9590
}
9691

9792
// clear the cached values that will need to be recalculated whenever the node changes
@@ -113,11 +108,7 @@ func (n *node) calculateID(metrics merkleMetrics) error {
113108
Key: n.key.Serialize(),
114109
}
115110

116-
bytes, err := codec.encodeHashValues(hv)
117-
if err != nil {
118-
return err
119-
}
120-
111+
bytes := codec.encodeHashValues(hv)
121112
metrics.HashCalculated()
122113
n.id = hashing.ComputeHash256Array(bytes)
123114
return nil

x/merkledb/node_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ func Test_Node_Marshal(t *testing.T) {
2424
require.NoError(t, childNode.calculateID(&mockMetrics{}))
2525
root.addChild(childNode)
2626

27-
data, err := root.marshal()
28-
require.NoError(t, err)
27+
data := root.marshal()
2928
rootParsed, err := parseNode(newPath([]byte("")), data)
3029
require.NoError(t, err)
3130
require.Len(t, rootParsed.children, 1)
@@ -57,12 +56,11 @@ func Test_Node_Marshal_Errors(t *testing.T) {
5756
require.NoError(t, childNode2.calculateID(&mockMetrics{}))
5857
root.addChild(childNode2)
5958

60-
data, err := root.marshal()
61-
require.NoError(t, err)
59+
data := root.marshal()
6260

6361
for i := 1; i < len(data); i++ {
6462
broken := data[:i]
65-
_, err = parseNode(newPath([]byte("")), broken)
63+
_, err := parseNode(newPath([]byte("")), broken)
6664
require.ErrorIs(t, err, io.ErrUnexpectedEOF)
6765
}
6866
}

0 commit comments

Comments
 (0)