diff --git a/server/avl/norace_test.go b/server/avl/norace_test.go index 7c18fb70..b458a444 100644 --- a/server/avl/norace_test.go +++ b/server/avl/norace_test.go @@ -118,6 +118,7 @@ func TestNoRaceSeqSetEncodeLarge(t *testing.T) { logResults("Decode time is %v\n", elapsed) } require_True(t, ss.Nodes() == ss2.Nodes()) + require_True(t, ss.Size() == ss2.Size()) } func TestNoRaceSeqSetRelativeSpeed(t *testing.T) { diff --git a/server/avl/seqset.go b/server/avl/seqset.go index c0187706..140726f8 100644 --- a/server/avl/seqset.go +++ b/server/avl/seqset.go @@ -187,7 +187,7 @@ const ( // hdrLen hdrLen = 2 // minimum length of an encoded SequenceSet. - minLen = 2 + 4 // magic + version + num nodes. + minLen = 2 + 8 // magic + version + num nodes + num entries. ) // EncodeLen returns the bytes needed for encoding. @@ -198,8 +198,10 @@ func (ss SequenceSet) EncodeLen() int { func (ss SequenceSet) Encode(buf []byte) ([]byte, error) { nn, encLen := ss.Nodes(), ss.EncodeLen() - if len(buf) < encLen { + if cap(buf) < encLen { buf = make([]byte, encLen) + } else { + buf = buf[:encLen] } // TODO(dlc) - Go 1.19 introduced Append to not have to keep track. @@ -210,7 +212,8 @@ func (ss SequenceSet) Encode(buf []byte) ([]byte, error) { buf[0], buf[1] = magic, version i := hdrLen le.PutUint32(buf[i:], uint32(nn)) - i += 4 + le.PutUint32(buf[i+4:], uint32(ss.size)) + i += 8 ss.root.nodeIter(func(n *node) { le.PutUint64(buf[i:], n.base) i += 8 @@ -235,7 +238,8 @@ func Decode(buf []byte) (*SequenceSet, error) { var le = binary.LittleEndian index := 2 nn := int(le.Uint32(buf[index:])) - index += 4 + sz := int(le.Uint32(buf[index+4:])) + index += 8 expectedLen := minLen + (nn * ((numBuckets+1)*8 + 2)) if len(buf) != expectedLen { @@ -244,7 +248,9 @@ func Decode(buf []byte) (*SequenceSet, error) { nodes := make([]node, nn) - var ss SequenceSet + ss := SequenceSet{ + size: sz, + } for i := 0; i < nn; i++ { n := &nodes[i] n.base = le.Uint64(buf[index:])