From 6d978893f12f745db529bc1859418e393c6fdc09 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Fri, 6 Oct 2017 10:56:09 +0000 Subject: [PATCH] lib/commit: Add repository locking during transactions Take a shared repo lock during a transaction to ensure that another process doesn't delete objects. Closes: #1343 Approved by: cgwalters --- src/libostree/ostree-repo-commit.c | 21 +++++++++++++++++++++ src/libostree/ostree-repo-private.h | 1 + 2 files changed, 22 insertions(+) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index b64ef1e0..79162890 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -1304,6 +1304,8 @@ ostree_repo_scan_hardlinks (OstreeRepo *self, * * Multithreading: This function is *not* MT safe; only one transaction can be * active at a time. + * + * This function takes a shared lock on the @self repository. */ gboolean ostree_repo_prepare_transaction (OstreeRepo *self, @@ -1316,6 +1318,11 @@ ostree_repo_prepare_transaction (OstreeRepo *self, memset (&self->txn.stats, 0, sizeof (OstreeRepoTransactionStats)); + self->txn_locked = ostree_repo_lock_push (self, OSTREE_REPO_LOCK_SHARED, + cancellable, error); + if (!self->txn_locked) + return FALSE; + self->in_transaction = TRUE; if (self->min_free_space_percent > 0) { @@ -1836,6 +1843,13 @@ ostree_repo_commit_transaction (OstreeRepo *self, if (!ot_ensure_unlinked_at (self->repo_dir_fd, "transaction", 0)) return FALSE; + if (self->txn_locked) + { + if (!ostree_repo_lock_pop (self, cancellable, error)) + return FALSE; + self->txn_locked = FALSE; + } + if (out_stats) *out_stats = self->txn.stats; @@ -1876,6 +1890,13 @@ ostree_repo_abort_transaction (OstreeRepo *self, self->in_transaction = FALSE; + if (self->txn_locked) + { + if (!ostree_repo_lock_pop (self, cancellable, error)) + return FALSE; + self->txn_locked = FALSE; + } + return TRUE; } diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index ae51cea3..764540a2 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -122,6 +122,7 @@ struct OstreeRepo { GMutex txn_lock; OstreeRepoTxn txn; + gboolean txn_locked; GMutex cache_lock; guint dirmeta_cache_refcount; -- 2.30.2