Protect sha1_entry_pos call with mutex There is an occasional assertion failure in sha1_entry_pos from pack_entry_find_index when running threaded. Holding the mutex around the code that grabs the index_map data and processes it makes this assertion failure go away.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
diff --git a/src/pack.c b/src/pack.c
index 47534f1..1ffad29 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -1050,24 +1050,24 @@ static int pack_entry_find_offset(
const git_oid *short_oid,
size_t len)
{
- const uint32_t *level1_ofs = p->index_map.data;
- const unsigned char *index = p->index_map.data;
+ const uint32_t *level1_ofs;
+ const unsigned char *index;
unsigned hi, lo, stride;
int pos, found = 0;
const unsigned char *current = 0;
*offset_out = 0;
- if (index == NULL) {
- int error;
+ if (!p->index_map.data && pack_index_open(p) < 0)
+ return git_odb__error_notfound("failed to open packfile", NULL);
- if ((error = pack_index_open(p)) < 0)
- return error;
- assert(p->index_map.data);
+ if (git_mutex_lock(&p->lock) < 0)
+ return packfile_error("failed to get lock for finding entry offset");
- index = p->index_map.data;
- level1_ofs = p->index_map.data;
- }
+ assert(p->index_map.data);
+
+ index = p->index_map.data;
+ level1_ofs = p->index_map.data;
if (p->index_version > 1) {
level1_ofs += 2;
@@ -1093,6 +1093,8 @@ static int pack_entry_find_offset(
/* Use git.git lookup code */
pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, short_oid->id);
+ git_mutex_unlock(&p->lock);
+
if (pos >= 0) {
/* An object matching exactly the oid was found */
found = 1;