aboutsummaryrefslogtreecommitdiffstats
path: root/refs/reftable-backend.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-09-30 16:16:14 -0700
committerJunio C Hamano <gitster@pobox.com>2024-09-30 16:16:14 -0700
commitab68c70a8b90626be24d95a27f6495ab6e7e57a5 (patch)
tree72a3caa79d15bc26df1bc1b0259d3522db892bc2 /refs/reftable-backend.c
parent3857aae53f3633b7de63ad640737c657387ae0c6 (diff)
parent6241ce217046cc77d306bda06ad80ac1973b4932 (diff)
downloadgit-ab68c70a8b90626be24d95a27f6495ab6e7e57a5.tar.gz
Merge branch 'ps/reftable-concurrent-writes'
Give timeout to the locking code to write to reftable. * ps/reftable-concurrent-writes: refs/reftable: reload locked stack when preparing transaction reftable/stack: allow locking of outdated stacks refs/reftable: introduce "reftable.lockTimeout"
Diffstat (limited to 'refs/reftable-backend.c')
-rw-r--r--refs/reftable-backend.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index f5f957e6de..3c96fbf66f 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -260,6 +260,13 @@ static int reftable_be_config(const char *var, const char *value,
if (factor > UINT8_MAX)
die("reftable geometric factor cannot exceed %u", (unsigned)UINT8_MAX);
opts->auto_compaction_factor = factor;
+ } else if (!strcmp(var, "reftable.locktimeout")) {
+ int64_t lock_timeout = git_config_int64(var, value, ctx->kvi);
+ if (lock_timeout > LONG_MAX)
+ die("reftable lock timeout cannot exceed %"PRIdMAX, (intmax_t)LONG_MAX);
+ if (lock_timeout < 0 && lock_timeout != -1)
+ die("reftable lock timeout does not support negative values other than -1");
+ opts->lock_timeout_ms = lock_timeout;
}
return 0;
@@ -286,6 +293,7 @@ static struct ref_store *reftable_be_init(struct repository *repo,
refs->write_options.default_permissions = calc_shared_perm(0666 & ~mask);
refs->write_options.disable_auto_compact =
!git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1);
+ refs->write_options.lock_timeout_ms = 100;
git_config(reftable_be_config, &refs->write_options);
@@ -893,7 +901,8 @@ static int prepare_transaction_update(struct write_transaction_table_arg **out,
if (ret)
return ret;
- ret = reftable_stack_new_addition(&addition, stack);
+ ret = reftable_stack_new_addition(&addition, stack,
+ REFTABLE_STACK_NEW_ADDITION_RELOAD);
if (ret) {
if (ret == REFTABLE_LOCK_ERROR)
strbuf_addstr(err, "cannot lock references");
@@ -2330,7 +2339,7 @@ static int reftable_be_reflog_expire(struct ref_store *ref_store,
if (ret < 0)
goto done;
- ret = reftable_stack_new_addition(&add, stack);
+ ret = reftable_stack_new_addition(&add, stack, 0);
if (ret < 0)
goto done;