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:
1 parent
7d863ed9e4
commit
6d978893f1
2 files changed
+22
No files matched your search
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user