Skip to content

Commit 560b25a

Browse files
Nicolas PitreJunio C Hamano
authored andcommitted
don't load objects needlessly when repacking
If no delta is attempted on some objects then it is useless to load them in memory, neither create any delta index for them. The best thing to do is therefore to load and index them only when really needed. Signed-off-by: Nicolas Pitre <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e3a5629 commit 560b25a

File tree

1 file changed

+28
-17
lines changed

1 file changed

+28
-17
lines changed

pack-objects.c

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -970,11 +970,12 @@ struct unpacked {
970970
* one.
971971
*/
972972
static int try_delta(struct unpacked *trg, struct unpacked *src,
973-
struct delta_index *src_index, unsigned max_depth)
973+
unsigned max_depth)
974974
{
975975
struct object_entry *trg_entry = trg->entry;
976976
struct object_entry *src_entry = src->entry;
977-
unsigned long size, src_size, delta_size, sizediff, max_size;
977+
unsigned long trg_size, src_size, delta_size, sizediff, max_size, sz;
978+
char type[10];
978979
void *delta_buf;
979980

980981
/* Don't bother doing diffs between different types */
@@ -1009,19 +1010,38 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
10091010
return 0;
10101011

10111012
/* Now some size filtering heuristics. */
1012-
size = trg_entry->size;
1013-
max_size = size/2 - 20;
1013+
trg_size = trg_entry->size;
1014+
max_size = trg_size/2 - 20;
10141015
max_size = max_size * (max_depth - src_entry->depth) / max_depth;
10151016
if (max_size == 0)
10161017
return 0;
10171018
if (trg_entry->delta && trg_entry->delta_size <= max_size)
10181019
max_size = trg_entry->delta_size-1;
10191020
src_size = src_entry->size;
1020-
sizediff = src_size < size ? size - src_size : 0;
1021+
sizediff = src_size < trg_size ? trg_size - src_size : 0;
10211022
if (sizediff >= max_size)
10221023
return 0;
10231024

1024-
delta_buf = create_delta(src_index, trg->data, size, &delta_size, max_size);
1025+
/* Load data if not already done */
1026+
if (!trg->data) {
1027+
trg->data = read_sha1_file(trg_entry->sha1, type, &sz);
1028+
if (sz != trg_size)
1029+
die("object %s inconsistent object length (%lu vs %lu)",
1030+
sha1_to_hex(trg_entry->sha1), sz, trg_size);
1031+
}
1032+
if (!src->data) {
1033+
src->data = read_sha1_file(src_entry->sha1, type, &sz);
1034+
if (sz != src_size)
1035+
die("object %s inconsistent object length (%lu vs %lu)",
1036+
sha1_to_hex(src_entry->sha1), sz, src_size);
1037+
}
1038+
if (!src->index) {
1039+
src->index = create_delta_index(src->data, src_size);
1040+
if (!src->index)
1041+
die("out of memory");
1042+
}
1043+
1044+
delta_buf = create_delta(src->index, trg->data, trg_size, &delta_size, max_size);
10251045
if (!delta_buf)
10261046
return 0;
10271047

@@ -1054,8 +1074,6 @@ static void find_deltas(struct object_entry **list, int window, int depth)
10541074
while (--i >= 0) {
10551075
struct object_entry *entry = list[i];
10561076
struct unpacked *n = array + idx;
1057-
unsigned long size;
1058-
char type[10];
10591077
int j;
10601078

10611079
if (!entry->preferred_base)
@@ -1082,11 +1100,8 @@ static void find_deltas(struct object_entry **list, int window, int depth)
10821100
free_delta_index(n->index);
10831101
n->index = NULL;
10841102
free(n->data);
1103+
n->data = NULL;
10851104
n->entry = entry;
1086-
n->data = read_sha1_file(entry->sha1, type, &size);
1087-
if (size != entry->size)
1088-
die("object %s inconsistent object length (%lu vs %lu)",
1089-
sha1_to_hex(entry->sha1), size, entry->size);
10901105

10911106
j = window;
10921107
while (--j > 0) {
@@ -1097,7 +1112,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
10971112
m = array + other_idx;
10981113
if (!m->entry)
10991114
break;
1100-
if (try_delta(n, m, m->index, depth) < 0)
1115+
if (try_delta(n, m, depth) < 0)
11011116
break;
11021117
}
11031118
/* if we made n a delta, and if n is already at max
@@ -1107,10 +1122,6 @@ static void find_deltas(struct object_entry **list, int window, int depth)
11071122
if (entry->delta && depth <= entry->depth)
11081123
continue;
11091124

1110-
n->index = create_delta_index(n->data, size);
1111-
if (!n->index)
1112-
die("out of memory");
1113-
11141125
idx++;
11151126
if (idx >= window)
11161127
idx = 0;

0 commit comments

Comments
 (0)