tmp
This commit is contained in:
122
txlog/snapshot.go
Normal file
122
txlog/snapshot.go
Normal file
@@ -0,0 +1,122 @@
|
||||
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
|
||||
// }
|
||||
Reference in New Issue
Block a user