Stop using git count-objects and use raw directory size for repository (#8848)

* Migrate from git count-objects to a raw directory size
* As per @guillep2k ignore unusual files
tokarchuk/v1.17
zeripath 5 years ago committed by GitHub
parent 44ec9b933a
commit ee1d64ddd1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      models/migrations/v28.go
  2. 7
      models/repo.go
  3. 4
      modules/git/repo.go
  4. 19
      modules/util/path.go

@ -60,9 +60,9 @@ func addRepoSize(x *xorm.Engine) (err error) {
} }
repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git" repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git"
countObject, err := git.GetRepoSize(repoPath) countObject, err := git.CountObjects(repoPath)
if err != nil { if err != nil {
log.Warn("GetRepoSize: %v", err) log.Warn("CountObjects: %v", err)
continue continue
} }

@ -36,6 +36,7 @@ import (
api "code.gitea.io/gitea/modules/structs" api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/sync" "code.gitea.io/gitea/modules/sync"
"code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
"github.com/mcuadros/go-version" "github.com/mcuadros/go-version"
"github.com/unknwon/com" "github.com/unknwon/com"
@ -708,17 +709,17 @@ func (repo *Repository) IsOwnedBy(userID int64) bool {
} }
func (repo *Repository) updateSize(e Engine) error { func (repo *Repository) updateSize(e Engine) error {
repoInfoSize, err := git.GetRepoSize(repo.repoPath(e)) size, err := util.GetDirectorySize(repo.repoPath(e))
if err != nil { if err != nil {
return fmt.Errorf("UpdateSize: %v", err) return fmt.Errorf("UpdateSize: %v", err)
} }
repo.Size = repoInfoSize.Size + repoInfoSize.SizePack repo.Size = size
_, err = e.ID(repo.ID).Cols("size").Update(repo) _, err = e.ID(repo.ID).Cols("size").Update(repo)
return err return err
} }
// UpdateSize updates the repository size, calculating it using git.GetRepoSize // UpdateSize updates the repository size, calculating it using util.GetDirectorySize
func (repo *Repository) UpdateSize() error { func (repo *Repository) UpdateSize() error {
return repo.updateSize(x) return repo.updateSize(x)
} }

@ -304,8 +304,8 @@ const (
statSizeGarbage = "size-garbage: " statSizeGarbage = "size-garbage: "
) )
// GetRepoSize returns disk consumption for repo in path // CountObjects returns the results of git count-objects on the repoPath
func GetRepoSize(repoPath string) (*CountObject, error) { func CountObjects(repoPath string) (*CountObject, error) {
cmd := NewCommand("count-objects", "-v") cmd := NewCommand("count-objects", "-v")
stdout, err := cmd.RunInDir(repoPath) stdout, err := cmd.RunInDir(repoPath)
if err != nil { if err != nil {

@ -4,7 +4,10 @@
package util package util
import "path/filepath" import (
"os"
"path/filepath"
)
// EnsureAbsolutePath ensure that a path is absolute, making it // EnsureAbsolutePath ensure that a path is absolute, making it
// relative to absoluteBase if necessary // relative to absoluteBase if necessary
@ -14,3 +17,17 @@ func EnsureAbsolutePath(path string, absoluteBase string) string {
} }
return filepath.Join(absoluteBase, path) return filepath.Join(absoluteBase, path)
} }
const notRegularFileMode os.FileMode = os.ModeDir | os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
// GetDirectorySize returns the dumb disk consumption for a given path
func GetDirectorySize(path string) (int64, error) {
var size int64
err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
if info != nil && (info.Mode()&notRegularFileMode) == 0 {
size += info.Size()
}
return err
})
return size, err
}

Loading…
Cancel
Save