blame.c: don't drop origin blobs as eagerly
authorDavid Kastrup <dak@gnu.org>
Tue, 2 Apr 2019 11:56:25 +0000 (13:56 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Apr 2019 07:45:26 +0000 (16:45 +0900)
When a parent blob already has chunks queued up for blaming, dropping
the blob at the end of one blame step will cause it to get reloaded
right away, doubling the amount of I/O and unpacking when processing a
linear history.

Keeping such parent blobs in memory seems like a reasonable optimization
that should incur additional memory pressure mostly when processing the
merges from old branches.

Signed-off-by: David Kastrup <dak@gnu.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
blame.c
diff --git a/blame.c b/blame.c
index da57233cbbd98d41bdfeba46e861b1f5f61dfbe2..4e9ccd09221e66ca2f5c02a563c18294b1cc3942 100644 (file)
--- a/blame.c
+++ b/blame.c
@@ -1561,7 +1561,8 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,
        }
        for (i = 0; i < num_sg; i++) {
                if (sg_origin[i]) {
-                       drop_origin_blob(sg_origin[i]);
+                       if (!sg_origin[i]->suspects)
+                               drop_origin_blob(sg_origin[i]);
                        blame_origin_decref(sg_origin[i]);
                }
        }