summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-repo-prune.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libostree/ostree-repo-prune.c')
-rw-r--r--src/libostree/ostree-repo-prune.c221
1 files changed, 97 insertions, 124 deletions
diff --git a/src/libostree/ostree-repo-prune.c b/src/libostree/ostree-repo-prune.c
index 9394c621..58178599 100644
--- a/src/libostree/ostree-repo-prune.c
+++ b/src/libostree/ostree-repo-prune.c
@@ -21,12 +21,13 @@
#include "config.h"
+#include "ostree-autocleanups.h"
#include "ostree-core-private.h"
#include "ostree-repo-private.h"
-#include "ostree-autocleanups.h"
#include "otutil.h"
-typedef struct {
+typedef struct
+{
OstreeRepo *repo;
GHashTable *reachable;
guint n_reachable_meta;
@@ -37,11 +38,8 @@ typedef struct {
} OtPruneData;
static gboolean
-maybe_prune_loose_object (OtPruneData *data,
- OstreeRepoPruneFlags flags,
- GVariant *key,
- GCancellable *cancellable,
- GError **error)
+maybe_prune_loose_object (OtPruneData *data, OstreeRepoPruneFlags flags, GVariant *key,
+ GCancellable *cancellable, GError **error)
{
gboolean reachable = FALSE;
const char *checksum;
@@ -59,11 +57,10 @@ maybe_prune_loose_object (OtPruneData *data,
{
guint64 storage_size = 0;
- g_debug ("Pruning unneeded object %s.%s", checksum,
- ostree_object_type_to_string (objtype));
+ g_debug ("Pruning unneeded object %s.%s", checksum, ostree_object_type_to_string (objtype));
- if (!ostree_repo_query_object_storage_size (data->repo, objtype, checksum,
- &storage_size, cancellable, error))
+ if (!ostree_repo_query_object_storage_size (data->repo, objtype, checksum, &storage_size,
+ cancellable, error))
return FALSE;
data->freed_bytes += storage_size;
@@ -74,26 +71,31 @@ maybe_prune_loose_object (OtPruneData *data,
{
ssize_t size;
char loose_path_buf[_OSTREE_LOOSE_PATH_MAX];
- char target_checksum[OSTREE_SHA256_STRING_LEN+1];
+ char target_checksum[OSTREE_SHA256_STRING_LEN + 1];
char target_buf[_OSTREE_LOOSE_PATH_MAX + _OSTREE_PAYLOAD_LINK_PREFIX_LEN];
- _ostree_loose_path (loose_path_buf, checksum, OSTREE_OBJECT_TYPE_PAYLOAD_LINK, data->repo->mode);
- size = readlinkat (data->repo->objects_dir_fd, loose_path_buf, target_buf, sizeof (target_buf));
+ _ostree_loose_path (loose_path_buf, checksum, OSTREE_OBJECT_TYPE_PAYLOAD_LINK,
+ data->repo->mode);
+ size = readlinkat (data->repo->objects_dir_fd, loose_path_buf, target_buf,
+ sizeof (target_buf));
if (size < 0)
return glnx_throw_errno_prefix (error, "readlinkat");
if (size < OSTREE_SHA256_STRING_LEN + _OSTREE_PAYLOAD_LINK_PREFIX_LEN)
return glnx_throw (error, "invalid data size for %s", loose_path_buf);
- sprintf (target_checksum, "%.2s%.62s", target_buf + _OSTREE_PAYLOAD_LINK_PREFIX_LEN, target_buf + _OSTREE_PAYLOAD_LINK_PREFIX_LEN + 3);
+ sprintf (target_checksum, "%.2s%.62s", target_buf + _OSTREE_PAYLOAD_LINK_PREFIX_LEN,
+ target_buf + _OSTREE_PAYLOAD_LINK_PREFIX_LEN + 3);
- g_autoptr(GVariant) target_key = ostree_object_name_serialize (target_checksum, OSTREE_OBJECT_TYPE_FILE);
+ g_autoptr (GVariant) target_key
+ = ostree_object_name_serialize (target_checksum, OSTREE_OBJECT_TYPE_FILE);
if (g_hash_table_lookup_extended (data->reachable, target_key, NULL, NULL))
{
guint64 target_storage_size = 0;
- if (!ostree_repo_query_object_storage_size (data->repo, OSTREE_OBJECT_TYPE_FILE, target_checksum,
- &target_storage_size, cancellable, error))
+ if (!ostree_repo_query_object_storage_size (data->repo, OSTREE_OBJECT_TYPE_FILE,
+ target_checksum, &target_storage_size,
+ cancellable, error))
return FALSE;
reachable = target_storage_size >= data->repo->payload_link_threshold;
@@ -107,10 +109,8 @@ maybe_prune_loose_object (OtPruneData *data,
return FALSE;
}
- if (!ostree_repo_delete_object (data->repo, objtype, checksum,
- cancellable, error))
+ if (!ostree_repo_delete_object (data->repo, objtype, checksum, cancellable, error))
return FALSE;
-
}
if (OSTREE_OBJECT_TYPE_IS_META (objtype))
@@ -119,17 +119,16 @@ maybe_prune_loose_object (OtPruneData *data,
data->n_unreachable_content++;
}
- exit:
+exit:
if (reachable)
{
- g_debug ("Keeping needed object %s.%s", checksum,
- ostree_object_type_to_string (objtype));
+ g_debug ("Keeping needed object %s.%s", checksum, ostree_object_type_to_string (objtype));
if (OSTREE_OBJECT_TYPE_IS_META (objtype))
data->n_reachable_meta++;
else
data->n_reachable_content++;
}
- if (commit_only && (objtype != OSTREE_OBJECT_TYPE_COMMIT))
+ if (commit_only && (objtype != OSTREE_OBJECT_TYPE_COMMIT))
{
g_debug ("Keeping object (not commit) %s.%s", checksum,
ostree_object_type_to_string (objtype));
@@ -138,17 +137,17 @@ maybe_prune_loose_object (OtPruneData *data,
}
static gboolean
-_ostree_repo_prune_tmp (OstreeRepo *self,
- GCancellable *cancellable,
- GError **error)
+_ostree_repo_prune_tmp (OstreeRepo *self, GCancellable *cancellable, GError **error)
{
if (self->cache_dir_fd == -1)
return TRUE;
- g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
+ g_auto (GLnxDirFdIterator) dfd_iter = {
+ 0,
+ };
gboolean exists;
- if (!ot_dfd_iter_init_allow_noent (self->cache_dir_fd, _OSTREE_SUMMARY_CACHE_DIR,
- &dfd_iter, &exists, error))
+ if (!ot_dfd_iter_init_allow_noent (self->cache_dir_fd, _OSTREE_SUMMARY_CACHE_DIR, &dfd_iter,
+ &exists, error))
return FALSE;
/* Note early return */
if (!exists)
@@ -204,18 +203,16 @@ _ostree_repo_prune_tmp (OstreeRepo *self,
* Locking: exclusive
*/
gboolean
-ostree_repo_prune_static_deltas (OstreeRepo *self, const char *commit,
- GCancellable *cancellable,
- GError **error)
+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);
+ 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))
+ g_autoptr (GPtrArray) deltas = NULL;
+ if (!ostree_repo_list_static_delta_names (self, &deltas, cancellable, error))
return FALSE;
for (guint i = 0; i < deltas->len; i++)
@@ -243,8 +240,7 @@ ostree_repo_prune_static_deltas (OstreeRepo *self, const char *commit,
else
{
gboolean have_commit;
- if (!ostree_repo_has_object (self, OSTREE_OBJECT_TYPE_COMMIT,
- to, &have_commit,
+ if (!ostree_repo_has_object (self, OSTREE_OBJECT_TYPE_COMMIT, to, &have_commit,
cancellable, error))
return FALSE;
@@ -254,8 +250,7 @@ ostree_repo_prune_static_deltas (OstreeRepo *self, const char *commit,
g_debug ("Trying to prune static delta %s", deltaname);
g_autofree char *deltadir = _ostree_get_relative_static_delta_path (from, to, NULL);
- if (!glnx_shutil_rm_rf_at (self->repo_dir_fd, deltadir,
- cancellable, error))
+ if (!glnx_shutil_rm_rf_at (self->repo_dir_fd, deltadir, cancellable, error))
return FALSE;
}
@@ -263,26 +258,23 @@ ostree_repo_prune_static_deltas (OstreeRepo *self, const char *commit,
}
static gboolean
-repo_prune_internal (OstreeRepo *self,
- GHashTable *objects,
- OstreeRepoPruneOptions *options,
- gint *out_objects_total,
- gint *out_objects_pruned,
- guint64 *out_pruned_object_size_total,
- GCancellable *cancellable,
- GError **error)
+repo_prune_internal (OstreeRepo *self, GHashTable *objects, OstreeRepoPruneOptions *options,
+ gint *out_objects_total, gint *out_objects_pruned,
+ guint64 *out_pruned_object_size_total, GCancellable *cancellable,
+ GError **error)
{
- OtPruneData data = { 0, };
+ OtPruneData data = {
+ 0,
+ };
data.repo = self;
/* We unref this when we're done */
- g_autoptr(GHashTable) reachable_owned = g_hash_table_ref (options->reachable);
+ g_autoptr (GHashTable) reachable_owned = g_hash_table_ref (options->reachable);
data.reachable = reachable_owned;
- GLNX_HASH_TABLE_FOREACH (objects, GVariant*, serialized_key)
+ GLNX_HASH_TABLE_FOREACH (objects, GVariant *, serialized_key)
{
- if (!maybe_prune_loose_object (&data, options->flags, serialized_key,
- cancellable, error))
+ if (!maybe_prune_loose_object (&data, options->flags, serialized_key, cancellable, error))
return FALSE;
}
@@ -292,53 +284,49 @@ repo_prune_internal (OstreeRepo *self,
if (!_ostree_repo_prune_tmp (self, cancellable, error))
return FALSE;
- *out_objects_total = (data.n_reachable_meta + data.n_unreachable_meta +
- data.n_reachable_content + data.n_unreachable_content);
+ *out_objects_total = (data.n_reachable_meta + data.n_unreachable_meta + data.n_reachable_content
+ + data.n_unreachable_content);
*out_objects_pruned = (data.n_unreachable_meta + data.n_unreachable_content);
*out_pruned_object_size_total = data.freed_bytes;
return TRUE;
}
static gboolean
-traverse_reachable_internal (OstreeRepo *self,
- OstreeRepoCommitTraverseFlags flags,
- guint depth,
- GHashTable *reachable,
- GCancellable *cancellable,
- GError **error)
+traverse_reachable_internal (OstreeRepo *self, OstreeRepoCommitTraverseFlags flags, guint depth,
+ GHashTable *reachable, GCancellable *cancellable, GError **error)
{
- g_autoptr(OstreeRepoAutoLock) lock =
- ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_SHARED, cancellable, error);
+ g_autoptr (OstreeRepoAutoLock) lock
+ = ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_SHARED, cancellable, error);
if (!lock)
return FALSE;
/* Ignoring collections. */
- g_autoptr(GHashTable) all_refs = NULL; /* (element-type utf8 utf8) */
+ g_autoptr (GHashTable) all_refs = NULL; /* (element-type utf8 utf8) */
- if (!ostree_repo_list_refs (self, NULL, &all_refs,
- cancellable, error))
+ if (!ostree_repo_list_refs (self, NULL, &all_refs, cancellable, error))
return FALSE;
- GLNX_HASH_TABLE_FOREACH_V (all_refs, const char*, checksum)
+ GLNX_HASH_TABLE_FOREACH_V (all_refs, const char *, checksum)
{
g_debug ("Finding objects to keep for commit %s", checksum);
- if (!ostree_repo_traverse_commit_with_flags (self, flags, checksum, depth, reachable,
- NULL, cancellable, error))
+ if (!ostree_repo_traverse_commit_with_flags (self, flags, checksum, depth, reachable, NULL,
+ cancellable, error))
return FALSE;
}
/* Using collections. */
- g_autoptr(GHashTable) all_collection_refs = NULL; /* (element-type OstreeChecksumRef utf8) */
+ g_autoptr (GHashTable) all_collection_refs = NULL; /* (element-type OstreeChecksumRef utf8) */
if (!ostree_repo_list_collection_refs (self, NULL, &all_collection_refs,
- OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES, cancellable, error))
+ OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES, cancellable,
+ error))
return FALSE;
- GLNX_HASH_TABLE_FOREACH_V (all_collection_refs, const char*, checksum)
+ GLNX_HASH_TABLE_FOREACH_V (all_collection_refs, const char *, checksum)
{
g_debug ("Finding objects to keep for commit %s", checksum);
- if (!ostree_repo_traverse_commit_with_flags (self, flags, checksum, depth, reachable,
- NULL, cancellable, error))
+ if (!ostree_repo_traverse_commit_with_flags (self, flags, checksum, depth, reachable, NULL,
+ cancellable, error))
return FALSE;
}
@@ -359,15 +347,10 @@ traverse_reachable_internal (OstreeRepo *self,
* Since: 2018.6
*/
gboolean
-ostree_repo_traverse_reachable_refs (OstreeRepo *self,
- guint depth,
- GHashTable *reachable,
- GCancellable *cancellable,
- GError **error)
+ostree_repo_traverse_reachable_refs (OstreeRepo *self, guint depth, GHashTable *reachable,
+ GCancellable *cancellable, GError **error)
{
- return traverse_reachable_internal (self,
- OSTREE_REPO_COMMIT_TRAVERSE_FLAG_NONE,
- depth, reachable,
+ return traverse_reachable_internal (self, OSTREE_REPO_COMMIT_TRAVERSE_FLAG_NONE, depth, reachable,
cancellable, error);
}
@@ -399,25 +382,20 @@ ostree_repo_traverse_reachable_refs (OstreeRepo *self,
* Locking: exclusive
*/
gboolean
-ostree_repo_prune (OstreeRepo *self,
- OstreeRepoPruneFlags flags,
- gint depth,
- gint *out_objects_total,
- gint *out_objects_pruned,
- guint64 *out_pruned_object_size_total,
- GCancellable *cancellable,
- GError **error)
+ostree_repo_prune (OstreeRepo *self, OstreeRepoPruneFlags flags, gint depth,
+ gint *out_objects_total, gint *out_objects_pruned,
+ guint64 *out_pruned_object_size_total, GCancellable *cancellable, GError **error)
{
- g_autoptr(OstreeRepoAutoLock) lock =
- ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_EXCLUSIVE, cancellable, 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;
+ g_autoptr (GHashTable) objects = NULL;
gboolean refs_only = flags & OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY;
gboolean commit_only = flags & OSTREE_REPO_PRUNE_FLAGS_COMMIT_ONLY;
- g_autoptr(GHashTable) reachable = ostree_repo_traverse_new_reachable ();
+ g_autoptr (GHashTable) reachable = ostree_repo_traverse_new_reachable ();
/* This original prune API has fixed logic for traversing refs or all commits
* combined with actually deleting content. The newer backend API just does
@@ -430,9 +408,7 @@ ostree_repo_prune (OstreeRepo *self,
if (refs_only)
{
- if (!traverse_reachable_internal (self, traverse_flags,
- depth, reachable,
- cancellable, error))
+ if (!traverse_reachable_internal (self, traverse_flags, depth, reachable, cancellable, error))
return FALSE;
}
@@ -443,8 +419,9 @@ ostree_repo_prune (OstreeRepo *self,
}
else
{
- objects = ostree_repo_list_objects_set (self, OSTREE_REPO_LIST_OBJECTS_ALL | OSTREE_REPO_LIST_OBJECTS_NO_PARENTS,
- cancellable, error);
+ objects = ostree_repo_list_objects_set (
+ self, OSTREE_REPO_LIST_OBJECTS_ALL | OSTREE_REPO_LIST_OBJECTS_NO_PARENTS, cancellable,
+ error);
}
if (!objects)
@@ -452,7 +429,7 @@ ostree_repo_prune (OstreeRepo *self,
if (!refs_only)
{
- GLNX_HASH_TABLE_FOREACH (objects, GVariant*, serialized_key)
+ GLNX_HASH_TABLE_FOREACH (objects, GVariant *, serialized_key)
{
const char *checksum;
OstreeObjectType objtype;
@@ -463,15 +440,15 @@ ostree_repo_prune (OstreeRepo *self,
continue;
g_debug ("Finding objects to keep for commit %s", checksum);
- if (!ostree_repo_traverse_commit_with_flags (self, traverse_flags, checksum, depth, reachable,
- NULL, cancellable, error))
+ if (!ostree_repo_traverse_commit_with_flags (self, traverse_flags, checksum, depth,
+ reachable, NULL, cancellable, error))
return FALSE;
}
}
- { OstreeRepoPruneOptions opts = { flags, reachable };
- return repo_prune_internal (self, objects, &opts,
- out_objects_total, out_objects_pruned,
+ {
+ OstreeRepoPruneOptions opts = { flags, reachable };
+ return repo_prune_internal (self, objects, &opts, out_objects_total, out_objects_pruned,
out_pruned_object_size_total, cancellable, error);
}
}
@@ -503,20 +480,17 @@ ostree_repo_prune (OstreeRepo *self,
* Since: 2017.1
*/
gboolean
-ostree_repo_prune_from_reachable (OstreeRepo *self,
- OstreeRepoPruneOptions *options,
- gint *out_objects_total,
- gint *out_objects_pruned,
- guint64 *out_pruned_object_size_total,
- GCancellable *cancellable,
- GError **error)
+ostree_repo_prune_from_reachable (OstreeRepo *self, OstreeRepoPruneOptions *options,
+ gint *out_objects_total, gint *out_objects_pruned,
+ guint64 *out_pruned_object_size_total, GCancellable *cancellable,
+ GError **error)
{
- g_autoptr(OstreeRepoAutoLock) lock =
- ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_EXCLUSIVE, cancellable, 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;
+ g_autoptr (GHashTable) objects = NULL;
OstreeRepoPruneFlags flags = options->flags;
gboolean commit_only = (flags & OSTREE_REPO_PRUNE_FLAGS_COMMIT_ONLY) > 0;
if (commit_only)
@@ -526,14 +500,13 @@ ostree_repo_prune_from_reachable (OstreeRepo *self,
}
else
{
- objects =
- ostree_repo_list_objects_set (self, OSTREE_REPO_LIST_OBJECTS_ALL | OSTREE_REPO_LIST_OBJECTS_NO_PARENTS,
- cancellable, error);
+ objects = ostree_repo_list_objects_set (
+ self, OSTREE_REPO_LIST_OBJECTS_ALL | OSTREE_REPO_LIST_OBJECTS_NO_PARENTS, cancellable,
+ error);
}
if (!objects)
return FALSE;
- return repo_prune_internal (self, objects, options, out_objects_total,
- out_objects_pruned, out_pruned_object_size_total,
- cancellable, error);
+ return repo_prune_internal (self, objects, options, out_objects_total, out_objects_pruned,
+ out_pruned_object_size_total, cancellable, error);
}