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 | 138e52ea6856c9982d61285d9ff3cb5a65f67d85 (diff) | |
parent | 4ff0f01cb7dd92fad49b4d0799590bb33a88168a (diff) | |
download | git-f2dd90fc1c38ce1d1ebf626e39ddafad130875ae.tar.gz git-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 5cca55510..fccbc24ac 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 4789106fc..b02dc5a7e 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. |