]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
utils/cache_gc: adapt for faster checking of usage
authorVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 20 Jun 2019 12:57:52 +0000 (14:57 +0200)
committerPetr Špaček <petr.spacek@nic.cz>
Wed, 10 Jul 2019 13:59:22 +0000 (15:59 +0200)
- don't print a line in every checking cycle
- don't exit when cache isn't found
- reduce recommended interval to 10s (compromise)
- don't increase cache size (but keep the code for now)

daemon/README.rst
utils/cache_gc/db.c
utils/cache_gc/db.h
utils/cache_gc/kr_cache_gc.c
utils/cache_gc/main.c

index 8fbb5dbc5b168a8d7ceb45829871282439020f2f..47bb5146f86257b27c6b5304e31878d0b79caa27 100644 (file)
@@ -630,7 +630,7 @@ and configure it to run every minute, use:
 
 .. code-block:: bash
 
-   $ kres_cache_gc -c /var/cache/knot-resolver -d 60000
+   $ kres_cache_gc -c /var/cache/knot-resolver -d 10000
 
 It's also possible to run this under systemd. However, a dedicated systemd unit
 is not currently part of the upstream package. See `message#167`_ on our
index 16f287b816458efc9a7e216c6fc560d8f30863bc..40fba149f7a698b0068dc47a10fd526b0c2591f2 100644 (file)
@@ -35,7 +35,7 @@ static knot_db_t *knot_db_t_kres2libknot(const knot_db_t *db)
        return libknot_db;
 }
 
-int kr_gc_cache_open(const char *cache_path, struct kr_cache *kres_db, knot_db_t **libknot_db, double *usage)
+int kr_gc_cache_open(const char *cache_path, struct kr_cache *kres_db, knot_db_t **libknot_db)
 {
        char cache_data[strlen(cache_path) + 10];
        snprintf(cache_data, sizeof(cache_data), "%s/data.mdb", cache_path);
@@ -64,19 +64,6 @@ open_kr_cache:
                return -ENOMEM;
        }
 
-       size_t real_size = knot_db_lmdb_get_mapsize(*libknot_db), usageb = knot_db_lmdb_get_usage(*libknot_db);
-       *usage = (double)usageb / real_size * 100.0;
-       printf("Cache size: %zu, Usage: %zu (%.2lf%%)\n", real_size, usageb, *usage);
-
-#if 1
-       if (*usage > 90.0) {
-               free(*libknot_db);
-               kr_cache_close(kres_db);
-               cache_size += cache_size / 10;
-               opts.maxsize = cache_size;
-               goto open_kr_cache;
-       }
-# endif
        return 0;
 }
 
index 12e01ec7fac2ec777e9f08b65caf281c5f31f5a2..52a7ee36e470e07eeb998100a3868fe65d6ec802 100644 (file)
@@ -5,7 +5,7 @@
 
 #include "kr_cache_gc.h"
 
-int kr_gc_cache_open(const char *cache_path, struct kr_cache *kres_db, knot_db_t **libknot_db, double *usage);
+int kr_gc_cache_open(const char *cache_path, 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);
 
index 9c6886b34128b875346056d29ba927685f640410..26a0226cc9986621f89e3d01f1e7e4294123b02f 100644 (file)
@@ -143,14 +143,29 @@ int kr_cache_gc(kr_cache_gc_cfg_t *cfg)
 {
        struct kr_cache kres_db = { 0 };
        knot_db_t *db = NULL;
-       double db_usage;
 
-       int ret = kr_gc_cache_open(cfg->cache_path, &kres_db, &db, &db_usage);
+       int ret = kr_gc_cache_open(cfg->cache_path, &kres_db, &db);
        if (ret) {
                return ret;
        }
 
-       if (cfg->dry_run || db_usage < cfg->cache_max_usage) {
+       const size_t db_size = knot_db_lmdb_get_mapsize(db);
+       const size_t db_usage_abs = knot_db_lmdb_get_usage(db);
+       const double db_usage = (double)db_usage_abs / db_size * 100.0;
+#if 0 // Probably not worth it, better reduce the risk by checking more often.
+       if (db_usage > 90.0) {
+               free(*libknot_db);
+               kr_cache_close(kres_db);
+               cache_size += cache_size / 10;
+               opts.maxsize = cache_size;
+               goto open_kr_cache;
+       }
+# endif
+       const bool large_usage = db_usage >= cfg->cache_max_usage;
+       if (cfg->dry_run || large_usage) { // don't print this on every size check
+               printf("Usage: %.2lf%% (%zu / %zu)\n", db_usage, db_usage_abs, db_size);
+       }
+       if (cfg->dry_run || !large_usage) {
                kr_gc_cache_close(&kres_db, db);
                return KNOT_EOK;
        }
index de5da04c33429d6ea4e024392136e4a3cb6da744..ad249dba0b7ab487d577e0debc173912afe63099 100644 (file)
@@ -116,7 +116,8 @@ int main(int argc, char *argv[])
 
        do {
                int ret = kr_cache_gc(&cfg);
-               if (ret) {
+               // ENOENT: kresd may not be started yet or cleared the cache now
+               if (ret && ret != -ENOENT) {
                        printf("Error (%s)\n", kr_strerror(ret));
                        return 10;
                }