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
This commit is contained in:
Dan Nicholson authored and Atomic Bot committed 2017-12-05 02:32:47 +00:00
1 parent 7d863ed9e4
commit 6d978893f1
2 files changed
+22

No files matched your search

+21
View File
@@ -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;
}