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

Commit 3929267

Browse files
committed
Clean reconstructed objects outside pack window
Object walk reconstructs delta objects but these are not cleaned up after they got out the pack window. Without this change all reconstructed objects reside in memory. restoreOriginal call is moved before calling Size(). Now we can not guarantee that the object is already undeltified. Signed-off-by: Javi Fontan <javier@sourced.tech>
1 parent 2547d1d commit 3929267

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)