wp
This commit is contained in:
@@ -60,25 +60,17 @@ func (s *_metric) DeleteMeasures() {
|
||||
}
|
||||
|
||||
// func (s *_metric) startAppendMeasures(req tryAppendMeasuresReq, sendToStorage func(storage.AppendedMeasures)) {
|
||||
func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, sendToStorage func(any)) {
|
||||
func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, tmp []byte, sendToStorage func(any)) {
|
||||
var (
|
||||
// AppendedMeasures struct {
|
||||
// MetricID uint32
|
||||
// TimestampsOffset int // (заповнені одразу)
|
||||
// ValuesOffset int // (заповнені одразу)
|
||||
// Timestamps [][]byte
|
||||
// TimestampsSize int
|
||||
// Values [][]byte
|
||||
// ValuesSize int
|
||||
// IndexLevels []*atree.IndexLevel
|
||||
// DataPages []*atree.DataPage // fix - prevPageNo for the 1st data page
|
||||
// }
|
||||
|
||||
timestamps = s.timestamps
|
||||
values = s.values
|
||||
|
||||
dataPages []storage.DataPayload
|
||||
|
||||
// офсети на head сторінці
|
||||
timestampsOffset int
|
||||
valuesOffset int
|
||||
|
||||
//written int
|
||||
//resultCode byte
|
||||
)
|
||||
@@ -87,9 +79,6 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, sendToStorage fu
|
||||
s.timestamps.CaptureState()
|
||||
|
||||
for idx, measure := range req.Measures {
|
||||
// if s.Since == 0 {
|
||||
// s.Since = measure.Timestamp
|
||||
// } else {
|
||||
// FIX - у випадку помилки треба в транзакції зберегти що помилка, але також зафіксувати скільки елементів збережено.
|
||||
// якщо idx == 0 - одразу знімаю блокування і нічого не відправляю в storage
|
||||
if measure.Timestamp <= s.timestamps.LastTimestamp() {
|
||||
@@ -126,51 +115,60 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, sendToStorage fu
|
||||
|
||||
// fix - 1 + 8 bytes
|
||||
|
||||
timestampCompressionWay, timestampRequiredSpace := timestamps.Evaluate(measure.Timestamp)
|
||||
valueCompressionWay, valueRequiredSpace := values.Evaluate(measure.Value)
|
||||
tReport := timestamps.Evaluate(tmp, measure.Timestamp)
|
||||
vReport := values.Evaluate(tmp, measure.Value)
|
||||
|
||||
totalRequiredSpace := timestampRequiredSpace + valueRequiredSpace
|
||||
totalRequiredSpace := tReport.TotalSpace + vReport.TotalSpace
|
||||
|
||||
if totalRequiredSpace <= len(s.buffer) {
|
||||
// накопичую
|
||||
timestamps.Compress(timestampCompressionWay, measure.Timestamp)
|
||||
values.Compress(valueCompressionWay, measure.Value)
|
||||
} else if len(s.buffer) < storage.DataPagePayloadSize {
|
||||
// allocate bigger buffer
|
||||
buffer := make([]byte, len(s.buffer)*2)
|
||||
// copy timestamps
|
||||
// copy values
|
||||
// replace buffer in timestamps and values
|
||||
|
||||
s.buffer = buffer
|
||||
|
||||
timestamps.Compress(timestampCompressionWay, measure.Timestamp)
|
||||
values.Compress(valueCompressionWay, measure.Value)
|
||||
// якщо на сторінці є місце
|
||||
if idx == 0 {
|
||||
timestampsOffset = tReport.Offset
|
||||
valuesOffset = vReport.Offset
|
||||
}
|
||||
} else {
|
||||
// сторінка заповнена
|
||||
since := s.timestamps.ReplaceSinceWithUntil()
|
||||
if len(s.buffer) < storage.DataPageSize {
|
||||
// allocate bigger buffer
|
||||
buf, databuf := growBuffers(growBuffersIn{
|
||||
databuf: s.buffer,
|
||||
tSize: timestamps.Size(),
|
||||
vSize: values.Size(),
|
||||
requiredSpace: totalRequiredSpace,
|
||||
})
|
||||
|
||||
dataPages = append(dataPages, storage.DataPayload{
|
||||
Since: since,
|
||||
Content: s.buffer,
|
||||
TimestampsSize: timestamps.Size(),
|
||||
ValuesSize: values.Size(),
|
||||
})
|
||||
s.buffer = buf
|
||||
// replace buffer in timestamps and values
|
||||
timestamps.Rotate(databuf) // fix pos
|
||||
values.Rotate(databuf) // fix pos
|
||||
} else {
|
||||
// сторінка заповнена
|
||||
since := s.timestamps.ReplaceSinceWithUntil()
|
||||
|
||||
buffer := make([]byte, minBufferSize)
|
||||
if len(dataPages) == 0 {
|
||||
// head page FIX
|
||||
// timestampsPayload =
|
||||
// valuesPayload =
|
||||
}
|
||||
|
||||
timestamps.Rotate(buffer)
|
||||
values.Rotate(buffer)
|
||||
dataPages = append(dataPages, storage.DataPayload{
|
||||
Since: since,
|
||||
Content: s.buffer,
|
||||
TimestampsSize: timestamps.Size(),
|
||||
ValuesSize: values.Size(),
|
||||
})
|
||||
|
||||
// renew
|
||||
s.buffer = buffer
|
||||
buffer := make([]byte, minBufferSize)
|
||||
|
||||
timestampCompressionWay, _ = timestamps.Evaluate(measure.Timestamp)
|
||||
valueCompressionWay, _ = values.Evaluate(measure.Value)
|
||||
timestamps.Rotate(buffer)
|
||||
values.Rotate(buffer)
|
||||
|
||||
timestamps.Compress(timestampCompressionWay, measure.Timestamp)
|
||||
values.Compress(valueCompressionWay, measure.Value)
|
||||
// renew
|
||||
s.buffer = buffer
|
||||
}
|
||||
}
|
||||
|
||||
timestamps.Append(tReport.Offset, tmp[:tReport.ChangeSize], measure.Timestamp)
|
||||
values.Append(vReport.Offset, tmp[7:7+vReport.ChangeSize], measure.Value, vReport.Delta)
|
||||
//
|
||||
s.lastValue = measure.Value
|
||||
}
|
||||
@@ -183,8 +181,8 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, sendToStorage fu
|
||||
sendToStorage(storage.AppendedMeasures{
|
||||
MetricID: req.MetricID,
|
||||
LastPageNo: s.lastPageNo,
|
||||
TimestampsOffset: timestamps.Offset(), // state.Pos() з якої позиції дописувати дані на сторінку 0 (при відновленні)
|
||||
ValuesOffset: values.Offset(), // state.Pos()
|
||||
TimestampsOffset: timestampsOffset,
|
||||
ValuesOffset: valuesOffset,
|
||||
//Payload: s.payload, // fix - timestamps + values ? or timestamps and values (for WAL)
|
||||
IndexLevelTails: s.indexLevelTails,
|
||||
DataPages: dataPages,
|
||||
@@ -196,6 +194,16 @@ func (s *_metric) StartAppendMeasures(req tryAppendMeasuresReq, sendToStorage fu
|
||||
})
|
||||
} else {
|
||||
// короткий шлях - запис лише в storage
|
||||
sendToStorage(storage.AppendedMeasures{
|
||||
MetricID: req.MetricID,
|
||||
TimestampsOffset: timestampsOffset,
|
||||
ValuesOffset: valuesOffset,
|
||||
Timestamps: nil, // pos - offset
|
||||
Values: nil,
|
||||
//ResultCode: resultCode,
|
||||
//WrittenCount: wri,
|
||||
ResultCh: nil,
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user