56 lines
2.0 KiB
Go
56 lines
2.0 KiB
Go
package helpers
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"golang.org/x/exp/slices"
|
|
|
|
"github.com/influxdata/influxdb"
|
|
"github.com/influxdata/influxdb/services/meta"
|
|
)
|
|
|
|
// DataDeleteShardGroup deletes the shard group specified by database, policy, and id from targetData.
|
|
// It does this by setting the shard group's DeletedAt time to now. We have to reimplement DeleteShardGroup
|
|
// instead of using data's so that the DeletedAt time will be deterministic. We are also not testing
|
|
// the functionality of DeleteShardGroup. We are testing if DeleteShardGroup gets called correctly.
|
|
func DataDeleteShardGroup(targetData *meta.Data, now time.Time, database, policy string, id uint64) error {
|
|
rpi, err := targetData.RetentionPolicy(database, policy)
|
|
|
|
if err != nil {
|
|
return err
|
|
} else if rpi == nil {
|
|
return influxdb.ErrRetentionPolicyNotFound(policy)
|
|
}
|
|
|
|
// Find shard group by ID and set its deletion timestamp.
|
|
for i := range rpi.ShardGroups {
|
|
if rpi.ShardGroups[i].ID == id {
|
|
rpi.ShardGroups[i].DeletedAt = now
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return meta.ErrShardGroupNotFound
|
|
}
|
|
|
|
// DataNukeShardGroup unconditionally removes the shard group identified by targetDB, targetRP, and targetID
|
|
// from targetData. There's no meta.Data method to directly remove a shard group, only to mark it deleted and
|
|
// then prune it. We can't use the functionality we're testing to generate the expected result.
|
|
func DataNukeShardGroup(targetData *meta.Data, targetDB, targetRP string, targetID uint64) error {
|
|
rpi, err := targetData.RetentionPolicy(targetDB, targetRP)
|
|
if err != nil {
|
|
return err
|
|
} else if rpi == nil {
|
|
return fmt.Errorf("no retention policy found for %q, %q, %d", targetDB, targetRP, targetID)
|
|
}
|
|
isTargetShardGroup := func(sgi meta.ShardGroupInfo) bool {
|
|
return sgi.ID == targetID
|
|
}
|
|
if !slices.ContainsFunc(rpi.ShardGroups, isTargetShardGroup) {
|
|
return fmt.Errorf("shard not found for %q, %q, %d", targetDB, targetRP, targetID)
|
|
}
|
|
rpi.ShardGroups = slices.DeleteFunc(rpi.ShardGroups, isTargetShardGroup)
|
|
return nil
|
|
}
|