summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-repo-prune.c
diff options
context:
space:
mode:
authorDan Nicholson <nicholson@endlessm.com>2017-10-06 11:04:22 +0000
committerAtomic Bot <atomic-devel@projectatomic.io>2017-12-05 02:32:47 +0000
commitdf7f33e498627c91c6ac21ca1c3ffb1ddd8fa643 (patch)
treecd6f81c87159231d730e4a07cf4e9ac003d13883 /src/libostree/ostree-repo-prune.c
parent6d978893f12f745db529bc1859418e393c6fdc09 (diff)
downloadostree-df7f33e498627c91c6ac21ca1c3ffb1ddd8fa643.tar.gz
lib/prune: Take exclusive repository lock
Add exclusive repository locking to all the pruning entry points. This ensures that objects and deltas will not be removed while another process is writing to the repository. Closes: #1343 Approved by: cgwalters
Diffstat (limited to 'src/libostree/ostree-repo-prune.c')
-rw-r--r--src/libostree/ostree-repo-prune.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libostree/ostree-repo-prune.c b/src/libostree/ostree-repo-prune.c
index 88c52abf..9eec4ebe 100644
--- a/src/libostree/ostree-repo-prune.c
+++ b/src/libostree/ostree-repo-prune.c
@@ -23,6 +23,7 @@
#include "ostree-core-private.h"
#include "ostree-repo-private.h"
+#include "ostree-autocleanups.h"
#include "otutil.h"
typedef struct {
@@ -160,12 +161,20 @@ _ostree_repo_prune_tmp (OstreeRepo *self,
* Prune static deltas, if COMMIT is specified then delete static delta files only
* targeting that commit; otherwise any static delta of non existing commits are
* deleted.
+ *
+ * This function takes an exclusive lock on the @self repository.
*/
gboolean
ostree_repo_prune_static_deltas (OstreeRepo *self, const char *commit,
GCancellable *cancellable,
GError **error)
{
+ g_autoptr(OstreeRepoAutoLock) lock =
+ ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_EXCLUSIVE, cancellable,
+ error);
+ if (!lock)
+ return FALSE;
+
g_autoptr(GPtrArray) deltas = NULL;
if (!ostree_repo_list_static_delta_names (self, &deltas,
cancellable, error))
@@ -286,6 +295,8 @@ repo_prune_internal (OstreeRepo *self,
* Use the %OSTREE_REPO_PRUNE_FLAGS_NO_PRUNE to just determine
* statistics on objects that would be deleted, without actually
* deleting them.
+ *
+ * This function takes an exclusive lock on the @self repository.
*/
gboolean
ostree_repo_prune (OstreeRepo *self,
@@ -297,6 +308,12 @@ ostree_repo_prune (OstreeRepo *self,
GCancellable *cancellable,
GError **error)
{
+ g_autoptr(OstreeRepoAutoLock) lock =
+ ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_EXCLUSIVE, cancellable,
+ error);
+ if (!lock)
+ return FALSE;
+
g_autoptr(GHashTable) objects = NULL;
gboolean refs_only = flags & OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY;
@@ -391,6 +408,8 @@ ostree_repo_prune (OstreeRepo *self,
*
* The %OSTREE_REPO_PRUNE_FLAGS_NO_PRUNE flag may be specified to just determine
* statistics on objects that would be deleted, without actually deleting them.
+ *
+ * This function takes an exclusive lock on the @self repository.
*/
gboolean
ostree_repo_prune_from_reachable (OstreeRepo *self,
@@ -401,6 +420,12 @@ ostree_repo_prune_from_reachable (OstreeRepo *self,
GCancellable *cancellable,
GError **error)
{
+ g_autoptr(OstreeRepoAutoLock) lock =
+ ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_EXCLUSIVE, cancellable,
+ error);
+ if (!lock)
+ return FALSE;
+
g_autoptr(GHashTable) objects = NULL;
if (!ostree_repo_list_objects (self, OSTREE_REPO_LIST_OBJECTS_ALL | OSTREE_REPO_LIST_OBJECTS_NO_PARENTS,