restic: Use stable sorting in snapshot policy

sort.Sort is not guaranteed to be stable. Go 1.19 has changed the
sorting algorithm which resulted in changes of the sort order. When
comparing snapshots with identical timestamp but different paths and
tags lists, there is not meaningful order among them. So just keep their
order stable.
This commit is contained in:
Michael Eischer
2022-08-07 12:48:06 +02:00
committed by Lorenz Bausch
parent b82f4824f0
commit f3fdc66b32
9 changed files with 371 additions and 371 deletions

View File

@@ -190,7 +190,7 @@ type KeepReason struct {
// according to the policy p. list is sorted in the process. reasons contains // according to the policy p. list is sorted in the process. reasons contains
// the reasons to keep each snapshot, it is in the same order as keep. // the reasons to keep each snapshot, it is in the same order as keep.
func ApplyPolicy(list Snapshots, p ExpirePolicy) (keep, remove Snapshots, reasons []KeepReason) { func ApplyPolicy(list Snapshots, p ExpirePolicy) (keep, remove Snapshots, reasons []KeepReason) {
sort.Sort(list) sort.Stable(list)
if p.Empty() { if p.Empty() {
for _, sn := range list { for _, sn := range list {

View File

@@ -150,27 +150,6 @@
"tree": null, "tree": null,
"paths": null "paths": null
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -185,6 +164,27 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",
"tree": null, "tree": null,
@@ -911,39 +911,6 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
"matches": [
"policy is empty"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"policy is empty"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
@@ -970,6 +937,39 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"policy is empty"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
"matches": [
"policy is empty"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",

View File

@@ -1,5 +1,23 @@
{ {
"keep": [ "keep": [
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -12,24 +30,6 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2014-11-15T10:20:30Z", "time": "2014-11-15T10:20:30Z",
"tree": null, "tree": null,
@@ -153,6 +153,36 @@
} }
], ],
"reasons": [ "reasons": [
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
@@ -171,36 +201,6 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2014-11-15T10:20:30Z", "time": "2014-11-15T10:20:30Z",

View File

@@ -1,5 +1,23 @@
{ {
"keep": [ "keep": [
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -12,24 +30,6 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2014-11-15T10:20:30Z", "time": "2014-11-15T10:20:30Z",
"tree": null, "tree": null,
@@ -41,6 +41,36 @@
} }
], ],
"reasons": [ "reasons": [
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo, bar]"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo, bar]"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
@@ -59,36 +89,6 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo, bar]"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo, bar]"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2014-11-15T10:20:30Z", "time": "2014-11-15T10:20:30Z",

View File

@@ -1,5 +1,23 @@
{ {
"keep": [ "keep": [
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -12,24 +30,6 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2014-11-15T10:20:30Z", "time": "2014-11-15T10:20:30Z",
"tree": null, "tree": null,
@@ -161,6 +161,38 @@
} }
], ],
"reasons": [ "reasons": [
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]",
"has tags [bar]"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]",
"has tags [bar]"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
@@ -180,38 +212,6 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]",
"has tags [bar]"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"has tags [foo]",
"has tags [bar]"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2014-11-15T10:20:30Z", "time": "2014-11-15T10:20:30Z",

View File

@@ -150,27 +150,6 @@
"tree": null, "tree": null,
"paths": null "paths": null
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -185,6 +164,27 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",
"tree": null, "tree": null,
@@ -662,39 +662,6 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y1m1d"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y1m1d"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
@@ -721,6 +688,39 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y1m1d"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y1m1d"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",

View File

@@ -150,27 +150,6 @@
"tree": null, "tree": null,
"paths": null "paths": null
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -185,6 +164,27 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",
"tree": null, "tree": null,
@@ -691,39 +691,6 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y2m3d3h"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y2m3d3h"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
@@ -750,6 +717,39 @@
], ],
"counters": {} "counters": {}
}, },
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y2m3d3h"
],
"counters": {}
},
{
"snapshot": {
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
"matches": [
"within 1y2m3d3h"
],
"counters": {}
},
{ {
"snapshot": { "snapshot": {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",

View File

@@ -150,27 +150,6 @@
"tree": null, "tree": null,
"paths": null "paths": null
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -185,6 +164,27 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",
"tree": null, "tree": null,
@@ -955,14 +955,7 @@
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
"paths": [ "paths": null
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
}, },
"matches": [ "matches": [
"last snapshot" "last snapshot"
@@ -992,7 +985,11 @@
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null "paths": null,
"tags": [
"foo",
"bar"
]
}, },
"matches": [ "matches": [
"last snapshot" "last snapshot"
@@ -1005,7 +1002,10 @@
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null, "paths": [
"path1",
"path2"
],
"tags": [ "tags": [
"foo", "foo",
"bar" "bar"

View File

@@ -150,27 +150,6 @@
"tree": null, "tree": null,
"paths": null "paths": null
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
@@ -185,6 +164,27 @@
"bar" "bar"
] ]
}, },
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": null,
"tags": [
"foo",
"bar"
]
},
{
"time": "2015-10-22T10:20:30Z",
"tree": null,
"paths": [
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
},
{ {
"time": "2015-10-20T10:20:30Z", "time": "2015-10-20T10:20:30Z",
"tree": null, "tree": null,
@@ -975,14 +975,7 @@
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
"paths": [ "paths": null
"path1",
"path2"
],
"tags": [
"foo",
"bar"
]
}, },
"matches": [ "matches": [
"last snapshot" "last snapshot"
@@ -1012,7 +1005,11 @@
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null "paths": null,
"tags": [
"foo",
"bar"
]
}, },
"matches": [ "matches": [
"last snapshot" "last snapshot"
@@ -1025,7 +1022,10 @@
"snapshot": { "snapshot": {
"time": "2015-10-22T10:20:30Z", "time": "2015-10-22T10:20:30Z",
"tree": null, "tree": null,
"paths": null, "paths": [
"path1",
"path2"
],
"tags": [ "tags": [
"foo", "foo",
"bar" "bar"