Issue #3624: Preserve oldest snapshot when keep-* values are not satisfied

This commit is contained in:
Gautam Menghani 2023-06-16 23:13:41 +05:30 committed by Michael Eischer
parent 4df77e9f26
commit 182b9796e4
5 changed files with 66 additions and 1 deletions

View file

@ -0,0 +1,12 @@
Enhancement: Keep oldest snapshot when there aren't enough snapshots
The `forget` command does not preserve the oldest snapshot incase the
keep-* parameters are not satisfied, which led to users not being able to
preserve old data. Now, restic will always preserve the oldest snapshot
whenever any of the keep-* options to the `forget` command are not
satisfied.
https://github.com/restic/restic/issues/3624
https://github.com/restic/restic/pull/4366
https://forum.restic.net/t/keeping-yearly-snapshots-policy-when-backup-began-during-the-year/4670/2

View file

@ -256,7 +256,7 @@ func ApplyPolicy(list Snapshots, p ExpirePolicy) (keep, remove Snapshots, reason
// -1 means "keep all" // -1 means "keep all"
if b.Count > 0 || b.Count == -1 { if b.Count > 0 || b.Count == -1 {
val := b.bucker(cur.Time, nr) val := b.bucker(cur.Time, nr)
if val != b.Last { if val != b.Last || nr == len(list)-1 {
debug.Log("keep %v %v, bucker %v, val %v\n", cur.Time, cur.id.Str(), i, val) debug.Log("keep %v %v, bucker %v, val %v\n", cur.Time, cur.id.Str(), i, val)
keepSnap = true keepSnap = true
buckets[i].Last = val buckets[i].Last = val

View file

@ -14,6 +14,11 @@
"time": "2014-11-22T10:20:30Z", "time": "2014-11-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null "paths": null
},
{
"time": "2014-08-08T10:20:30Z",
"tree": null,
"paths": null
} }
], ],
"reasons": [ "reasons": [
@ -55,6 +60,19 @@
"counters": { "counters": {
"yearly": 7 "yearly": 7
} }
},
{
"snapshot": {
"time": "2014-08-08T10:20:30Z",
"tree": null,
"paths": null
},
"matches": [
"yearly snapshot"
],
"counters": {
"yearly": 6
}
} }
] ]
} }

View file

@ -49,6 +49,11 @@
"time": "2014-11-22T10:20:30Z", "time": "2014-11-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null "paths": null
},
{
"time": "2014-08-08T10:20:30Z",
"tree": null,
"paths": null
} }
], ],
"reasons": [ "reasons": [
@ -201,6 +206,19 @@
"counters": { "counters": {
"yearly": 7 "yearly": 7
} }
},
{
"snapshot": {
"time": "2014-08-08T10:20:30Z",
"tree": null,
"paths": null
},
"matches": [
"yearly snapshot"
],
"counters": {
"yearly": 6
}
} }
] ]
} }

View file

@ -57,6 +57,11 @@
"time": "2014-08-22T10:20:30Z", "time": "2014-08-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null "paths": null
},
{
"time": "2014-08-08T10:20:30Z",
"tree": null,
"paths": null
} }
], ],
"reasons": [ "reasons": [
@ -189,6 +194,18 @@
"monthly snapshot" "monthly snapshot"
], ],
"counters": {"Monthly": -1, "Yearly": -1} "counters": {"Monthly": -1, "Yearly": -1}
},
{
"snapshot": {
"time": "2014-08-08T10:20:30Z",
"tree": null,
"paths": null
},
"matches": [
"monthly snapshot",
"yearly snapshot"
],
"counters": {"Monthly": -1, "Yearly": -1}
} }
] ]
} }