wp
This commit is contained in:
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
// METRIC
|
||||
|
||||
const minBufferSize = 1024
|
||||
//const minBufferSize = 1024
|
||||
|
||||
var (
|
||||
indexRecordSize = 8
|
||||
@@ -79,29 +79,31 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, tmp []byte, send
|
||||
timestampsOffset int
|
||||
valuesOffset int
|
||||
|
||||
headTimestamps []byte
|
||||
headValues []byte
|
||||
|
||||
written int
|
||||
resultCode byte
|
||||
)
|
||||
|
||||
s.capturedState = &CapturedState{
|
||||
//
|
||||
TimeState: s.timestamps.CaptureState(),
|
||||
ValueState: s.values.CaptureState(),
|
||||
|
||||
}
|
||||
|
||||
s.timestamps.CaptureState()
|
||||
s.values.CaptureState()
|
||||
|
||||
for idx, measure := range req.Measures {
|
||||
if measure.Timestamp <= s.timestamps.LastTimestamp() {
|
||||
resultCode = ExpiredMeasure
|
||||
break
|
||||
}
|
||||
|
||||
if s.metricType == qb.Cumulative && measure.Value < s.lastValue {
|
||||
resultCode = NonMonotonicValue
|
||||
break
|
||||
}
|
||||
|
||||
// fix - 1 + 8 bytes
|
||||
|
||||
tReport := timestamps.Evaluate(tmp, measure.Timestamp)
|
||||
vReport := values.Evaluate(tmp, measure.Value)
|
||||
|
||||
@@ -114,48 +116,33 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, tmp []byte, send
|
||||
valuesOffset = vReport.Offset
|
||||
}
|
||||
} else {
|
||||
if len(s.buffer) < storage.DataPageSize {
|
||||
// allocate bigger buffer
|
||||
buf, databuf := growBuffers(growBuffersIn{
|
||||
databuf: s.buffer,
|
||||
tSize: timestamps.Size(),
|
||||
vSize: values.Size(),
|
||||
requiredSpace: totalRequiredSpace,
|
||||
})
|
||||
// сторінка заповнена
|
||||
since := s.timestamps.ReplaceSinceWithUntil()
|
||||
|
||||
s.buffer = buf
|
||||
// replace buffer in timestamps and values
|
||||
timestamps.Rotate(databuf) // fix pos
|
||||
values.Rotate(databuf) // fix pos
|
||||
} else {
|
||||
// сторінка заповнена
|
||||
since := s.timestamps.ReplaceSinceWithUntil()
|
||||
|
||||
if len(s.capturedState.Pages) == 0 {
|
||||
// head page FIX
|
||||
// timestampsPayload =
|
||||
// valuesPayload =
|
||||
}
|
||||
|
||||
s.capturedState.Pages = append(s.capturedState.Pages, storage.DataPayload{
|
||||
Since: since,
|
||||
Content: s.buffer,
|
||||
TimestampsSize: timestamps.Size(),
|
||||
ValuesSize: values.Size(),
|
||||
})
|
||||
|
||||
buffer := make([]byte, minBufferSize)
|
||||
|
||||
timestamps.Rotate(buffer)
|
||||
values.Rotate(buffer)
|
||||
|
||||
// renew
|
||||
s.buffer = buffer
|
||||
if len(s.capturedState.Pages) == 0 {
|
||||
headTimestamps = timestamps.Tail(timestampsOffset)
|
||||
headValues = values.Tail(valuesOffset)
|
||||
}
|
||||
|
||||
s.capturedState.Pages = append(s.capturedState.Pages, storage.DataPayload{
|
||||
Since: since,
|
||||
Content: s.buffer,
|
||||
TimestampsSize: timestamps.Size(),
|
||||
ValuesSize: values.Size(),
|
||||
})
|
||||
|
||||
buf := make([]byte, storage.DataPageSize)
|
||||
databuf := buf[:storage.DataPagePayloadSize]
|
||||
|
||||
timestamps.ReplaceBuffer(databuf)
|
||||
values.ReplaceBuffer(databuf)
|
||||
|
||||
// renew
|
||||
s.buffer = buf
|
||||
}
|
||||
|
||||
timestamps.Append(tReport.Offset, tmp[:tReport.ChangeSize], measure.Timestamp)
|
||||
values.Append(vReport.Offset, tmp[7:7+vReport.ChangeSize], measure.Value, vReport.Delta)
|
||||
timestamps.Append(tReport.RewindOffset, tmp[:tReport.ChangeSize], measure.Timestamp)
|
||||
values.Append(vReport.RewindOffset, tmp[7:7+vReport.ChangeSize], measure.Value, vReport.Delta)
|
||||
//
|
||||
s.lastValue = measure.Value
|
||||
written++
|
||||
@@ -173,39 +160,33 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, tmp []byte, send
|
||||
// скопіювати. Причому можна скопіювати зрізи chunks
|
||||
|
||||
if len(s.capturedState.Pages) > 0 {
|
||||
head := s.capturedState.Pages[0]
|
||||
databuf := head.Content[:storage.DataPagePayloadSize]
|
||||
// пишу в storage довгим шляхом через redo файл і запис в data файл
|
||||
sendToStorage(storage.AppendedMeasures{
|
||||
MetricID: req.MetricID,
|
||||
LastPageNo: s.lastPageNo,
|
||||
TimestampsOffset: timestampsOffset,
|
||||
Timestamps: databuf[len(databuf)-head.TimestampsSize : len(databuf)-timestampsOffset],
|
||||
Timestamps: headTimestamps,
|
||||
ValuesOffset: valuesOffset,
|
||||
Values: databuf[valuesOffset:head.ValuesSize],
|
||||
Values: headValues,
|
||||
IndexLevelTails: s.indexLevelTails,
|
||||
DataPages: s.capturedState.Pages,
|
||||
TailTimestamps: nil, // payload
|
||||
TailValues: s.buffer[:values.Size()],
|
||||
TailTimestamps: timestamps.Tail(0), // payload
|
||||
TailValues: values.Tail(0),
|
||||
ResultCode: resultCode,
|
||||
WrittenCount: written,
|
||||
ResultCh: nil,
|
||||
//ResultCh: req.ResultCh,
|
||||
})
|
||||
} else {
|
||||
databuf := s.buffer
|
||||
if len(s.buffer) == storage.DataPageSize {
|
||||
databuf = s.buffer[:storage.DataPagePayloadSize]
|
||||
}
|
||||
// короткий шлях - запис лише в storage
|
||||
sendToStorage(storage.AppendedMeasures{
|
||||
MetricID: req.MetricID,
|
||||
TimestampsOffset: timestampsOffset,
|
||||
ValuesOffset: valuesOffset,
|
||||
Timestamps: databuf[len(databuf)-timestamps.Size() : len(databuf)-timestampsOffset],
|
||||
Values: databuf[valuesOffset:values.Size()],
|
||||
Timestamps: timestamps.Tail(timestampsOffset),
|
||||
Values: values.Tail(valuesOffset),
|
||||
ResultCode: resultCode,
|
||||
WrittenCount: written,
|
||||
ResultCh: nil,
|
||||
//ResultCh: req.ResultCh,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user