123 lines
2.7 KiB
Go
123 lines
2.7 KiB
Go
package txlog
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
bin "gordenko.dev/dima/bin/little"
|
|
"gordenko.dev/dima/qb"
|
|
"gordenko.dev/dima/qb/atree"
|
|
"gordenko.dev/dima/qb/util"
|
|
)
|
|
|
|
func LoadSnapshot(fileName string) (snapshot Snapshot, err error) {
|
|
var (
|
|
hasher = util.NewHasher()
|
|
header = make([]byte, metricHeaderSize)
|
|
body = make([]byte, atree.PageSize)
|
|
)
|
|
|
|
file, err := os.Open(fileName)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
src := io.TeeReader(file, hasher)
|
|
metricsQty, err := bin.ReadVarSize(src)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for range metricsQty {
|
|
var metric Metric
|
|
err = bin.ReadNInto(src, header)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
metric.MetricID, _ = bin.GetUint32(header[0:])
|
|
metric.MetricType = qb.MetricType(header[4])
|
|
metric.FracDigits = header[5]
|
|
metric.LastPageNo, _ = bin.GetUint32(header[6:])
|
|
metric.Since, _ = bin.GetUint32(header[10:])
|
|
metric.SinceValue, _ = bin.GetFloat64(header[14:])
|
|
metric.Until, _ = bin.GetUint32(header[22:])
|
|
metric.UntilValue, _ = bin.GetFloat64(header[26:])
|
|
tSize, _ := bin.GetUint16(header[34:])
|
|
vSize, _ := bin.GetUint16(header[36:])
|
|
|
|
buf := body[:tSize]
|
|
err = bin.ReadNInto(src, buf)
|
|
if err != nil {
|
|
return
|
|
}
|
|
// FIX
|
|
// metric.Timestamps = chunkenc.NewReverseTimeDeltaCompressor(
|
|
// conbuf.NewFromBuffer(buf),
|
|
// int(tSize),
|
|
// )
|
|
|
|
buf = body[:vSize]
|
|
err = bin.ReadNInto(src, buf)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// FIX
|
|
// if metric.MetricType == qb.Cumulative {
|
|
// metric.Values = chunkenc.NewReverseCumulativeDeltaCompressor(
|
|
// conbuf.NewFromBuffer(buf),
|
|
// int(vSize),
|
|
// metric.FracDigits,
|
|
// )
|
|
// } else {
|
|
// metric.Values = chunkenc.NewReverseInstantDeltaCompressor(
|
|
// conbuf.NewFromBuffer(buf),
|
|
// int(vSize),
|
|
// metric.FracDigits,
|
|
// )
|
|
// }
|
|
// s.metrics[metricID] = &metric
|
|
}
|
|
// FIX
|
|
// err = restoreFreeList(s.dataFreeList, src)
|
|
// if err != nil {
|
|
// return fmt.Errorf("restore dataFreeList: %s", err)
|
|
// }
|
|
// FIX
|
|
// err = restoreFreeList(s.indexFreeList, src)
|
|
// if err != nil {
|
|
// return fmt.Errorf("restore indexFreeList: %s", err)
|
|
// }
|
|
|
|
calculatedChecksum := hasher.Sum32()
|
|
|
|
writtenChecksum, err := bin.ReadUint32(file)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if calculatedChecksum != writtenChecksum {
|
|
err = fmt.Errorf("calculated checksum %d not equal written checksum %d",
|
|
calculatedChecksum, writtenChecksum)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// serialized + frozen pages count
|
|
|
|
// func restoreFreeList(freeList *freelist.FreeList, src io.Reader) error {
|
|
// size, err := bin.ReadVarSize(src)
|
|
// if err != nil {
|
|
// return err
|
|
// }
|
|
// serialized, err := bin.ReadN(src, size)
|
|
// if err != nil {
|
|
// return err
|
|
// }
|
|
// freeList.Restore(serialized)
|
|
// return nil
|
|
// }
|