]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
WIP: db_usage API
authorVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 4 May 2021 17:06:54 +0000 (19:06 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 4 May 2021 17:06:54 +0000 (19:06 +0200)
lib/cache/cdb_lmdb.c

index db0f162fea4783f383d241758e74c2bd6f33f3d8..8cc30e222eb783af81d8620cc9e30532ffc0cf91 100644 (file)
@@ -904,19 +904,35 @@ failure:
        return lmdb_error(ret);
 }
 
-static double cdb_usage_percent(kr_cdb_pt db)
+static size_t cdb_get_maxsize(kr_cdb_pt db)
 {
-       knot_db_t *kdb = kr_cdb_pt2knot_db_t(db);
-       const size_t db_size = knot_db_lmdb_get_mapsize(kdb);
-       const size_t db_usage_abs = knot_db_lmdb_get_usage(kdb);
-       const double db_usage = (double)db_usage_abs / db_size * 100.0;
-       free(kdb);
-       return db_usage;
+       return db2env(db)->mapsize;
 }
 
-static size_t cdb_get_maxsize(kr_cdb_pt db)
+static double cdb_usage_percent(kr_cdb_pt db)
 {
-       return db2env(db)->mapsize;
+       const double ERROR = 0.0; // LATER: we might do errors differently
+       struct lmdb_env *env = db2env(db);
+       if (refresh_mapsize(env) != kr_ok())
+               return ERROR;
+
+       MDB_txn *txn = NULL;
+       if (txn_get(env, &txn, true) != kr_ok())
+               return ERROR;
+       MDB_stat st;
+#if KR_USE_MDBX
+       int ret = mdbx_env_stat_ex(env->env, txn, &st, sizeof(st));
+#else
+       int ret = mdb_stat(txn, env->dbi, &st);
+#endif
+       txn_free_ro(env); // not really needed, but let's keep the API simpler
+       if (ret != MDB_SUCCESS)
+               return ERROR;
+
+       // "algorithm" copied from knot_db_lmdb_get_usage()
+       const size_t db_usage_abs = st.ms_psize
+               * (st.ms_branch_pages + st.ms_leaf_pages + st.ms_overflow_pages);
+       return (double)db_usage_abs / cdb_get_maxsize(db) * 100.0;
 }
 
 /** Conversion between knot and lmdb structs. */