wp
This commit is contained in:
167
atree/cursor.go
167
atree/cursor.go
@@ -5,8 +5,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"gordenko.dev/dima/qb"
|
||||
"gordenko.dev/dima/qb/bin"
|
||||
"gordenko.dev/dima/qb/enc"
|
||||
)
|
||||
|
||||
type BackwardCursor struct {
|
||||
@@ -66,50 +64,50 @@ func (s *BackwardCursor) Prev() (uint32, float64, bool, error) {
|
||||
var (
|
||||
timestamp uint32
|
||||
value float64
|
||||
done bool
|
||||
err error
|
||||
//done bool
|
||||
//err error
|
||||
)
|
||||
|
||||
timestamp, done = s.timestampDecompressor.NextValue()
|
||||
if !done {
|
||||
value, done = s.valueDecompressor.NextValue()
|
||||
if done {
|
||||
return 0, 0, false,
|
||||
fmt.Errorf("corrupted data page %d: has timestamp, no value",
|
||||
s.pageNo)
|
||||
}
|
||||
return timestamp, value, false, nil
|
||||
}
|
||||
// timestamp, done = s.timestampDecompressor.NextValue()
|
||||
// if !done {
|
||||
// value, done = s.valueDecompressor.NextValue()
|
||||
// if done {
|
||||
// return 0, 0, false,
|
||||
// fmt.Errorf("corrupted data page %d: has timestamp, no value",
|
||||
// s.pageNo)
|
||||
// }
|
||||
// return timestamp, value, false, nil
|
||||
// }
|
||||
|
||||
prevPageNo := bin.GetUint32(s.pageData[prevPageIdx:])
|
||||
if prevPageNo == 0 {
|
||||
return 0, 0, true, nil
|
||||
}
|
||||
s.atree.releasePage(s.pageNo)
|
||||
// prevPageNo, _ := bin.GetUint32(s.pageData[prevPageIdx:])
|
||||
// if prevPageNo == 0 {
|
||||
// return 0, 0, true, nil
|
||||
// }
|
||||
// s.atree.releasePage(s.pageNo)
|
||||
|
||||
s.pageNo = prevPageNo
|
||||
s.pageData, err = s.atree.fetchDataPage(s.pageNo)
|
||||
if err != nil {
|
||||
return 0, 0, false, fmt.Errorf("atree.fetchDataPage(%d): %s", s.pageNo, err)
|
||||
}
|
||||
// s.pageNo = prevPageNo
|
||||
// s.pageData, err = s.atree.fetchDataPage(s.pageNo)
|
||||
// if err != nil {
|
||||
// return 0, 0, false, fmt.Errorf("atree.fetchDataPage(%d): %s", s.pageNo, err)
|
||||
// }
|
||||
|
||||
err = s.makeDecompressors()
|
||||
if err != nil {
|
||||
return 0, 0, false, err
|
||||
}
|
||||
// err = s.makeDecompressors()
|
||||
// if err != nil {
|
||||
// return 0, 0, false, err
|
||||
// }
|
||||
|
||||
timestamp, done = s.timestampDecompressor.NextValue()
|
||||
if done {
|
||||
return 0, 0, false,
|
||||
fmt.Errorf("corrupted data page %d: no timestamps",
|
||||
s.pageNo)
|
||||
}
|
||||
value, done = s.valueDecompressor.NextValue()
|
||||
if done {
|
||||
return 0, 0, false,
|
||||
fmt.Errorf("corrupted data page %d: no values",
|
||||
s.pageNo)
|
||||
}
|
||||
// timestamp, done = s.timestampDecompressor.NextValue()
|
||||
// if done {
|
||||
// return 0, 0, false,
|
||||
// fmt.Errorf("corrupted data page %d: no timestamps",
|
||||
// s.pageNo)
|
||||
// }
|
||||
// value, done = s.valueDecompressor.NextValue()
|
||||
// if done {
|
||||
// return 0, 0, false,
|
||||
// fmt.Errorf("corrupted data page %d: no values",
|
||||
// s.pageNo)
|
||||
// }
|
||||
return timestamp, value, false, nil
|
||||
}
|
||||
|
||||
@@ -120,68 +118,69 @@ func (s *BackwardCursor) Close() {
|
||||
// HELPER
|
||||
|
||||
func (s *BackwardCursor) makeDecompressors() error {
|
||||
timestampsPayloadSize := bin.GetUint16(s.pageData[timestampsSizeIdx:])
|
||||
valuesPayloadSize := bin.GetUint16(s.pageData[valuesSizeIdx:])
|
||||
// timestampsSize, _ := bin.GetUint16(s.pageData[timestampsSizeIdx:])
|
||||
// valuesSize, _ := bin.GetUint16(s.pageData[valuesSizeIdx:])
|
||||
|
||||
payloadSize := timestampsPayloadSize + valuesPayloadSize
|
||||
// payloadSize := timestampsSize + valuesSize
|
||||
|
||||
if payloadSize > dataFooterIdx {
|
||||
return fmt.Errorf("corrupted data page %d: timestamps + values size %d gt payload size",
|
||||
s.pageNo, payloadSize)
|
||||
}
|
||||
// if payloadSize > dataFooterIdx {
|
||||
// return fmt.Errorf("corrupted data page %d: timestamps + values size %d gt payload size",
|
||||
// s.pageNo, payloadSize)
|
||||
// }
|
||||
|
||||
s.timestampDecompressor = enc.NewTimeDeltaDecompressor(
|
||||
s.pageData[:timestampsPayloadSize],
|
||||
)
|
||||
// s.timestampDecompressor = enc.NewTimeDeltaDecompressor(
|
||||
// s.pageData[:timestampsSize],
|
||||
// )
|
||||
|
||||
vbuf := s.pageData[timestampsPayloadSize : timestampsPayloadSize+valuesPayloadSize]
|
||||
// vbuf := s.pageData[timestampsSize : timestampsSize+valuesSize]
|
||||
|
||||
switch s.metricType {
|
||||
case qb.Instant:
|
||||
s.valueDecompressor = enc.NewInstantDeltaDecompressor(
|
||||
vbuf, s.fracDigits)
|
||||
// switch s.metricType {
|
||||
// case qb.Instant:
|
||||
// s.valueDecompressor = enc.NewInstantDeltaDecompressor(
|
||||
// vbuf, s.fracDigits)
|
||||
|
||||
case qb.Cumulative:
|
||||
s.valueDecompressor = enc.NewCumulativeDeltaDecompressor(
|
||||
vbuf, s.fracDigits)
|
||||
// case qb.Cumulative:
|
||||
// s.valueDecompressor = enc.NewCumulativeDeltaDecompressor(
|
||||
// vbuf, s.fracDigits)
|
||||
|
||||
default:
|
||||
return fmt.Errorf("bug: wrong metricType %d", s.metricType)
|
||||
}
|
||||
// default:
|
||||
// return fmt.Errorf("bug: wrong metricType %d", s.metricType)
|
||||
// }
|
||||
return nil
|
||||
}
|
||||
|
||||
func makeDecompressors(pageData []byte, metricType qb.MetricType, fracDigits byte) (
|
||||
qb.TimestampDecompressor, qb.ValueDecompressor, error,
|
||||
) {
|
||||
timestampsPayloadSize := bin.GetUint16(pageData[timestampsSizeIdx:])
|
||||
valuesPayloadSize := bin.GetUint16(pageData[valuesSizeIdx:])
|
||||
// timestampsSize, _ := bin.GetUint16(pageData[timestampsSizeIdx:])
|
||||
// valuesSize, _ := bin.GetUint16(pageData[valuesSizeIdx:])
|
||||
|
||||
payloadSize := timestampsPayloadSize + valuesPayloadSize
|
||||
// payloadSize := timestampsSize + valuesSize
|
||||
|
||||
if payloadSize > dataFooterIdx {
|
||||
return nil, nil, fmt.Errorf("corrupted: timestamps + values size %d > payload size",
|
||||
payloadSize)
|
||||
}
|
||||
// if payloadSize > dataFooterIdx {
|
||||
// return nil, nil, fmt.Errorf("corrupted: timestamps + values size %d > payload size",
|
||||
// payloadSize)
|
||||
// }
|
||||
|
||||
timestampDecompressor := enc.NewTimeDeltaDecompressor(
|
||||
pageData[:timestampsPayloadSize],
|
||||
)
|
||||
// timestampDecompressor := enc.NewTimeDeltaDecompressor(
|
||||
// pageData[:timestampsSize],
|
||||
// )
|
||||
|
||||
vbuf := pageData[timestampsPayloadSize : timestampsPayloadSize+valuesPayloadSize]
|
||||
// vbuf := pageData[timestampsSize : timestampsSize+valuesSize]
|
||||
|
||||
var valueDecompressor qb.ValueDecompressor
|
||||
switch metricType {
|
||||
case qb.Instant:
|
||||
valueDecompressor = enc.NewInstantDeltaDecompressor(
|
||||
vbuf, fracDigits)
|
||||
// var valueDecompressor qb.ValueDecompressor
|
||||
// switch metricType {
|
||||
// case qb.Instant:
|
||||
// valueDecompressor = enc.NewInstantDeltaDecompressor(
|
||||
// vbuf, fracDigits)
|
||||
|
||||
case qb.Cumulative:
|
||||
valueDecompressor = enc.NewCumulativeDeltaDecompressor(
|
||||
vbuf, fracDigits)
|
||||
// case qb.Cumulative:
|
||||
// valueDecompressor = enc.NewCumulativeDeltaDecompressor(
|
||||
// vbuf, fracDigits)
|
||||
|
||||
default:
|
||||
return nil, nil, fmt.Errorf("bug: wrong metricType %d", metricType)
|
||||
}
|
||||
return timestampDecompressor, valueDecompressor, nil
|
||||
// default:
|
||||
// return nil, nil, fmt.Errorf("bug: wrong metricType %d", metricType)
|
||||
// }
|
||||
//return timestampDecompressor, valueDecompressor, nil
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user