Nicolas Pitre [off-list ref] writes:
On Fri, 24 Feb 2006, Junio C Hamano wrote:
quoted
In Linux 2.6 repository, these object pairs take forever to
delta.
blob 9af06ba723df75fed49f7ccae5b6c9c34bc5115f ->
blob dfc9cd58dc065d17030d875d3fea6e7862ede143
size (491102 -> 496045)
58 seconds
blob 4917ec509720a42846d513addc11cbd25e0e3c4f ->
blob dfc9cd58dc065d17030d875d3fea6e7862ede143
size (495831 -> 496045)
64 seconds
Thanks for this. I'll see what I can do to tweak the code to better
cope with those. Just keep my fourth delta patch in the pu branch for
now.
If apply this on top of pack-objects.c, you can find more of
them yourself.
---
diff --git a/pack-objects.c b/pack-objects.c
index be7a200..3f88e86 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -62,6 +62,7 @@ static const char *base_name;
static unsigned char pack_file_sha1[20];
static int progress = 1;
static volatile int progress_update = 0;
+static volatile int progress_update_cnt = 0;
/*
* The object names in objects array are hashed with this hashtable,
@@ -826,6 +827,7 @@ static int try_delta(struct unpacked *cu
struct object_entry *old_entry = old->entry;
int old_preferred = (old_entry->preferred_base ||
old_entry->based_on_preferred);
+ int last_up;
unsigned long size, oldsize, delta_size, sizediff;
long max_size;
void *delta_buf;
@@ -890,8 +892,17 @@ static int try_delta(struct unpacked *cu
}
if (sizediff >= max_size)
return -1;
+ last_up = progress_update_cnt;
delta_buf = diff_delta(old->data, oldsize,
cur->data, size, &delta_size, max_size);
+ if (last_up + 1 < progress_update_cnt) {
+ /* It took more than one second */
+ fprintf(stderr, "%d -> %d: %s -> ",
+ last_up, progress_update_cnt,
+ sha1_to_hex(old_entry->sha1));
+ fprintf(stderr, "%s (%lu -> %lu)\n",
+ sha1_to_hex(cur_entry->sha1), oldsize, size);
+ }
if (!delta_buf)
return 0;
cur_entry->delta = old_entry;@@ -906,6 +917,7 @@ static void progress_interval(int signum
{
signal(SIGALRM, progress_interval);
progress_update = 1;
+ progress_update_cnt++;
}
static void find_deltas(struct object_entry **list, int window, int depth)