wp
This commit is contained in:
@@ -3,6 +3,7 @@ package storage
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"reflect"
|
||||
"slices"
|
||||
@@ -914,3 +915,169 @@ func TestWriteValuesWithRewind(t *testing.T) {
|
||||
t.Fatalf("got buf % x are not equal expected % x", before, after)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWALReader(t *testing.T) {
|
||||
rec1 := MetricAddRecord{
|
||||
MetricID: 100,
|
||||
MetricType: qb.Cumulative,
|
||||
FracDigits: 4,
|
||||
}
|
||||
rec2 := MetricAddRecord{
|
||||
MetricID: 200,
|
||||
MetricType: qb.Instant,
|
||||
FracDigits: 1,
|
||||
}
|
||||
rec3 := MetricDeleteRecord{
|
||||
MetricID: 100,
|
||||
FreeIndexPages: []uint32{
|
||||
1, 2, 3,
|
||||
},
|
||||
FreeDataPages: []uint32{
|
||||
10, 20,
|
||||
},
|
||||
}
|
||||
rec4 := MetricDeleteRecord{
|
||||
MetricID: 200,
|
||||
}
|
||||
|
||||
packet1 := createPacket([]Packable{rec1, rec2})
|
||||
packet2 := createPacket([]Packable{rec3, rec4})
|
||||
|
||||
src := bytes.NewBuffer(nil)
|
||||
src.Write(packet1)
|
||||
src.Write(packet2)
|
||||
|
||||
walReader, err := NewWALReader(src)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
i := 0
|
||||
for {
|
||||
records, isLastPacket, err := walReader.NextPacket()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if records == nil {
|
||||
break
|
||||
}
|
||||
switch i {
|
||||
case 0:
|
||||
if isLastPacket {
|
||||
t.Fatalf("1st packet can't be the last packet in WAL")
|
||||
}
|
||||
if !reflect.DeepEqual(records, []any{rec1, rec2}) {
|
||||
t.Fatalf("1st packet decoded incorrectly")
|
||||
}
|
||||
case 1:
|
||||
if !isLastPacket {
|
||||
t.Fatalf("2nd packet must be the last packet in WAL")
|
||||
}
|
||||
if !reflect.DeepEqual(records, []any{rec3, rec4}) {
|
||||
t.Fatalf("2nd packet decoded incorrectly")
|
||||
}
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
func createPacket(records []Packable) []byte {
|
||||
w := bytes.NewBuffer(nil)
|
||||
w.Write([]byte{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, // size (max 9 byte)
|
||||
})
|
||||
hasher := util.NewHasher()
|
||||
multi := io.MultiWriter(w, hasher)
|
||||
for _, rec := range records {
|
||||
rec.Pack(multi)
|
||||
}
|
||||
return finalizePacket(w, hasher.Sum32())
|
||||
}
|
||||
|
||||
func TestReplayMetric(t *testing.T) {
|
||||
// data
|
||||
DataPageSize = 24
|
||||
DataPagePayloadSize = 12
|
||||
dataCRC32Idx = DataPageSize - 4
|
||||
timestampsSizeIdx = DataPageSize - 6
|
||||
valuesSizeIdx = DataPageSize - 8
|
||||
prevPageIdx = DataPageSize - 12
|
||||
// index
|
||||
IndexPageSize = 24
|
||||
indexCRC32Idx = IndexPageSize - 4
|
||||
indexRecordsCountIdx = IndexPageSize - 6
|
||||
isZeroLevelIdx = IndexPageSize - 7
|
||||
maxRecordsOnIndexPage = 2
|
||||
//
|
||||
metric := &ReplayMetric{
|
||||
Buf: []byte{
|
||||
0xa1, 0xa2, 0xa3, 0xa4,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0xb4, 0xb3, 0xb2, 0xb1,
|
||||
0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
},
|
||||
TimestampsSize: 4,
|
||||
ValuesSize: 4,
|
||||
IndexLevelTails: []IndexLevelTail{
|
||||
{
|
||||
Buffer: []byte{
|
||||
0x01, 0x01, 0x01, 0x01,
|
||||
0x02, 0x02, 0x02, 0x02,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
},
|
||||
RecordsCount: 1,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
result := metric.MeasuresAppendWithGrow(MeasuresAppendWithGrowRecord{
|
||||
DataPageTail: DataPageTail{
|
||||
PrevPageNo: 1,
|
||||
CRC32: 3235260875,
|
||||
TimestampsRewindOffset: 1,
|
||||
Timestamps: []byte{0x55, 0x44},
|
||||
ValuesRewindOffset: 2,
|
||||
Values: []byte{0x33, 0x44},
|
||||
},
|
||||
TailTimestamps: []byte{
|
||||
0xf3, 0xf2, 0xf1,
|
||||
},
|
||||
TailValues: []byte{
|
||||
0xd1, 0xd2,
|
||||
},
|
||||
ChangedIndexLevels: []ChangedIndexLevel{
|
||||
{
|
||||
IndexPageTail: &IndexPageTail{
|
||||
CRC32: 2138044007,
|
||||
Records: []byte{
|
||||
0x03, 0x03, 0x03, 0x03,
|
||||
0x04, 0x04, 0x04, 0x04,
|
||||
},
|
||||
},
|
||||
TailRecords: []byte{
|
||||
0x08, 0x08, 0x08, 0x08,
|
||||
0x09, 0x09, 0x09, 0x09,
|
||||
},
|
||||
},
|
||||
{
|
||||
TailRecords: []byte{
|
||||
0x01, 0x01, 0x01, 0x01,
|
||||
0x02, 0x02, 0x02, 0x02,
|
||||
},
|
||||
},
|
||||
},
|
||||
}, true) // last packet
|
||||
|
||||
fmt.Printf("% x\n", metric.Buf)
|
||||
|
||||
fmt.Printf("% x\n", result.DataPagesToRewrite[0].Content)
|
||||
|
||||
fmt.Printf("% x\n", result.IndexPagesToRewrite[0].Content)
|
||||
|
||||
fmt.Printf("%d: % x\n", metric.IndexLevelTails[0].RecordsCount, metric.IndexLevelTails[0].Buffer)
|
||||
fmt.Printf("%d: % x\n", metric.IndexLevelTails[1].RecordsCount, metric.IndexLevelTails[1].Buffer)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user