Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 861e399

Browse files
authored
Merge pull request #716 from jfontan/fix/memory-leak-packing-objects
Clean reconstructed objects outside pack window
2 parents 2547d1d + 3929267 commit 861e399

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

plumbing/format/packfile/delta_selector.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,16 @@ func (dw *deltaSelector) walk(
222222
) error {
223223
indexMap := make(map[plumbing.Hash]*deltaIndex)
224224
for i := 0; i < len(objectsToPack); i++ {
225-
// Clean up the index map for anything outside our pack
226-
// window, to save memory.
225+
// Clean up the index map and reconstructed delta objects for anything
226+
// outside our pack window, to save memory.
227227
if i > int(packWindow) {
228-
delete(indexMap, objectsToPack[i-int(packWindow)].Hash())
228+
obj := objectsToPack[i-int(packWindow)]
229+
230+
delete(indexMap, obj.Hash())
231+
232+
if obj.IsDelta() {
233+
obj.Original = nil
234+
}
229235
}
230236

231237
target := objectsToPack[i]
@@ -261,6 +267,16 @@ func (dw *deltaSelector) walk(
261267
}
262268

263269
func (dw *deltaSelector) tryToDeltify(indexMap map[plumbing.Hash]*deltaIndex, base, target *ObjectToPack) error {
270+
// Original object might not be present if we're reusing a delta, so we
271+
// ensure it is restored.
272+
if err := dw.restoreOriginal(target); err != nil {
273+
return err
274+
}
275+
276+
if err := dw.restoreOriginal(base); err != nil {
277+
return err
278+
}
279+
264280
// If the sizes are radically different, this is a bad pairing.
265281
if target.Size() < base.Size()>>4 {
266282
return nil
@@ -283,16 +299,6 @@ func (dw *deltaSelector) tryToDeltify(indexMap map[plumbing.Hash]*deltaIndex, ba
283299
return nil
284300
}
285301

286-
// Original object might not be present if we're reusing a delta, so we
287-
// ensure it is restored.
288-
if err := dw.restoreOriginal(target); err != nil {
289-
return err
290-
}
291-
292-
if err := dw.restoreOriginal(base); err != nil {
293-
return err
294-
}
295-
296302
if _, ok := indexMap[base.Hash()]; !ok {
297303
indexMap[base.Hash()] = new(deltaIndex)
298304
}

0 commit comments

Comments
 (0)