]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
utils/cache_gc: utilize kr_cdb_api::check_health()
authorVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 14 Aug 2020 14:47:13 +0000 (16:47 +0200)
committerPetr Špaček <petr.spacek@nic.cz>
Mon, 7 Sep 2020 15:45:57 +0000 (17:45 +0200)
Now it should keep working if the file has been replaced.

utils/cache_gc/db.c
utils/cache_gc/db.h
utils/cache_gc/kr_cache_gc.c
utils/cache_gc/main.c

index 2fd0ed172ff25a4274db628c13e7c1e61294e7f9..8acdafe71fc1229cbf46cdb0ecdd035c52008bd7 100644 (file)
@@ -4,7 +4,7 @@
 #include "db.h"
 
 #include "lib/cache/cdb_lmdb.h"
-#include <lib/cache/impl.h>
+#include "lib/cache/impl.h"
 //#include <lib/defines.h>
 
 #include <ctype.h>             //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);
index 0b7cef0a3aa1550d448ee57d3febfefdcc7393aa..5167d75a590517ea4f7e53a312a79206ee6ba813 100644 (file)
@@ -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,
index ca76eb1e9ff0e24058246238f3542c4799679384..787344d8cad6b13dfd936b19784b8361f000440c 100644 (file)
@@ -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;
index efb25c20007f7c8f73a5a1bf36c309612dfce121..31c9bf641d056840e7efbe4332001c5d2f94959a 100644 (file)
@@ -5,7 +5,8 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-#include <lib/defines.h>
+#include "lib/defines.h"
+#include "lib/utils.h"
 #include <libknot/libknot.h>
 
 #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 {