Skip to content

Commit

Permalink
lock_ref_sha1_basic(): if locking fails with ENOENT, retry
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Haggerty authored and Junio C Hamano committed Jan 21, 2014
1 parent c4c61c7 commit e5c223e
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -2081,7 +2081,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,

lock->lk = xcalloc(1, sizeof(struct lock_file));

lflags = LOCK_DIE_ON_ERROR;
lflags = 0;
if (flags & REF_NODEREF) {
refname = orig_refname;
lflags |= LOCK_NODEREF;
Expand Down Expand Up @@ -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);
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;

error_return:
Expand Down

0 comments on commit e5c223e

Please sign in to comment.