summaryrefslogtreecommitdiffstats
path: root/modules/doctor
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2022-12-15 20:44:16 +0000
committerGitHub <noreply@github.com>2022-12-15 20:44:16 +0000
commit651fe4bb7dda16dee48b31ee964493a05e979c78 (patch)
treefb15044c4b904ad0cef29152209a4e9662dc187c /modules/doctor
parent3243dbe1a9e3ff7031f243c72232bcc31bbdec75 (diff)
downloadgitea-651fe4bb7dda16dee48b31ee964493a05e979c78.tar.gz
gitea-651fe4bb7dda16dee48b31ee964493a05e979c78.zip
Add doctor command for full GC of LFS (#21978)
The recent PR adding orphaned checks to the LFS storage is not sufficient to completely GC LFS, as it is possible for LFSMetaObjects to remain associated with repos but still need to be garbage collected. Imagine a situation where a branch is uploaded containing LFS files but that branch is later completely deleted. The LFSMetaObjects will remain associated with the Repository but the Repository will no longer contain any pointers to the object. This PR adds a second doctor command to perform a full GC. Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'modules/doctor')
-rw-r--r--modules/doctor/lfs.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/modules/doctor/lfs.go b/modules/doctor/lfs.go
new file mode 100644
index 0000000000..410ed5a9a5
--- /dev/null
+++ b/modules/doctor/lfs.go
@@ -0,0 +1,37 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package doctor
+
+import (
+ "context"
+ "fmt"
+
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/services/repository"
+)
+
+func init() {
+ Register(&Check{
+ Title: "Garbage collect LFS",
+ Name: "gc-lfs",
+ IsDefault: false,
+ Run: garbageCollectLFSCheck,
+ AbortIfFailed: false,
+ SkipDatabaseInitialization: false,
+ Priority: 1,
+ })
+}
+
+func garbageCollectLFSCheck(ctx context.Context, logger log.Logger, autofix bool) error {
+ if !setting.LFS.StartServer {
+ return fmt.Errorf("LFS support is disabled")
+ }
+
+ if err := repository.GarbageCollectLFSMetaObjects(ctx, logger, autofix); err != nil {
+ return err
+ }
+
+ return checkStorage(&checkStorageOptions{LFS: true})(ctx, logger, autofix)
+}