diff options
Diffstat (limited to 'src/libostree/ostree-repo-prune.c')
-rw-r--r-- | src/libostree/ostree-repo-prune.c | 221 |
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); } |