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/service/info/cleanup.go')
-rw-r--r--internal/praefect/service/info/cleanup.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/internal/praefect/service/info/cleanup.go b/internal/praefect/service/info/cleanup.go
new file mode 100644
index 000000000..ab281d640
--- /dev/null
+++ b/internal/praefect/service/info/cleanup.go
@@ -0,0 +1,60 @@
+package server
+
+import (
+ "context"
+
+ "gitlab.com/gitlab-org/gitaly/internal/helper"
+ "gitlab.com/gitlab-org/gitaly/internal/praefect/models"
+ "gitlab.com/gitlab-org/gitaly/proto/go/gitalypb"
+ "golang.org/x/sync/errgroup"
+)
+
+func (s *Server) CleanupOrphanedRepos(ctx context.Context, in *gitalypb.CleanupOrphanedReposRequest) (*gitalypb.CleanupOrphanedReposResponse, error) {
+ validRepos := make(map[string]struct{})
+
+ for _, repo := range in.GetValidRepositories() {
+ validRepos[repo.GetRelativePath()] = struct{}{}
+ }
+
+ allRepositories, err := s.datastore.GetRepositories()
+ if err != nil {
+ return nil, helper.ErrInternal(err)
+ }
+
+ // map keyed on storage with values of slices representing the repositories to remove for each primary storage
+ repositoriesToRemove := make(map[string][]*models.Repository)
+
+ for _, repositoryOnDisk := range allRepositories {
+ if _, ok := validRepos[repositoryOnDisk.RelativePath]; !ok {
+ repositoriesToRemove[repositoryOnDisk.Primary.Storage] = append(repositoriesToRemove[repositoryOnDisk.Primary.Storage], repositoryOnDisk)
+ }
+ }
+
+ g, ctx := errgroup.WithContext(ctx)
+
+ for storage, repos := range repositoriesToRemove {
+ cc, ok := s.nodes[storage]
+ if !ok {
+ return nil, helper.ErrInternalf("could not find client connection for %s", storage)
+ }
+
+ repositoryClient := gitalypb.NewRepositoryServiceClient(cc)
+
+ g.Go(func() error {
+ for _, repo := range repos {
+ if _, err = repositoryClient.RemoveRepository(ctx, &gitalypb.RemoveRepositoryRequest{
+ Repository: &gitalypb.Repository{StorageName: repo.Primary.Storage, RelativePath: repo.RelativePath},
+ }); err != nil {
+ return err
+ }
+ }
+ return nil
+ })
+ }
+
+ if err = g.Wait(); err != nil {
+ return nil, helper.ErrInternal(err)
+ }
+
+ return &gitalypb.CleanupOrphanedReposResponse{}, nil
+}