lock_ref_sha1_basic(): if locking fails with ENOENT, retry
If hold_lock_file_for_update() fails with errno==ENOENT, it might be because somebody else (for example, a pack-refs process) has just deleted one of the lockfile's ancestor directories. So if this condition is detected, try again (up to 3 times). Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
c4c61c763e
commit
e5c223e98b
13
refs.c
13
refs.c
|
@ -2081,7 +2081,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
|
||||||
|
|
||||||
lock->lk = xcalloc(1, sizeof(struct lock_file));
|
lock->lk = xcalloc(1, sizeof(struct lock_file));
|
||||||
|
|
||||||
lflags = LOCK_DIE_ON_ERROR;
|
lflags = 0;
|
||||||
if (flags & REF_NODEREF) {
|
if (flags & REF_NODEREF) {
|
||||||
refname = orig_refname;
|
refname = orig_refname;
|
||||||
lflags |= LOCK_NODEREF;
|
lflags |= LOCK_NODEREF;
|
||||||
|
@ -2109,6 +2109,17 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
|
||||||
}
|
}
|
||||||
|
|
||||||
lock->lock_fd = hold_lock_file_for_update(lock->lk, ref_file, lflags);
|
lock->lock_fd = hold_lock_file_for_update(lock->lk, ref_file, lflags);
|
||||||
|
if (lock->lock_fd < 0) {
|
||||||
|
if (errno == ENOENT && --attempts_remaining > 0)
|
||||||
|
/*
|
||||||
|
* Maybe somebody just deleted one of the
|
||||||
|
* directories leading to ref_file. Try
|
||||||
|
* again:
|
||||||
|
*/
|
||||||
|
goto retry;
|
||||||
|
else
|
||||||
|
unable_to_lock_index_die(ref_file, errno);
|
||||||
|
}
|
||||||
return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock;
|
return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock;
|
||||||
|
|
||||||
error_return:
|
error_return:
|
||||||
|
|
Loading…
Reference in New Issue