45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
package pruning
|
|
|
|
import (
|
|
"github.com/pkg/errors"
|
|
"github.com/zrepl/zrepl/endpoint"
|
|
)
|
|
|
|
type KeepStepHolds struct {
|
|
keepJobIDs map[endpoint.JobID]bool
|
|
}
|
|
|
|
var _ KeepRule = (*KeepStepHolds)(nil)
|
|
|
|
func NewKeepStepHolds(mainJobId endpoint.JobID, additionalJobIdsStrings []string) (_ *KeepStepHolds, err error) {
|
|
additionalJobIds := make(map[endpoint.JobID]bool, len(additionalJobIdsStrings))
|
|
|
|
mainJobId.MustValidate()
|
|
additionalJobIds[mainJobId] = true
|
|
|
|
for i := range additionalJobIdsStrings {
|
|
ajid, err := endpoint.MakeJobID(additionalJobIdsStrings[i])
|
|
if err != nil {
|
|
return nil, errors.WithMessagef(err, "cannot parse job id %q: %s", additionalJobIdsStrings[i])
|
|
}
|
|
if additionalJobIds[ajid] == true {
|
|
return nil, errors.Errorf("duplicate job id %q", ajid)
|
|
}
|
|
}
|
|
return &KeepStepHolds{additionalJobIds}, nil
|
|
}
|
|
|
|
func (h *KeepStepHolds) KeepRule(snaps []Snapshot) PruneSnapshotsResult {
|
|
return partitionSnapList(snaps, func(s Snapshot) bool {
|
|
holdingJobIDs := make(map[endpoint.JobID]bool)
|
|
for _, h := range s.StepHolds() {
|
|
holdingJobIDs[h.GetJobID()] = true
|
|
}
|
|
oneOrMoreOfOurJobIDsHoldsSnap := false
|
|
for kjid := range h.keepJobIDs {
|
|
oneOrMoreOfOurJobIDsHoldsSnap = oneOrMoreOfOurJobIDsHoldsSnap || holdingJobIDs[kjid]
|
|
}
|
|
return !oneOrMoreOfOurJobIDsHoldsSnap
|
|
})
|
|
}
|