diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-08-26 22:55:09 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-08-26 22:55:09 -0700 |
commit | f2dd90fc1c38ce1d1ebf626e39ddafad130875ae (patch) | |
tree | efa2f719a8aa9c64c394d4ef78a02b40300cb25c /refs | |
parent | Merge branch 'jt/doc-pack-objects-fix' (diff) | |
parent | refs: retry acquiring reference locks for 100ms (diff) | |
download | tgif-f2dd90fc1c38ce1d1ebf626e39ddafad130875ae.tar.xz |
Merge branch 'mh/ref-lock-entry'
The code to acquire a lock on a reference (e.g. while accepting a
push from a client) used to immediately fail when the reference is
already locked---now it waits for a very short while and retries,
which can make it succeed if the lock holder was holding it during
a read-only operation.
* mh/ref-lock-entry:
refs: retry acquiring reference locks for 100ms
Diffstat (limited to 'refs')
-rw-r--r-- | refs/files-backend.c | 8 | ||||
-rw-r--r-- | refs/refs-internal.h | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c index 5cca55510b..fccbc24ac4 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -537,7 +537,9 @@ retry: if (!lock->lk) lock->lk = xcalloc(1, sizeof(struct lock_file)); - if (hold_lock_file_for_update(lock->lk, ref_file.buf, LOCK_NO_DEREF) < 0) { + if (hold_lock_file_for_update_timeout( + lock->lk, ref_file.buf, LOCK_NO_DEREF, + get_files_ref_lock_timeout_ms()) < 0) { if (errno == ENOENT && --attempts_remaining > 0) { /* * Maybe somebody just deleted one of the @@ -865,7 +867,9 @@ static int create_reflock(const char *path, void *cb) { struct lock_file *lk = cb; - return hold_lock_file_for_update(lk, path, LOCK_NO_DEREF) < 0 ? -1 : 0; + return hold_lock_file_for_update_timeout( + lk, path, LOCK_NO_DEREF, + get_files_ref_lock_timeout_ms()) < 0 ? -1 : 0; } /* diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 4789106fc0..b02dc5a7e3 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -62,6 +62,12 @@ #define REF_DELETED_LOOSE 0x200 /* + * Return the length of time to retry acquiring a loose reference lock + * before giving up, in milliseconds: + */ +long get_files_ref_lock_timeout_ms(void); + +/* * Return true iff refname is minimally safe. "Safe" here means that * deleting a loose reference by this name will not do any damage, for * example by causing a file that is not a reference to be deleted. |