From: Vladimír Čunát Date: Fri, 14 Aug 2020 14:47:13 +0000 (+0200) Subject: utils/cache_gc: utilize kr_cdb_api::check_health() X-Git-Tag: v5.1.3~1^2~23 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fd6d544a30bb753c1da6f5dfdca9717050df3bb0;p=thirdparty%2Fknot-resolver.git utils/cache_gc: utilize kr_cdb_api::check_health() Now it should keep working if the file has been replaced. --- diff --git a/utils/cache_gc/db.c b/utils/cache_gc/db.c index 2fd0ed172..8acdafe71 100644 --- a/utils/cache_gc/db.c +++ b/utils/cache_gc/db.c @@ -4,7 +4,7 @@ #include "db.h" #include "lib/cache/cdb_lmdb.h" -#include +#include "lib/cache/impl.h" //#include #include //DEBUG @@ -43,6 +43,25 @@ int kr_gc_cache_open(const char *cache_path, struct kr_cache *kres_db, return 0; } +int kr_gc_cache_check_health(struct kr_cache *kres_db, knot_db_t ** libknot_db) +{ + int ret = kr_cdb_lmdb()->check_health(kres_db->db, &kres_db->stats); + if (ret == 0) { + return 0; + } else if (ret != 1) { + kr_gc_cache_close(kres_db, *libknot_db); + return ret; + } + /* Cache was reopen. */ + free(*libknot_db); + *libknot_db = knot_db_t_kres2libknot(kres_db->db); + if (*libknot_db == NULL) { + printf("Out of memory.\n"); + return -ENOMEM; + } + return 0; +} + void kr_gc_cache_close(struct kr_cache *kres_db, knot_db_t * knot_db) { free(knot_db); diff --git a/utils/cache_gc/db.h b/utils/cache_gc/db.h index 0b7cef0a3..5167d75a5 100644 --- a/utils/cache_gc/db.h +++ b/utils/cache_gc/db.h @@ -9,6 +9,8 @@ int kr_gc_cache_open(const char *cache_path, struct kr_cache *kres_db, knot_db_t ** libknot_db); +int kr_gc_cache_check_health(struct kr_cache *kres_db, knot_db_t ** libknot_db); + void kr_gc_cache_close(struct kr_cache *kres_db, knot_db_t * knot_db); typedef int (*kr_gc_iter_callback)(const knot_db_val_t * key, diff --git a/utils/cache_gc/kr_cache_gc.c b/utils/cache_gc/kr_cache_gc.c index ca76eb1e9..787344d8c 100644 --- a/utils/cache_gc/kr_cache_gc.c +++ b/utils/cache_gc/kr_cache_gc.c @@ -162,18 +162,21 @@ void kr_cache_gc_free_state(kr_cache_gc_state_t **state) int kr_cache_gc(kr_cache_gc_cfg_t *cfg, kr_cache_gc_state_t **state) { assert(cfg && state); + int ret; if (!*state) { // Cache not open -> do that. *state = calloc(1, sizeof(**state)); if (!*state) { return KNOT_ENOMEM; } - int ret = kr_gc_cache_open(cfg->cache_path, &(*state)->kres_db, + ret = kr_gc_cache_open(cfg->cache_path, &(*state)->kres_db, &(*state)->db); - if (ret) { - free(*state); - *state = NULL; - return ret; - } + } else { // To be sure, we guard against the file getting replaced. + ret = kr_gc_cache_check_health(&(*state)->kres_db, &(*state)->db); + } + if (ret) { + free(*state); + *state = NULL; + return ret; } knot_db_t *const db = (*state)->db; // frequently used shortcut @@ -202,7 +205,7 @@ int kr_cache_gc(kr_cache_gc_cfg_t *cfg, kr_cache_gc_state_t **state) gc_timer_start(&timer_analyze); ctx_compute_categories_t cats = { { 0 } }; - int ret = kr_gc_cache_iter(db, cb_compute_categories, &cats); + ret = kr_gc_cache_iter(db, cb_compute_categories, &cats); if (ret != KNOT_EOK) { kr_cache_gc_free_state(state); return ret; diff --git a/utils/cache_gc/main.c b/utils/cache_gc/main.c index efb25c200..31c9bf641 100644 --- a/utils/cache_gc/main.c +++ b/utils/cache_gc/main.c @@ -5,7 +5,8 @@ #include #include -#include +#include "lib/defines.h" +#include "lib/utils.h" #include #include "kresconfig.h" @@ -122,6 +123,10 @@ int main(int argc, char *argv[]) return 1; } +#ifdef DEBUG + kr_verbose_set(true); // used inside cache operations +#endif + int exit_code = 0; kr_cache_gc_state_t *gc_state = NULL; do {