Skip to content

Commit b65b968

Browse files
authored
Merge pull request weaviate#7837 from weaviate/optimize_header_parsing
Optimize Segmentindex header parsing
2 parents 79b88aa + 197817b commit b65b968

File tree

2 files changed

+74
-30
lines changed

2 files changed

+74
-30
lines changed

adapters/repos/db/lsmkv/segmentindex/header.go

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717
"encoding/binary"
1818
"fmt"
1919
"io"
20+
21+
"github.com/weaviate/weaviate/usecases/byteops"
2022
)
2123

2224
const (
@@ -40,20 +42,20 @@ type Header struct {
4042
}
4143

4244
func (h *Header) WriteTo(w io.Writer) (int64, error) {
43-
if err := binary.Write(w, binary.LittleEndian, &h.Level); err != nil {
44-
return -1, err
45-
}
46-
if err := binary.Write(w, binary.LittleEndian, &h.Version); err != nil {
47-
return -1, err
48-
}
49-
if err := binary.Write(w, binary.LittleEndian, &h.SecondaryIndices); err != nil {
50-
return -1, err
51-
}
52-
if err := binary.Write(w, binary.LittleEndian, h.Strategy); err != nil {
53-
return -1, err
45+
data := make([]byte, HeaderSize)
46+
rw := byteops.NewReadWriter(data)
47+
rw.WriteUint16(h.Level)
48+
rw.WriteUint16(h.Version)
49+
rw.WriteUint16(h.SecondaryIndices)
50+
rw.WriteUint16(uint16(h.Strategy))
51+
rw.WriteUint64(h.IndexStart)
52+
53+
write, err := w.Write(data)
54+
if err != nil {
55+
return 0, err
5456
}
55-
if err := binary.Write(w, binary.LittleEndian, &h.IndexStart); err != nil {
56-
return -1, err
57+
if write != HeaderSize {
58+
return 0, fmt.Errorf("expected to write %d bytes, got %d", HeaderSize, write)
5759
}
5860

5961
return int64(HeaderSize), nil
@@ -113,31 +115,26 @@ func (h *Header) SecondaryIndex(source []byte, indexID uint16) ([]byte, error) {
113115
}
114116

115117
func ParseHeader(r io.Reader) (*Header, error) {
116-
out := &Header{}
118+
data := make([]byte, HeaderSize)
117119

118-
if err := binary.Read(r, binary.LittleEndian, &out.Level); err != nil {
120+
full, err := io.ReadFull(r, data)
121+
if err != nil {
119122
return nil, err
120123
}
121-
122-
if err := binary.Read(r, binary.LittleEndian, &out.Version); err != nil {
123-
return nil, err
124-
}
125-
126-
if err := binary.Read(r, binary.LittleEndian, &out.SecondaryIndices); err != nil {
127-
return nil, err
124+
if full != HeaderSize {
125+
return nil, fmt.Errorf("expected %d bytes, got %d", HeaderSize, full)
128126
}
127+
rw := byteops.NewReadWriter(data)
128+
out := &Header{}
129+
out.Level = rw.ReadUint16()
130+
out.Version = rw.ReadUint16()
131+
out.SecondaryIndices = rw.ReadUint16()
132+
out.Strategy = Strategy(rw.ReadUint16())
133+
out.IndexStart = rw.ReadUint64()
129134

130135
if out.Version > CurrentSegmentVersion {
131136
return nil, fmt.Errorf("unsupported version %d", out.Version)
132137
}
133138

134-
if err := binary.Read(r, binary.LittleEndian, &out.Strategy); err != nil {
135-
return nil, err
136-
}
137-
138-
if err := binary.Read(r, binary.LittleEndian, &out.IndexStart); err != nil {
139-
return nil, err
140-
}
141-
142139
return out, nil
143140
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// _ _
2+
// __ _____ __ ___ ___ __ _| |_ ___
3+
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
4+
// \ V V / __/ (_| |\ V /| | (_| | || __/
5+
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
6+
//
7+
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
8+
//
9+
// CONTACT: [email protected]
10+
//
11+
12+
package segmentindex
13+
14+
import (
15+
"bytes"
16+
"os"
17+
"testing"
18+
19+
"github.com/stretchr/testify/require"
20+
)
21+
22+
func BenchmarkParseHeader(b *testing.B) {
23+
data := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
24+
require.Len(b, data, HeaderSize)
25+
b.ResetTimer()
26+
for i := 0; i < b.N; i++ {
27+
_, err := ParseHeader(bytes.NewReader(data))
28+
require.NoError(b, err)
29+
}
30+
}
31+
32+
func BenchmarkWriteHeader(b *testing.B) {
33+
header := Header{
34+
Version: 1,
35+
Level: 1,
36+
SecondaryIndices: 35,
37+
Strategy: StrategyReplace,
38+
IndexStart: 234,
39+
}
40+
path := b.TempDir()
41+
b.ResetTimer()
42+
for i := 0; i < b.N; i++ {
43+
f, err := os.Create(path + "/test.tmp")
44+
require.NoError(b, err)
45+
header.WriteTo(f)
46+
}
47+
}

0 commit comments

Comments
 (0)