aboutsummaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-08-26 22:55:09 -0700
committerJunio C Hamano <gitster@pobox.com>2017-08-26 22:55:09 -0700
commitf2dd90fc1c38ce1d1ebf626e39ddafad130875ae (patch)
treeefa2f719a8aa9c64c394d4ef78a02b40300cb25c /refs.c
parent138e52ea6856c9982d61285d9ff3cb5a65f67d85 (diff)
parent4ff0f01cb7dd92fad49b4d0799590bb33a88168a (diff)
downloadgit-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.c')
-rw-r--r--refs.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/refs.c b/refs.c
index 3d549a897..b0106b816 100644
--- a/refs.c
+++ b/refs.c
@@ -579,6 +579,21 @@ enum ref_type ref_type(const char *refname)
return REF_TYPE_NORMAL;
}
+long get_files_ref_lock_timeout_ms(void)
+{
+ static int configured = 0;
+
+ /* The default timeout is 100 ms: */
+ static int timeout_ms = 100;
+
+ if (!configured) {
+ git_config_get_int("core.filesreflocktimeout", &timeout_ms);
+ configured = 1;
+ }
+
+ return timeout_ms;
+}
+
static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
const unsigned char *old_sha1, struct strbuf *err)
{
@@ -591,7 +606,9 @@ static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
filename = git_path("%s", pseudoref);
- fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
+ fd = hold_lock_file_for_update_timeout(&lock, filename,
+ LOCK_DIE_ON_ERROR,
+ get_files_ref_lock_timeout_ms());
if (fd < 0) {
strbuf_addf(err, "could not open '%s' for writing: %s",
filename, strerror(errno));
@@ -634,8 +651,9 @@ static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1
int fd;
unsigned char actual_old_sha1[20];
- fd = hold_lock_file_for_update(&lock, filename,
- LOCK_DIE_ON_ERROR);
+ fd = hold_lock_file_for_update_timeout(
+ &lock, filename, LOCK_DIE_ON_ERROR,
+ get_files_ref_lock_timeout_ms());
if (fd < 0)
die_errno(_("Could not open '%s' for writing"), filename);
if (read_ref(pseudoref, actual_old_sha1))