From 9e801779f59f475dd492aebf20de095012c334ad Mon Sep 17 00:00:00 2001 From: Javi Fontan Date: Wed, 30 Mar 2022 12:32:26 +0200 Subject: [PATCH] plumbing: object, rename calculation uses too much memory The size of the similarity matrix is not limited and can be quite big when lots of files are deleted and added in a commit. Signed-off-by: Javi Fontan (cherry picked from commit 1115cb6a84ea40ae68962cb82a4bc2dbb44e0f4c) --- plumbing/object/rename.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plumbing/object/rename.go b/plumbing/object/rename.go index 7fed72c2f..0394613ff 100644 --- a/plumbing/object/rename.go +++ b/plumbing/object/rename.go @@ -403,10 +403,16 @@ func min(a, b int) int { return b } +const maxMatrixSize = 10000 + func buildSimilarityMatrix(srcs, dsts []*Change, renameScore int) (similarityMatrix, error) { // Allocate for the worst-case scenario where every pair has a score // that we need to consider. We might not need that many. - matrix := make(similarityMatrix, 0, len(srcs)*len(dsts)) + matrixSize := len(srcs) * len(dsts) + if matrixSize > maxMatrixSize { + matrixSize = maxMatrixSize + } + matrix := make(similarityMatrix, 0, matrixSize) srcSizes := make([]int64, len(srcs)) dstSizes := make([]int64, len(dsts)) dstTooLarge := make(map[int]bool)