2020-01-30 23:09:44 +00:00
|
|
|
package storage
|
|
|
|
|
2021-12-15 13:58:27 +00:00
|
|
|
func isDedupEnabled() bool {
|
2021-12-15 14:23:27 +00:00
|
|
|
return len(downsamplingPeriods) > 0
|
2021-12-15 13:58:27 +00:00
|
|
|
}
|
|
|
|
|
2021-12-14 18:49:08 +00:00
|
|
|
// DeduplicateSamples removes samples from src* if they are closer to each other than dedupInterval in millseconds.
|
|
|
|
func DeduplicateSamples(srcTimestamps []int64, srcValues []float64, dedupInterval int64) ([]int64, []float64) {
|
|
|
|
if !needsDedup(srcTimestamps, dedupInterval) {
|
2020-01-30 23:09:44 +00:00
|
|
|
// Fast path - nothing to deduplicate
|
|
|
|
return srcTimestamps, srcValues
|
|
|
|
}
|
2021-12-14 18:49:08 +00:00
|
|
|
return deduplicateInternal(srcTimestamps, srcValues, dedupInterval)
|
2021-07-12 07:42:54 +00:00
|
|
|
}
|
2020-01-30 23:09:44 +00:00
|
|
|
|
2021-12-14 18:49:08 +00:00
|
|
|
func deduplicateInternal(srcTimestamps []int64, srcValues []float64, dedupInterval int64) ([]int64, []float64) {
|
|
|
|
tsNext := (srcTimestamps[0] - srcTimestamps[0]%dedupInterval) + dedupInterval
|
2020-01-30 23:09:44 +00:00
|
|
|
dstTimestamps := srcTimestamps[:1]
|
|
|
|
dstValues := srcValues[:1]
|
|
|
|
for i := 1; i < len(srcTimestamps); i++ {
|
|
|
|
ts := srcTimestamps[i]
|
2020-04-26 10:04:58 +00:00
|
|
|
if ts < tsNext {
|
2020-01-30 23:09:44 +00:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
dstTimestamps = append(dstTimestamps, ts)
|
|
|
|
dstValues = append(dstValues, srcValues[i])
|
2020-04-26 10:04:58 +00:00
|
|
|
|
|
|
|
// Update tsNext
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext += dedupInterval
|
2020-04-26 10:04:58 +00:00
|
|
|
if ts >= tsNext {
|
|
|
|
// Slow path for updating ts.
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext = (ts - ts%dedupInterval) + dedupInterval
|
2020-04-26 10:04:58 +00:00
|
|
|
}
|
2020-01-30 23:09:44 +00:00
|
|
|
}
|
|
|
|
return dstTimestamps, dstValues
|
|
|
|
}
|
|
|
|
|
2021-12-14 18:49:08 +00:00
|
|
|
func deduplicateSamplesDuringMerge(srcTimestamps, srcValues []int64, dedupInterval int64) ([]int64, []int64) {
|
|
|
|
if !needsDedup(srcTimestamps, dedupInterval) {
|
2020-01-30 23:09:44 +00:00
|
|
|
// Fast path - nothing to deduplicate
|
|
|
|
return srcTimestamps, srcValues
|
|
|
|
}
|
2021-12-14 18:49:08 +00:00
|
|
|
return deduplicateDuringMergeInternal(srcTimestamps, srcValues, dedupInterval)
|
2021-07-12 07:42:54 +00:00
|
|
|
}
|
2020-01-30 23:09:44 +00:00
|
|
|
|
2021-12-14 18:49:08 +00:00
|
|
|
func deduplicateDuringMergeInternal(srcTimestamps, srcValues []int64, dedupInterval int64) ([]int64, []int64) {
|
|
|
|
tsNext := (srcTimestamps[0] - srcTimestamps[0]%dedupInterval) + dedupInterval
|
2020-01-30 23:09:44 +00:00
|
|
|
dstTimestamps := srcTimestamps[:1]
|
|
|
|
dstValues := srcValues[:1]
|
|
|
|
for i := 1; i < len(srcTimestamps); i++ {
|
|
|
|
ts := srcTimestamps[i]
|
2020-04-26 10:04:58 +00:00
|
|
|
if ts < tsNext {
|
2020-01-30 23:09:44 +00:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
dstTimestamps = append(dstTimestamps, ts)
|
|
|
|
dstValues = append(dstValues, srcValues[i])
|
2020-04-26 10:04:58 +00:00
|
|
|
|
|
|
|
// Update tsNext
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext += dedupInterval
|
2020-04-26 10:04:58 +00:00
|
|
|
if ts >= tsNext {
|
|
|
|
// Slow path for updating ts.
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext = (ts - ts%dedupInterval) + dedupInterval
|
2020-04-26 10:04:58 +00:00
|
|
|
}
|
2020-01-30 23:09:44 +00:00
|
|
|
}
|
|
|
|
return dstTimestamps, dstValues
|
|
|
|
}
|
|
|
|
|
2021-12-14 18:49:08 +00:00
|
|
|
func needsDedup(timestamps []int64, dedupInterval int64) bool {
|
|
|
|
if len(timestamps) == 0 || dedupInterval <= 0 {
|
2020-01-30 23:09:44 +00:00
|
|
|
return false
|
|
|
|
}
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext := (timestamps[0] - timestamps[0]%dedupInterval) + dedupInterval
|
2020-01-30 23:09:44 +00:00
|
|
|
for _, ts := range timestamps[1:] {
|
2021-07-12 07:42:54 +00:00
|
|
|
if ts < tsNext {
|
2020-01-30 23:09:44 +00:00
|
|
|
return true
|
|
|
|
}
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext += dedupInterval
|
2021-07-12 07:42:54 +00:00
|
|
|
if ts >= tsNext {
|
2021-12-14 18:49:08 +00:00
|
|
|
tsNext = (ts - ts%dedupInterval) + dedupInterval
|
2021-07-12 07:42:54 +00:00
|
|
|
}
|
2020-01-30 23:09:44 +00:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|