Backward compatibility with upcoming index v3

Signed-off-by: Ganesh Vernekar <ganeshvern@gmail.com>
This commit is contained in:
Ganesh Vernekar 2024-09-18 10:26:31 -04:00 committed by Bryan Boreham
parent 5e68360dc8
commit 5ccb069414

View file

@ -43,10 +43,12 @@ const (
// HeaderLen represents number of bytes reserved of index for header. // HeaderLen represents number of bytes reserved of index for header.
HeaderLen = 5 HeaderLen = 5
// FormatV1 represents 1 version of index. // FormatV1 represents version 1 of index.
FormatV1 = 1 FormatV1 = 1
// FormatV2 represents 2 version of index. // FormatV2 represents version 2 of index.
FormatV2 = 2 FormatV2 = 2
// FormatV3 represents version 3 of index.
FormatV3 = 3
indexFilename = "index" indexFilename = "index"
@ -1193,7 +1195,9 @@ func newReader(b ByteSlice, c io.Closer) (*Reader, error) {
} }
r.version = int(r.b.Range(4, 5)[0]) r.version = int(r.b.Range(4, 5)[0])
if r.version != FormatV1 && r.version != FormatV2 { switch r.version {
case FormatV1, FormatV2, FormatV3:
default:
return nil, fmt.Errorf("unknown index file version %d", r.version) return nil, fmt.Errorf("unknown index file version %d", r.version)
} }
@ -1351,7 +1355,9 @@ func (s Symbols) Lookup(o uint32) (string, error) {
B: s.bs.Range(0, s.bs.Len()), B: s.bs.Range(0, s.bs.Len()),
} }
if s.version == FormatV2 { if s.version == FormatV1 {
d.Skip(int(o))
} else {
if int(o) >= s.seen { if int(o) >= s.seen {
return "", fmt.Errorf("unknown symbol offset %d", o) return "", fmt.Errorf("unknown symbol offset %d", o)
} }
@ -1360,8 +1366,6 @@ func (s Symbols) Lookup(o uint32) (string, error) {
for i := o - (o / symbolFactor * symbolFactor); i > 0; i-- { for i := o - (o / symbolFactor * symbolFactor); i > 0; i-- {
d.UvarintBytes() d.UvarintBytes()
} }
} else {
d.Skip(int(o))
} }
sym := d.UvarintStr() sym := d.UvarintStr()
if d.Err() != nil { if d.Err() != nil {
@ -1407,11 +1411,11 @@ func (s Symbols) ReverseLookup(sym string) (uint32, error) {
if lastSymbol != sym { if lastSymbol != sym {
return 0, fmt.Errorf("unknown symbol %q", sym) return 0, fmt.Errorf("unknown symbol %q", sym)
} }
if s.version == FormatV2 { if s.version == FormatV1 {
return uint32(res), nil
}
return uint32(s.bs.Len() - lastLen), nil return uint32(s.bs.Len() - lastLen), nil
} }
return uint32(res), nil
}
func (s Symbols) Size() int { func (s Symbols) Size() int {
return len(s.offsets) * 8 return len(s.offsets) * 8
@ -1569,7 +1573,7 @@ func (r *Reader) LabelNamesFor(ctx context.Context, postings Postings) ([]string
offset := id offset := id
// In version 2 series IDs are no longer exact references but series are 16-byte padded // In version 2 series IDs are no longer exact references but series are 16-byte padded
// and the ID is the multiple of 16 of the actual position. // and the ID is the multiple of 16 of the actual position.
if r.version == FormatV2 { if r.version != FormatV1 {
offset = id * seriesByteAlign offset = id * seriesByteAlign
} }
@ -1608,7 +1612,7 @@ func (r *Reader) LabelValueFor(ctx context.Context, id storage.SeriesRef, label
offset := id offset := id
// In version 2 series IDs are no longer exact references but series are 16-byte padded // In version 2 series IDs are no longer exact references but series are 16-byte padded
// and the ID is the multiple of 16 of the actual position. // and the ID is the multiple of 16 of the actual position.
if r.version == FormatV2 { if r.version != FormatV1 {
offset = id * seriesByteAlign offset = id * seriesByteAlign
} }
d := encoding.NewDecbufUvarintAt(r.b, int(offset), castagnoliTable) d := encoding.NewDecbufUvarintAt(r.b, int(offset), castagnoliTable)
@ -1634,7 +1638,7 @@ func (r *Reader) Series(id storage.SeriesRef, builder *labels.ScratchBuilder, ch
offset := id offset := id
// In version 2 series IDs are no longer exact references but series are 16-byte padded // In version 2 series IDs are no longer exact references but series are 16-byte padded
// and the ID is the multiple of 16 of the actual position. // and the ID is the multiple of 16 of the actual position.
if r.version == FormatV2 { if r.version != FormatV1 {
offset = id * seriesByteAlign offset = id * seriesByteAlign
} }
d := encoding.NewDecbufUvarintAt(r.b, int(offset), castagnoliTable) d := encoding.NewDecbufUvarintAt(r.b, int(offset), castagnoliTable)