summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-06-24 12:21:54 -0700
committerJunio C Hamano <gitster@pobox.com>2015-06-24 12:21:54 -0700
commit712b351bd37d4e4676d1165993cad4cc2176b346 (patch)
treea81d157a57664f19b32d5fe9e704c3585af78b0b
parentc595cb9c4f7c5fb2b09c5f3d3c07cf4488dc7ef9 (diff)
parent0eeb077be7d526635995e17808927c94c70be665 (diff)
downloadgit-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.c2
-rw-r--r--cache.h11
-rw-r--r--sha1_file.c4
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) {
diff --git a/cache.h b/cache.h
index fe840e34a5..4f554664c5 100644
--- a/cache.h
+++ b/cache.h
@@ -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);
}