diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-06-24 12:21:54 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-06-24 12:21:54 -0700 |
commit | 712b351bd37d4e4676d1165993cad4cc2176b346 (patch) | |
tree | a81d157a57664f19b32d5fe9e704c3585af78b0b | |
parent | c595cb9c4f7c5fb2b09c5f3d3c07cf4488dc7ef9 (diff) | |
parent | 0eeb077be7d526635995e17808927c94c70be665 (diff) | |
download | git-712b351bd37d4e4676d1165993cad4cc2176b346.tar.gz |
Merge branch 'jk/index-pack-reduce-recheck'
Disable "have we lost a race with competing repack?" check while
receiving a huge object transfer that runs index-pack.
* jk/index-pack-reduce-recheck:
index-pack: avoid excessive re-reading of pack directory
-rw-r--r-- | builtin/index-pack.c | 2 | ||||
-rw-r--r-- | cache.h | 11 | ||||
-rw-r--r-- | sha1_file.c | 4 |
3 files changed, 14 insertions, 3 deletions
diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 2ecfbae239..48fa4724aa 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -786,7 +786,7 @@ static void sha1_object(const void *data, struct object_entry *obj_entry, assert(data || obj_entry); read_lock(); - collision_test_needed = has_sha1_file(sha1); + collision_test_needed = has_sha1_file_with_flags(sha1, HAS_SHA1_QUICK); read_unlock(); if (collision_test_needed && !data) { @@ -943,8 +943,17 @@ extern int has_sha1_pack(const unsigned char *sha1); * Return true iff we have an object named sha1, whether local or in * an alternate object database, and whether packed or loose. This * function does not respect replace references. + * + * If the QUICK flag is set, do not re-check the pack directory + * when we cannot find the object (this means we may give a false + * negative answer if another process is simultaneously repacking). */ -extern int has_sha1_file(const unsigned char *sha1); +#define HAS_SHA1_QUICK 0x1 +extern int has_sha1_file_with_flags(const unsigned char *sha1, int flags); +static inline int has_sha1_file(const unsigned char *sha1) +{ + return has_sha1_file_with_flags(sha1, 0); +} /* * Return true iff an alternate object database has a loose object diff --git a/sha1_file.c b/sha1_file.c index 50384754e5..77cd81db31 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -3168,7 +3168,7 @@ int has_sha1_pack(const unsigned char *sha1) return find_pack_entry(sha1, &e); } -int has_sha1_file(const unsigned char *sha1) +int has_sha1_file_with_flags(const unsigned char *sha1, int flags) { struct pack_entry e; @@ -3176,6 +3176,8 @@ int has_sha1_file(const unsigned char *sha1) return 1; if (has_loose_object(sha1)) return 1; + if (flags & HAS_SHA1_QUICK) + return 0; reprepare_packed_git(); return find_pack_entry(sha1, &e); } |