49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package export
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/influxdata/influxdb/services/meta"
|
|
)
|
|
|
|
func makeShardGroupsForDuration(min, max time.Time, d time.Duration) meta.ShardGroupInfos {
|
|
start := min.Truncate(d).UTC()
|
|
end := max.Truncate(d).Add(d).UTC()
|
|
|
|
groups := make(meta.ShardGroupInfos, end.Sub(start)/d)
|
|
var i uint64
|
|
for start.Before(end) {
|
|
groups[i] = meta.ShardGroupInfo{
|
|
ID: i,
|
|
StartTime: start,
|
|
EndTime: start.Add(d),
|
|
}
|
|
i++
|
|
start = start.Add(d)
|
|
}
|
|
return groups[:i]
|
|
}
|
|
|
|
// PlanShardGroups creates a new ShardGroup set using a shard group duration of d, for the time spanning min to max.
|
|
func planShardGroups(sourceShards []meta.ShardGroupInfo, min, max time.Time, d time.Duration) meta.ShardGroupInfos {
|
|
groups := makeShardGroupsForDuration(min, max, d)
|
|
var target []meta.ShardGroupInfo
|
|
for i := 0; i < len(groups); i++ {
|
|
g := groups[i]
|
|
// NOTE: EndTime.Add(-1) matches the Contains interval of [start, end)
|
|
if hasShardsGroupForTimeRange(sourceShards, g.StartTime, g.EndTime.Add(-1)) {
|
|
target = append(target, g)
|
|
}
|
|
}
|
|
return target
|
|
}
|
|
|
|
func hasShardsGroupForTimeRange(groups []meta.ShardGroupInfo, min, max time.Time) bool {
|
|
for _, g := range groups {
|
|
if g.Overlaps(min, max) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|