From c1db6b2238c728aee982fd65ef7037d6489c3084 Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Tue, 31 Jan 2023 14:44:26 +0200 Subject: cache: fix 'clean' to prune static cache always Fix cache applet to prune the static cache which is used for index files if explicit caching is not enabled. fixes #10754 --- src/apk_database.h | 4 ++-- src/app_cache.c | 30 ++++++++++++++++-------------- src/database.c | 17 ++++++++++++----- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/apk_database.h b/src/apk_database.h index aa0145b..a0a62ca 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -259,10 +259,10 @@ int apk_cache_download(struct apk_database *db, struct apk_repository *repo, struct apk_package *pkg, int verify, int autoupdate, apk_progress_cb cb, void *cb_ctx); -typedef void (*apk_cache_item_cb)(struct apk_database *db, +typedef void (*apk_cache_item_cb)(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg); -int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb); +int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb, int static_cache); int apk_db_install_pkg(struct apk_database *db, struct apk_package *oldpkg, diff --git a/src/app_cache.c b/src/app_cache.c index 09d9adf..7239faa 100644 --- a/src/app_cache.c +++ b/src/app_cache.c @@ -142,19 +142,20 @@ static int cache_download(struct cache_ctx *cctx, struct apk_database *db, struc return ret; } -static void cache_clean_item(struct apk_database *db, int dirfd, const char *name, struct apk_package *pkg) +static void cache_clean_item(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg) { char tmp[PATH_MAX]; apk_blob_t b; int i; - if (strcmp(name, "installed") == 0) return; - - if (pkg) { - if ((apk_flags & APK_PURGE) && pkg->ipkg == NULL) goto delete; - if (pkg->repos & db->local_repos & ~BIT(APK_REPOSITORY_CACHED)) goto delete; - if (pkg->ipkg == NULL && !(pkg->repos & ~BIT(APK_REPOSITORY_CACHED))) goto delete; - return; + if (!static_cache) { + if (strcmp(name, "installed") == 0) return; + if (pkg) { + if ((apk_flags & APK_PURGE) && pkg->ipkg == NULL) goto delete; + if (pkg->repos & db->local_repos & ~BIT(APK_REPOSITORY_CACHED)) goto delete; + if (pkg->ipkg == NULL && !(pkg->repos & ~BIT(APK_REPOSITORY_CACHED))) goto delete; + return; + } } b = APK_BLOB_STR(name); @@ -175,7 +176,11 @@ delete: static int cache_clean(struct apk_database *db) { - return apk_db_cache_foreach_item(db, cache_clean_item); + if (apk_db_cache_active(db)) { + int r = apk_db_cache_foreach_item(db, cache_clean_item, 0); + if (r) return r; + } + return apk_db_cache_foreach_item(db, cache_clean_item, 1); } static int cache_main(void *ctx, struct apk_database *db, struct apk_string_array *args) @@ -197,11 +202,8 @@ static int cache_main(void *ctx, struct apk_database *db, struct apk_string_arra else return -EINVAL; - if (!apk_db_cache_active(db)) { - apk_error("Package cache is not enabled."); - r = 2; - goto err; - } + if (!apk_db_cache_active(db)) + actions &= CACHE_CLEAN; if ((actions & CACHE_DOWNLOAD) && (cctx->solver_flags || cctx->add_dependencies)) { if (db->repositories.stale || db->repositories.unavailable) { diff --git a/src/database.c b/src/database.c index 7118c64..04eac61 100644 --- a/src/database.c +++ b/src/database.c @@ -1391,7 +1391,7 @@ static char *find_mountpoint(int atfd, const char *rel_path) return ret; } -static void mark_in_cache(struct apk_database *db, int dirfd, const char *name, struct apk_package *pkg) +static void mark_in_cache(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg) { if (pkg == NULL) return; @@ -1722,7 +1722,7 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts) } if (apk_db_cache_active(db) && (dbopts->open_flags & (APK_OPENF_NO_REPOS|APK_OPENF_NO_INSTALLED)) == 0) - apk_db_cache_foreach_item(db, mark_in_cache); + apk_db_cache_foreach_item(db, mark_in_cache, 0); db->open_complete = 1; @@ -2038,6 +2038,7 @@ int apk_db_cache_active(struct apk_database *db) struct foreach_cache_item_ctx { struct apk_database *db; apk_cache_item_cb cb; + int static_cache; }; static int foreach_cache_file(void *pctx, int dirfd, const char *name) @@ -2067,15 +2068,21 @@ static int foreach_cache_file(void *pctx, int dirfd, const char *name) } } no_pkg: - ctx->cb(db, dirfd, name, pkg); + ctx->cb(db, ctx->static_cache, dirfd, name, pkg); return 0; } -int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb) +int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb, int static_cache) { - struct foreach_cache_item_ctx ctx = { db, cb }; + struct foreach_cache_item_ctx ctx = { db, cb, static_cache }; + if (static_cache) { + return apk_dir_foreach_file( + openat(db->root_fd, apk_static_cache_dir, O_RDONLY | O_CLOEXEC), + foreach_cache_file, &ctx); + } + if (db->cache_fd < 0) return db->cache_fd; return apk_dir_foreach_file(dup(db->cache_fd), foreach_cache_file, &ctx); } -- cgit v1.2.3-60-g2f50