mirror of
https://github.com/kopia/kopia.git
synced 2026-09-08 11:26:03 -04:00
policy: refactored retention policy to be applied in policy.ApplyRetentionPolicy()
This commit is contained in:
1 parent
41eaed003a
commit
4270d8a67f
4 files changed
+38
-37
No files matched your search
@@ -115,24 +115,8 @@ func snapshotSingleSource(ctx context.Context, rep *repo.Repository, u *upload.U
|
|||||||
printStderr("uploaded snapshot %v (root %v) in %v\n", snapID, manifest.RootObjectID(), time.Since(t0))
|
printStderr("uploaded snapshot %v (root %v) in %v\n", snapID, manifest.RootObjectID(), time.Since(t0))
|
||||||
log.Debugf("Hash Cache: %v", manifest.HashCacheID.String())
|
log.Debugf("Hash Cache: %v", manifest.HashCacheID.String())
|
||||||
|
|
||||||
snapshots, err := snapshot.ListSnapshots(ctx, rep, sourceInfo)
|
_, err = policy.ApplyRetentionPolicy(ctx, rep, sourceInfo, true)
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
toDelete, err := policy.GetExpiredSnapshots(ctx, rep, snapshots)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
printStderr("Deleting %v expired snapshots of %v...\n", len(toDelete), sourceInfo)
|
|
||||||
for _, it := range toDelete {
|
|
||||||
if err := rep.Manifests.Delete(ctx, it.ID); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func findPreviousSnapshotManifest(ctx context.Context, rep *repo.Repository, sourceInfo snapshot.SourceInfo) (*snapshot.Manifest, error) {
|
func findPreviousSnapshotManifest(ctx context.Context, rep *repo.Repository, sourceInfo snapshot.SourceInfo) (*snapshot.Manifest, error) {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
snapshotExpireAll = snapshotExpireCommand.Flag("all", "Expire all snapshots").Bool()
|
snapshotExpireAll = snapshotExpireCommand.Flag("all", "Expire all snapshots").Bool()
|
||||||
snapshotExpirePaths = snapshotExpireCommand.Arg("path", "Expire snapshots for a given paths only").Strings()
|
snapshotExpirePaths = snapshotExpireCommand.Arg("path", "Expire snapshots for a given paths only").Strings()
|
||||||
snapshotExpireDelete = snapshotExpireCommand.Flag("delete", "Whether to actually delete snapshots").Default("no").String()
|
snapshotExpireDelete = snapshotExpireCommand.Flag("delete", "Whether to actually delete snapshots").Bool()
|
||||||
)
|
)
|
||||||
|
|
||||||
func getSnapshotSourcesToExpire(ctx context.Context, rep *repo.Repository) ([]snapshot.SourceInfo, error) {
|
func getSnapshotSourcesToExpire(ctx context.Context, rep *repo.Repository) ([]snapshot.SourceInfo, error) {
|
||||||
@@ -45,30 +45,20 @@ func runExpireCommand(ctx context.Context, rep *repo.Repository) error {
|
|||||||
})
|
})
|
||||||
|
|
||||||
for _, src := range sources {
|
for _, src := range sources {
|
||||||
snapshots, err := snapshot.ListSnapshots(ctx, rep, src)
|
deleted, err := policy.ApplyRetentionPolicy(ctx, rep, src, *snapshotExpireDelete)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
toDelete, err := policy.GetExpiredSnapshots(ctx, rep, snapshots)
|
if len(deleted) == 0 {
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(toDelete) == 0 {
|
|
||||||
printStderr("Nothing to delete for %v.\n", src)
|
printStderr("Nothing to delete for %v.\n", src)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if *snapshotExpireDelete == "yes" {
|
if *snapshotExpireDelete {
|
||||||
printStderr("Deleting %v snapshots of %v...\n", len(toDelete), src)
|
printStderr("Deleted %v snapshots of %v...\n", len(deleted), src)
|
||||||
for _, it := range toDelete {
|
|
||||||
if err := rep.Manifests.Delete(ctx, it.ID); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
printStderr("%v snapshot(s) of %v would be deleted. Pass --delete=yes to do it.\n", len(toDelete), src)
|
printStderr("%v snapshot(s) of %v would be deleted. Pass --delete to do it.\n", len(deleted), src)
|
||||||
for _, it := range toDelete {
|
for _, it := range deleted {
|
||||||
printStderr(" %v\n", it.StartTime.Format(timeFormat))
|
printStderr(" %v\n", it.StartTime.Format(timeFormat))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,6 +185,11 @@ func (s *sourceManager) snapshot(ctx context.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, err := policy.ApplyRetentionPolicy(ctx, s.server.rep, s.src, true); err != nil {
|
||||||
|
log.Errorf("unable to apply retention policy: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
log.Infof("created snapshot %v", snapshotID)
|
log.Infof("created snapshot %v", snapshotID)
|
||||||
if err := s.server.rep.Flush(ctx); err != nil {
|
if err := s.server.rep.Flush(ctx); err != nil {
|
||||||
log.Errorf("unable to flush: %v", err)
|
log.Errorf("unable to flush: %v", err)
|
||||||
|
|||||||
+24
-2
@@ -8,8 +8,30 @@
|
|||||||
"github.com/kopia/kopia/snapshot"
|
"github.com/kopia/kopia/snapshot"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetExpiredSnapshots computes the set of snapshot manifests that are not retained according to the policy.
|
// ApplyRetentionPolicy applies retention policy to a given source by deleting expired snapshots.
|
||||||
func GetExpiredSnapshots(ctx context.Context, rep *repo.Repository, snapshots []*snapshot.Manifest) ([]*snapshot.Manifest, error) {
|
func ApplyRetentionPolicy(ctx context.Context, rep *repo.Repository, sourceInfo snapshot.SourceInfo, reallyDelete bool) ([]*snapshot.Manifest, error) {
|
||||||
|
snapshots, err := snapshot.ListSnapshots(ctx, rep, sourceInfo)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
toDelete, err := getExpiredSnapshots(ctx, rep, snapshots)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if reallyDelete {
|
||||||
|
for _, it := range toDelete {
|
||||||
|
if err := rep.Manifests.Delete(ctx, it.ID); err != nil {
|
||||||
|
return toDelete, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return toDelete, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getExpiredSnapshots(ctx context.Context, rep *repo.Repository, snapshots []*snapshot.Manifest) ([]*snapshot.Manifest, error) {
|
||||||
var toDelete []*snapshot.Manifest
|
var toDelete []*snapshot.Manifest
|
||||||
for _, snapshotGroup := range snapshot.GroupBySource(snapshots) {
|
for _, snapshotGroup := range snapshot.GroupBySource(snapshots) {
|
||||||
td, err := getExpiredSnapshotsForSource(ctx, rep, snapshotGroup)
|
td, err := getExpiredSnapshotsForSource(ctx, rep, snapshotGroup)
|
||||||
|
|||||||
Reference in new issue
Block a user