wp
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"path/filepath"
|
||||
|
||||
bin "gordenko.dev/dima/bin/little"
|
||||
"gordenko.dev/dima/qb/atree"
|
||||
"gordenko.dev/dima/qb/util"
|
||||
)
|
||||
|
||||
@@ -70,35 +71,15 @@ func writeSnapshot(in writeSnapshotIn) (err error) {
|
||||
}
|
||||
}
|
||||
// free index pages
|
||||
_, err = bin.WriteVarSize(dst, in.FrozenIndexPagesCount)
|
||||
err = writeFreePages(dst, in.FrozenIndexPagesCount, in.IndexPageNumbers)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = bin.WriteVarSize(dst, len(in.IndexPageNumbers))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, pageNo := range in.IndexPageNumbers {
|
||||
err = bin.WriteUint32(dst, pageNo)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
// free data pages
|
||||
_, err = bin.WriteVarSize(dst, in.FrozenDataPagesCount)
|
||||
err = writeFreePages(dst, in.FrozenDataPagesCount, in.DataPageNumbers)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = bin.WriteVarSize(dst, len(in.DataPageNumbers))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, pageNo := range in.DataPageNumbers {
|
||||
err = bin.WriteUint32(dst, pageNo)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
// CRC32
|
||||
bin.WriteUint32(file, hasher.Sum32())
|
||||
|
||||
@@ -196,8 +177,11 @@ func readSnapshot(fileName string) (out readSnapshotOut, err error) {
|
||||
for range metricsQty {
|
||||
var (
|
||||
metricID uint32
|
||||
metric = &ReplayMetric{
|
||||
buffer: make([]byte, minBufferSize),
|
||||
buf = make([]byte, atree.DataPageSize)
|
||||
// для простоти створюю буфер максимального розміру
|
||||
metric = &ReplayMetric{
|
||||
buf: buf,
|
||||
databuf: buf[:atree.DataPagePayloadSize],
|
||||
}
|
||||
)
|
||||
metricID, err = bin.ReadUint32(src)
|
||||
@@ -211,40 +195,15 @@ func readSnapshot(fileName string) (out readSnapshotOut, err error) {
|
||||
metrics[metricID] = metric
|
||||
}
|
||||
// index pages
|
||||
frozenIndexPagesCount, err = bin.ReadVarSize(src)
|
||||
frozenIndexPagesCount, indexPageNumbers, err = readFreePages(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
indexPageNumbersCount, err := bin.ReadVarSize(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for range indexPageNumbersCount {
|
||||
var pageNo uint32
|
||||
pageNo, err = bin.ReadUint32(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
indexPageNumbers = append(indexPageNumbers, pageNo)
|
||||
}
|
||||
// data pages
|
||||
frozenDataPagesCount, err = bin.ReadVarSize(src)
|
||||
frozenDataPagesCount, dataPageNumbers, err = readFreePages(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
dataPageNumbersCount, err := bin.ReadVarSize(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for range dataPageNumbersCount {
|
||||
var pageNo uint32
|
||||
pageNo, err = bin.ReadUint32(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
dataPageNumbers = append(dataPageNumbers, pageNo)
|
||||
}
|
||||
|
||||
// verify CRC32
|
||||
expectedCRC, err := bin.ReadUint32(bufferedReader)
|
||||
if err != nil {
|
||||
@@ -267,3 +226,47 @@ func readSnapshot(fileName string) (out readSnapshotOut, err error) {
|
||||
DataPageNumbers: dataPageNumbers,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// HELPERS
|
||||
|
||||
func writeFreePages(dst io.Writer, frozenPagesCount int, pageNumbers []uint32) (err error) {
|
||||
_, err = bin.WriteVarSize(dst, frozenPagesCount)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = bin.WriteVarSize(dst, len(pageNumbers))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, pageNo := range pageNumbers {
|
||||
err = bin.WriteUint32(dst, pageNo)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func readFreePages(src io.Reader) (_ int, _ []uint32, err error) {
|
||||
var (
|
||||
frozenPagesCount int
|
||||
pageNumbers []uint32
|
||||
)
|
||||
frozenPagesCount, err = bin.ReadVarSize(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
pageNumbersCount, err := bin.ReadVarSize(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for range pageNumbersCount {
|
||||
var pageNo uint32
|
||||
pageNo, err = bin.ReadUint32(src)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
pageNumbers = append(pageNumbers, pageNo)
|
||||
}
|
||||
return frozenPagesCount, pageNumbers, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user