From 1313b529ff83620b438e941f730e65ab5cd09937 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Sun, 18 Mar 2018 14:26:10 +0000 Subject: [PATCH] serve restic: use ListR (--fast-list) if available For Restic's use case, --fast-list will use less transactions and calling ListR directly means we can avoid the usual memory overhead. --- cmd/serve/restic/restic.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/cmd/serve/restic/restic.go b/cmd/serve/restic/restic.go index 2bbd9acc1..044cc4178 100644 --- a/cmd/serve/restic/restic.go +++ b/cmd/serve/restic/restic.go @@ -405,14 +405,25 @@ func (s *server) listObjects(w http.ResponseWriter, r *http.Request, remote stri // make sure an empty list is returned, and not a 'nil' value ls := listItems{} - err := walk.Walk(s.f, remote, true, -1, func(path string, entries fs.DirEntries, err error) error { - if err == nil { + // if remote supports ListR use that directly, otherwise use recursive Walk + var err error + if ListR := s.f.Features().ListR; ListR != nil { + err = ListR(remote, func(entries fs.DirEntries) error { for _, entry := range entries { ls.add(entry) } - } - return err - }) + return nil + }) + } else { + err = walk.Walk(s.f, remote, true, -1, func(path string, entries fs.DirEntries, err error) error { + if err == nil { + for _, entry := range entries { + ls.add(entry) + } + } + return err + }) + } if err != nil { _, err = fserrors.Cause(err)