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:
Diffstat (limited to 'internal/praefect/walkrepos.go')
-rw-r--r--internal/praefect/walkrepos.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/internal/praefect/walkrepos.go b/internal/praefect/walkrepos.go
new file mode 100644
index 000000000..1f321a4c7
--- /dev/null
+++ b/internal/praefect/walkrepos.go
@@ -0,0 +1,47 @@
+package praefect
+
+import (
+ "fmt"
+
+ "gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage"
+ "gitlab.com/gitlab-org/gitaly/v16/internal/praefect/datastore"
+ "gitlab.com/gitlab-org/gitaly/v16/internal/structerr"
+ "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"
+ "google.golang.org/grpc"
+)
+
+// WalkReposHandler implements an interceptor for the WalkRepos RPC, invoked when calling
+// through Praefect. Instead of walking the storage directory in the filesystem, this Praefect
+// implementation queries the database for all known repositories in the given virtual storage.
+// As a consequence, the modification_time parameter can't be populated in the response.
+func WalkReposHandler(rs datastore.RepositoryStore) grpc.StreamHandler {
+ return func(srv interface{}, stream grpc.ServerStream) error {
+ sendRepo := func(relPath string) error {
+ return stream.SendMsg(&gitalypb.WalkReposResponse{
+ RelativePath: relPath,
+ })
+ }
+
+ var req gitalypb.WalkReposRequest
+ if err := stream.RecvMsg(&req); err != nil {
+ return fmt.Errorf("receive request: %w", err)
+ }
+
+ if req.StorageName == "" {
+ return structerr.NewInvalidArgument("%w", storage.ErrStorageNotSet)
+ }
+
+ repos, err := rs.ListRepositoryPaths(stream.Context(), req.StorageName)
+ if err != nil {
+ return structerr.NewInternal("list repository paths: %w", err)
+ }
+
+ for _, repo := range repos {
+ if err := sendRepo(repo); err != nil {
+ return structerr.NewInternal("send repository path: %w", err)
+ }
+ }
+
+ return nil
+ }
+}