From ad814d1c8abcf8ed27863586301ba47329e273b6 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 13 Dec 2017 14:27:19 -0500 Subject: [PATCH] lib/repo: Disable locking by default, add locking=true boolean I want some time to play with this more with different callers and work through test scenarios. Let's disable the locking by default for now, but make it easy to enable. Closes: #1375 Approved by: jlebon --- src/libostree/ostree-repo.c | 37 ++++++++++++++++++++++++++++--------- tests/test-concurrency.py | 1 + 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index e5ffba91..ec509e9d 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -46,6 +46,9 @@ #include #include +#define REPO_LOCK_DISABLED (-2) +#define REPO_LOCK_BLOCKING (-1) + /* ABI Size checks for ostree-repo.h, only for LP64 systems; * https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models * @@ -474,8 +477,10 @@ ostree_repo_lock_push (OstreeRepo *self, if (!self->writable) return TRUE; - g_assert (self->lock_timeout_seconds >= -1); - if (self->lock_timeout_seconds == -1) + g_assert (self->lock_timeout_seconds >= REPO_LOCK_DISABLED); + if (self->lock_timeout_seconds == REPO_LOCK_DISABLED) + return TRUE; /* No locking */ + else if (self->lock_timeout_seconds == REPO_LOCK_BLOCKING) { g_debug ("Pushing lock blocking"); return push_repo_lock (self, lock_type, TRUE, error); @@ -562,8 +567,10 @@ ostree_repo_lock_pop (OstreeRepo *self, if (!self->writable) return TRUE; - g_assert (self->lock_timeout_seconds >= -1); - if (self->lock_timeout_seconds == -1) + g_assert (self->lock_timeout_seconds >= REPO_LOCK_DISABLED); + if (self->lock_timeout_seconds == REPO_LOCK_DISABLED) + return TRUE; + else if (self->lock_timeout_seconds == REPO_LOCK_BLOCKING) { g_debug ("Popping lock blocking"); return pop_repo_lock (self, TRUE, error); @@ -2733,13 +2740,25 @@ reload_core_config (OstreeRepo *self, self->tmp_expiry_seconds = g_ascii_strtoull (tmp_expiry_seconds, NULL, 10); } - { g_autofree char *lock_timeout_seconds = NULL; - - if (!ot_keyfile_get_value_with_default (self->config, "core", "lock-timeout-secs", "30", - &lock_timeout_seconds, error)) + /* Disable locking by default for now */ + { gboolean locking; + if (!ot_keyfile_get_boolean_with_default (self->config, "core", "locking", + FALSE, &locking, error)) return FALSE; + if (!locking) + { + self->lock_timeout_seconds = REPO_LOCK_DISABLED; + } + else + { + g_autofree char *lock_timeout_seconds = NULL; - self->lock_timeout_seconds = g_ascii_strtoull (lock_timeout_seconds, NULL, 10); + if (!ot_keyfile_get_value_with_default (self->config, "core", "lock-timeout-secs", "30", + &lock_timeout_seconds, error)) + return FALSE; + + self->lock_timeout_seconds = g_ascii_strtoull (lock_timeout_seconds, NULL, 10); + } } { g_autofree char *compression_level_str = NULL; diff --git a/tests/test-concurrency.py b/tests/test-concurrency.py index 6aa8f269..bdcc1d91 100755 --- a/tests/test-concurrency.py +++ b/tests/test-concurrency.py @@ -43,6 +43,7 @@ subprocess.check_call(['ostree', '--repo=repo', 'init', '--mode=bare']) # and we don't need xattr coverage for this with open('repo/config', 'a') as f: f.write('disable-xattrs=true\n') + f.write('locking=true\n') def commit(v): tdir='tree{}'.format(v)