serve restic: implement object cache
This caches all the objects returned from the List call. This makes opening them much quicker so speeds up prune and restores. It also uses fewer transactions. It can be disabled with `--cache-objects=false`. This was discovered when using the B2 backend when the budget was being blown on list object calls which can avoided with a bit of caching. For typical 1 million file backup for a latop or server this will only use a small amount more memory.
This commit is contained in:
parent
83d48f65b6
commit
ceeac84cfe
3 changed files with 178 additions and 14 deletions
55
cmd/serve/restic/cache_test.go
Normal file
55
cmd/serve/restic/cache_test.go
Normal file
|
@ -0,0 +1,55 @@
|
|||
package restic
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/rclone/rclone/fstest/mockobject"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func (c *cache) String() string {
|
||||
keys := []string{}
|
||||
c.mu.Lock()
|
||||
for k := range c.items {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
c.mu.Unlock()
|
||||
sort.Strings(keys)
|
||||
return strings.Join(keys, ",")
|
||||
}
|
||||
|
||||
func TestCacheCRUD(t *testing.T) {
|
||||
c := newCache()
|
||||
assert.Equal(t, "", c.String())
|
||||
assert.Nil(t, c.find("potato"))
|
||||
o := mockobject.New("potato")
|
||||
c.add(o.Remote(), o)
|
||||
assert.Equal(t, "potato", c.String())
|
||||
assert.Equal(t, o, c.find("potato"))
|
||||
c.remove("potato")
|
||||
assert.Equal(t, "", c.String())
|
||||
assert.Nil(t, c.find("potato"))
|
||||
c.remove("notfound")
|
||||
}
|
||||
|
||||
func TestCacheRemovePrefix(t *testing.T) {
|
||||
c := newCache()
|
||||
for _, remote := range []string{
|
||||
"a",
|
||||
"b",
|
||||
"b/1",
|
||||
"b/2/3",
|
||||
"b/2/4",
|
||||
"b/2",
|
||||
"c",
|
||||
} {
|
||||
c.add(remote, mockobject.New(remote))
|
||||
}
|
||||
assert.Equal(t, "a,b,b/1,b/2,b/2/3,b/2/4,c", c.String())
|
||||
c.removePrefix("b")
|
||||
assert.Equal(t, "a,b,c", c.String())
|
||||
c.removePrefix("/")
|
||||
assert.Equal(t, "", c.String())
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue