summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2006-06-02 15:32:23 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-06-02 18:09:38 (GMT)
commit637cdd9d1d997fca34a1fc668fed1311e30fe95f (patch)
treeed8d8b1fcbf9a5b9f2bbbb53f007618d32808c41
parent31262627109476c529418132e0820687003fb1fe (diff)
downloadgit-637cdd9d1d997fca34a1fc668fed1311e30fe95f.zip
git-637cdd9d1d997fca34a1fc668fed1311e30fe95f.tar.gz
git-637cdd9d1d997fca34a1fc668fed1311e30fe95f.tar.bz2
handle concurrent pruning of packed objects
This patch causes read_sha1_file and sha1_object_info to re-examine the list of packs if an object cannot be found. It works by re-running prepare_packed_git() after an object fails to be found. It does not attempt to clean up the old pack list. Old packs which are in use can continue to be used (until unused by lru selection). New packs are placed at the front of the list and will thus be examined before old packs. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--sha1_file.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/sha1_file.c b/sha1_file.c
index f77c189..696e53f 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -626,12 +626,12 @@ static void prepare_packed_git_one(char *objdir, int local)
closedir(dir);
}
+static int prepare_packed_git_run_once = 0;
void prepare_packed_git(void)
{
- static int run_once = 0;
struct alternate_object_database *alt;
- if (run_once)
+ if (prepare_packed_git_run_once)
return;
prepare_packed_git_one(get_object_directory(), 1);
prepare_alt_odb();
@@ -640,7 +640,13 @@ void prepare_packed_git(void)
prepare_packed_git_one(alt->base, 0);
alt->name[-1] = '/';
}
- run_once = 1;
+ prepare_packed_git_run_once = 1;
+}
+
+static void reprepare_packed_git(void)
+{
+ prepare_packed_git_run_once = 0;
+ prepare_packed_git();
}
int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long size, const char *type)
@@ -1212,9 +1218,12 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep
if (!map) {
struct pack_entry e;
- if (!find_pack_entry(sha1, &e))
- return error("unable to find %s", sha1_to_hex(sha1));
- return packed_object_info(&e, type, sizep);
+ if (find_pack_entry(sha1, &e))
+ return packed_object_info(&e, type, sizep);
+ reprepare_packed_git();
+ if (find_pack_entry(sha1, &e))
+ return packed_object_info(&e, type, sizep);
+ return error("unable to find %s", sha1_to_hex(sha1));
}
if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
status = error("unable to unpack %s header",
@@ -1256,6 +1265,9 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
munmap(map, mapsize);
return buf;
}
+ reprepare_packed_git();
+ if (find_pack_entry(sha1, &e))
+ return read_packed_sha1(sha1, type, size);
return NULL;
}