From b7f0defbdeea4d0505b04e57085e342a1bea2dbf Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Sat, 27 Mar 2021 15:17:48 +0000 Subject: [PATCH 1/3] Update repository size on cron gc task git gc cron could change the size of the repository therefore we should update the size of the repo stored in our database. Also significantly improve the efficiency of counting lfs associated with the repository Fix #14682 Signed-off-by: Andrew Thornton --- models/repo.go | 7 ++----- modules/repository/check.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/models/repo.go b/models/repo.go index 329e63cc421b..0cef30bbd2eb 100644 --- a/models/repo.go +++ b/models/repo.go @@ -740,15 +740,12 @@ func (repo *Repository) updateSize(e Engine) error { return fmt.Errorf("updateSize: %v", err) } - objs, err := repo.GetLFSMetaObjects(-1, 0) + lfsSize, err := e.Where("repository_id = ?", repo.ID).SumInt(new(LFSMetaObject), "size") if err != nil { return fmt.Errorf("updateSize: GetLFSMetaObjects: %v", err) } - for _, obj := range objs { - size += obj.Size - } - repo.Size = size + repo.Size = size + lfsSize _, err = e.ID(repo.ID).Cols("size").Update(repo) return err } diff --git a/modules/repository/check.go b/modules/repository/check.go index d13ddbb0b017..44f77c3cfcd9 100644 --- a/modules/repository/check.go +++ b/modules/repository/check.go @@ -91,6 +91,17 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...string) erro } return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %v", repo.FullName(), err) } + + // Now update the size of the repository + if err := repo.UpdateSize(models.DefaultDBContext()); err != nil { + log.Error("Updating size as part of garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err) + desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) + if err = models.CreateRepositoryNotice(desc); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %v", repo.FullName(), err) + } + return nil }, ); err != nil { From 8985ea3e7c59c78f0fd435fa65298ee80cf9c1b8 Mon Sep 17 00:00:00 2001 From: zeripath Date: Sat, 27 Mar 2021 21:47:45 +0000 Subject: [PATCH 2/3] Update modules/repository/check.go Co-authored-by: Lauris BH --- modules/repository/check.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/repository/check.go b/modules/repository/check.go index 44f77c3cfcd9..b4cddff777ae 100644 --- a/modules/repository/check.go +++ b/modules/repository/check.go @@ -99,7 +99,7 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...string) erro if err = models.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } - return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %v", repo.FullName(), err) + return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %v", repo.FullName(), err) } return nil From 8125754f45ace8f566faf4b6a9c15d2ce6bdead7 Mon Sep 17 00:00:00 2001 From: zeripath Date: Sat, 27 Mar 2021 22:18:23 +0000 Subject: [PATCH 3/3] Update modules/repository/check.go Co-authored-by: Lauris BH --- modules/repository/check.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/repository/check.go b/modules/repository/check.go index b4cddff777ae..0485e9e83a50 100644 --- a/modules/repository/check.go +++ b/modules/repository/check.go @@ -95,7 +95,7 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...string) erro // Now update the size of the repository if err := repo.UpdateSize(models.DefaultDBContext()); err != nil { log.Error("Updating size as part of garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err) - desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) + desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err) if err = models.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) }