summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2007-12-10 19:19:32 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-12-11 01:10:16 (GMT)
commiteb9688ff65a3f7fb28ee6488be728fc72e42d5d6 (patch)
tree24f1b69a8857fb366053b657f1fa7a0c6ecd0da0
parentc07c7bf630efd8ddcd41490036c1eefb01a39f98 (diff)
downloadgit-eb9688ff65a3f7fb28ee6488be728fc72e42d5d6.zip
git-eb9688ff65a3f7fb28ee6488be728fc72e42d5d6.tar.gz
git-eb9688ff65a3f7fb28ee6488be728fc72e42d5d6.tar.bz2
pack-objects: more threaded load balancing fix with often changed paths
The code that splits the object list amongst work threads tries to do so on "path" boundaries not to prevent good delta matches. However, in some cases, a few paths may largely dominate the hash distribution and it is not possible to have good load balancing without ignoring those boundaries. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-pack-objects.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 250dc56..7dd0d7f 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1709,6 +1709,16 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
list++;
sub_size--;
}
+ if (!sub_size) {
+ /*
+ * It is possible for some "paths" to have
+ * so many objects that no hash boundary
+ * might be found. Let's just steal the
+ * exact half in that case.
+ */
+ sub_size = victim->remaining / 2;
+ list -= sub_size;
+ }
target->list = list;
victim->list_size -= sub_size;
victim->remaining -= sub_size;