Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <jacob@gitlab.com>2019-01-24 10:11:33 +0300
committerJohn Cai <jcai@gitlab.com>2019-01-24 10:11:33 +0300
commit9b7688ff3a2f59d906cfad6782d09afbf463aedd (patch)
treef62d187c0009013ed11cd2894c74a130ba176c37
parent198563bbf682d847e09923115edd8dac8ecb454f (diff)
Use chunker for ListDirectories RPC
-rw-r--r--changelogs/unreleased/listdirectories-chunker.yml5
-rw-r--r--internal/service/storage/listdirectories.go28
2 files changed, 22 insertions, 11 deletions
diff --git a/changelogs/unreleased/listdirectories-chunker.yml b/changelogs/unreleased/listdirectories-chunker.yml
new file mode 100644
index 000000000..748dc902b
--- /dev/null
+++ b/changelogs/unreleased/listdirectories-chunker.yml
@@ -0,0 +1,5 @@
+---
+title: Use chunker for ListDirectories RPC
+merge_request: 1042
+author:
+type: other
diff --git a/internal/service/storage/listdirectories.go b/internal/service/storage/listdirectories.go
index 43b85fcb5..18e3d7ba7 100644
--- a/internal/service/storage/listdirectories.go
+++ b/internal/service/storage/listdirectories.go
@@ -7,6 +7,7 @@ import (
"gitlab.com/gitlab-org/gitaly-proto/go/gitalypb"
"gitlab.com/gitlab-org/gitaly/internal/helper"
+ "gitlab.com/gitlab-org/gitaly/internal/helper/chunker"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
@@ -18,10 +19,9 @@ func (s *server) ListDirectories(req *gitalypb.ListDirectoriesRequest, stream gi
}
storageDir = storageDir + "/"
-
maxDepth := dirDepth(storageDir) + req.GetDepth()
+ sender := chunker.New(&dirSender{stream: stream})
- var dirs []string
err = filepath.Walk(storageDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
@@ -33,12 +33,7 @@ func (s *server) ListDirectories(req *gitalypb.ListDirectoriesRequest, stream gi
return nil
}
- dirs = append(dirs, relPath)
-
- if len(dirs) > 100 {
- stream.Send(&gitalypb.ListDirectoriesResponse{Paths: dirs})
- dirs = dirs[:]
- }
+ sender.Send(relPath)
if dirDepth(path)+1 > maxDepth {
return filepath.SkipDir
@@ -50,13 +45,24 @@ func (s *server) ListDirectories(req *gitalypb.ListDirectoriesRequest, stream gi
return nil
})
- if len(dirs) > 0 {
- stream.Send(&gitalypb.ListDirectoriesResponse{Paths: dirs})
+ if err != nil {
+ return err
}
- return err
+ return sender.Flush()
}
func dirDepth(dir string) uint32 {
return uint32(len(strings.Split(dir, string(os.PathSeparator)))) + 1
}
+
+type dirSender struct {
+ stream gitalypb.StorageService_ListDirectoriesServer
+ dirs []string
+}
+
+func (s *dirSender) Reset() { s.dirs = nil }
+func (s *dirSender) Append(it chunker.Item) { s.dirs = append(s.dirs, it.(string)) }
+func (s *dirSender) Send() error {
+ return s.stream.Send(&gitalypb.ListDirectoriesResponse{Paths: s.dirs})
+}