diff options
Diffstat (limited to 'internal/praefect/repocleaner/action_clean.go')
-rw-r--r-- | internal/praefect/repocleaner/action_clean.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/internal/praefect/repocleaner/action_clean.go b/internal/praefect/repocleaner/action_clean.go new file mode 100644 index 000000000..aeb8d5099 --- /dev/null +++ b/internal/praefect/repocleaner/action_clean.go @@ -0,0 +1,50 @@ +package repocleaner + +import ( + "context" + + "github.com/sirupsen/logrus" + "gitlab.com/gitlab-org/gitaly/v14/internal/praefect" + "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" +) + +// CleanAction is an implementation of the Action interface that moves +// repositories to a lost+found folder in the root storage directory. +type CleanAction struct { + logger logrus.FieldLogger + conns praefect.Connections +} + +// NewCleanAction returns a new instance of CleanAction +func NewCleanAction(logger logrus.FieldLogger, conns praefect.Connections) *CleanAction { + return &CleanAction{ + logger: logger.WithField("component", "repocleaner.remove_repo_action"), + conns: conns, + } +} + +// Perform performs the action of moving repositories not known to Praefect to a +// lost+found folder in the storage root folder. +func (r *CleanAction) Perform(ctx context.Context, virtualStorage, storage string, replicaPaths []string) error { + l := r.logger.WithFields(logrus.Fields{ + "virtual_storage": virtualStorage, + "storage": storage, + }) + + l.WithField("cleaned_repos", replicaPaths). + Warn("cleaned repositories not managed by praefect") + + client, err := getInternalGitalyClient(r.conns, virtualStorage, storage) + if err != nil { + return err + } + + if _, err := client.CleanRepos(ctx, &gitalypb.CleanReposRequest{ + StorageName: storage, + RelativePaths: replicaPaths, + }); err != nil { + return err + } + + return nil +} |