mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Reduce calls to git cat-file -s (#14682)
* Reduce calls to git cat-file -s There are multiple places where there are repeated calls to git cat-file -s due to the blobs not being created with their size. Through judicious use of git ls-tree -l and slight adjustments to the indexer code we can avoid a lot of these calls. * simplify by always expecting the long format * Also always set the sized field and tell the indexer the update is sized
This commit is contained in:
		| @@ -179,14 +179,20 @@ func (b *BleveIndexer) addUpdate(commitSha string, update fileUpdate, repo *mode | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	stdout, err := git.NewCommand("cat-file", "-s", update.BlobSha). | ||||
| 		RunInDir(repo.RepoPath()) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	size := update.Size | ||||
|  | ||||
| 	if !update.Sized { | ||||
| 		stdout, err := git.NewCommand("cat-file", "-s", update.BlobSha). | ||||
| 			RunInDir(repo.RepoPath()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if size, err = strconv.ParseInt(strings.TrimSpace(stdout), 10, 64); err != nil { | ||||
| 			return fmt.Errorf("Misformatted git cat-file output: %v", err) | ||||
| 		} | ||||
| 	} | ||||
| 	if size, err := strconv.Atoi(strings.TrimSpace(stdout)); err != nil { | ||||
| 		return fmt.Errorf("Misformatted git cat-file output: %v", err) | ||||
| 	} else if int64(size) > setting.Indexer.MaxIndexerFileSize { | ||||
|  | ||||
| 	if size > setting.Indexer.MaxIndexerFileSize { | ||||
| 		return b.addDelete(update.Filename, repo, batch) | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -178,14 +178,20 @@ func (b *ElasticSearchIndexer) addUpdate(sha string, update fileUpdate, repo *mo | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	stdout, err := git.NewCommand("cat-file", "-s", update.BlobSha). | ||||
| 		RunInDir(repo.RepoPath()) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	size := update.Size | ||||
|  | ||||
| 	if !update.Sized { | ||||
| 		stdout, err := git.NewCommand("cat-file", "-s", update.BlobSha). | ||||
| 			RunInDir(repo.RepoPath()) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		if size, err = strconv.ParseInt(strings.TrimSpace(stdout), 10, 64); err != nil { | ||||
| 			return nil, fmt.Errorf("Misformatted git cat-file output: %v", err) | ||||
| 		} | ||||
| 	} | ||||
| 	if size, err := strconv.Atoi(strings.TrimSpace(stdout)); err != nil { | ||||
| 		return nil, fmt.Errorf("Misformatted git cat-file output: %v", err) | ||||
| 	} else if int64(size) > setting.Indexer.MaxIndexerFileSize { | ||||
|  | ||||
| 	if size > setting.Indexer.MaxIndexerFileSize { | ||||
| 		return []elastic.BulkableRequest{b.addDelete(update.Filename, repo)}, nil | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,8 @@ import ( | ||||
| type fileUpdate struct { | ||||
| 	Filename string | ||||
| 	BlobSha  string | ||||
| 	Size     int64 | ||||
| 	Sized    bool | ||||
| } | ||||
|  | ||||
| // repoChanges changes (file additions/updates/removals) to a repo | ||||
| @@ -77,6 +79,8 @@ func parseGitLsTreeOutput(stdout []byte) ([]fileUpdate, error) { | ||||
| 			updates[idxCount] = fileUpdate{ | ||||
| 				Filename: entry.Name(), | ||||
| 				BlobSha:  entry.ID.String(), | ||||
| 				Size:     entry.Size(), | ||||
| 				Sized:    true, | ||||
| 			} | ||||
| 			idxCount++ | ||||
| 		} | ||||
| @@ -87,7 +91,7 @@ func parseGitLsTreeOutput(stdout []byte) ([]fileUpdate, error) { | ||||
| // genesisChanges get changes to add repo to the indexer for the first time | ||||
| func genesisChanges(repo *models.Repository, revision string) (*repoChanges, error) { | ||||
| 	var changes repoChanges | ||||
| 	stdout, err := git.NewCommand("ls-tree", "--full-tree", "-r", revision). | ||||
| 	stdout, err := git.NewCommand("ls-tree", "--full-tree", "-l", "-r", revision). | ||||
| 		RunInDirBytes(repo.RepoPath()) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -162,7 +166,7 @@ func nonGenesisChanges(repo *models.Repository, revision string) (*repoChanges, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	cmd := git.NewCommand("ls-tree", "--full-tree", revision, "--") | ||||
| 	cmd := git.NewCommand("ls-tree", "--full-tree", "-l", revision, "--") | ||||
| 	cmd.AddArguments(updatedFilenames...) | ||||
| 	lsTreeStdout, err := cmd.RunInDirBytes(repo.RepoPath()) | ||||
| 	if err != nil { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user