]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/cache: open with generic storage options
authorMarek Vavruša <marek.vavrusa@nic.cz>
Fri, 1 May 2015 15:49:05 +0000 (17:49 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 2 May 2015 18:00:48 +0000 (20:00 +0200)
the api is still a global variable, but it would be the
best if the namedb_t carried the pointer to the api,
so it needs to change in libknot later

lib/cache.c
lib/cache.h
tests/test_cache.c
tests/test_integration.c
tests/test_map.c
tests/test_rplan.c
tests/test_zonecut.c

index 18499807857b4396fe54f6fcb26f2f64588077f2..149bace9b6355a553b35c6fd2efb118a467d5dac 100644 (file)
 /* Key size */
 #define KEY_SIZE (sizeof(uint8_t) + KNOT_DNAME_MAXLEN + sizeof(uint16_t))
 
-/** Used cache storage engine (default LMDB) */
+/**
+ * Used cache storage engine (default LMDB)
+ * @todo namedb_t should change so it always contains a pointer
+ *       to its API, so it can be carried around instead of keeping it in a
+ *       global variable.
+ */
 const namedb_api_t *(*kr_cache_storage)(void) = namedb_lmdb_api;
 #define db_api kr_cache_storage()
 
-/** Generic storage options */
-union storage_opts {
-       struct namedb_lmdb_opts lmdb;
-};
-
-namedb_t *kr_cache_open(const char *handle, mm_ctx_t *mm, size_t maxsize)
+namedb_t *kr_cache_open(void *opts, mm_ctx_t *mm)
 {
-       if (!handle || maxsize == 0) {
-               return NULL;
-       }
-
-       union storage_opts opts;
-       memset(&opts, 0, sizeof(opts));
-       if (db_api == namedb_lmdb_api()) {
-               opts.lmdb.mapsize = maxsize;
-               opts.lmdb.path = handle;
-       }
-
        namedb_t *db = NULL;
-       int ret = db_api->init(&db, mm, &opts);
+       int ret = db_api->init(&db, mm, opts);
        if (ret != 0) {
                return NULL;
        }
index f8267c662ebcc0fe09ff579db78495104bc8073e..d5070dca42828fb992a9a9a7563f80a53a246ca0 100644 (file)
@@ -37,17 +37,22 @@ struct kr_cache_entry
        uint8_t  data[];
 };
 
-/** Used storage API for cache (default LMDB) */
+/** Used storage backend for cache (default LMDB) */
 extern const namedb_api_t *(*kr_cache_storage)(void);
 
+/** Replace used cache storage backend. */
+static inline void kr_cache_storage_set(const namedb_api_t *(*api)(void))
+{
+       kr_cache_storage = api;
+}
+
 /**
- * Open/create persistent cache in given path.
- * @param handle Configuration string (e.g. path to existing directory where the DB should be created)
+ * Open/create cache with provided storage options.
+ * @param storage_opts Storage-specific options (may be NULL for default)
  * @param mm Memory context.
- * @param maxsize Maximum database size (bytes)
  * @return database instance or NULL
  */
-namedb_t *kr_cache_open(const char *handle, mm_ctx_t *mm, size_t maxsize);
+namedb_t *kr_cache_open(void *storage_opts, mm_ctx_t *mm);
 
 /**
  * Close persistent cache.
@@ -81,7 +86,7 @@ void kr_cache_txn_abort(namedb_txn_t *txn);
 
 /**
  * Peek the cache for asset (name, type, tag)
- * @note The 'drift' is the time passed between the cache time of the RRSet and now (in seconds).
+ * @note The 'drift' is the time passed between the inception time and now (in seconds).
  * @param txn transaction instance
  * @param tag  asset tag
  * @param name asset name
index 93e964e220bce96cd6216b692d4c5cc6b838d40e..a72e98b9b0c5df26ebfb1f06c6c8c9b80647b26c 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include <libknot/internal/mempool.h>
+#include <libknot/internal/namedb/namedb_lmdb.h>
 
 #include "tests/test.h"
 #include "lib/cache.h"
@@ -32,8 +33,6 @@ const char *global_env;
 /* Test invalid parameters. */
 static void test_invalid(void **state)
 {
-       assert_null((void *)kr_cache_open(NULL, NULL, 0));
-       assert_null((void *)kr_cache_open(global_env, NULL, 0));
        assert_int_not_equal(kr_cache_txn_begin(NULL, &global_txn, 0), 0);
        assert_int_not_equal(kr_cache_txn_begin(&global_env, NULL, 0), 0);
        assert_int_not_equal(kr_cache_txn_commit(NULL), 0);
@@ -50,7 +49,11 @@ static void test_invalid(void **state)
 /* Test cache open */
 static void test_open(void **state)
 {
-       *state = kr_cache_open(global_env, &global_mm, CACHE_SIZE);
+       struct namedb_lmdb_opts opts;
+       memset(&opts, 0, sizeof(opts));
+       opts.path = global_env;
+       opts.mapsize = CACHE_SIZE;
+       *state = kr_cache_open(&opts, &global_mm);
        assert_non_null(*state);
 }
 
index 33b7a999d16f8b028bd9c1910e443a8c43a568f0..6a23ff3cd6eefdb40adec1a3e06ac2b83b131aae 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include <Python.h>
+#include <libknot/internal/namedb/namedb_lmdb.h>
 
 #include "tests/test.h"
 #include "lib/rplan.h"
@@ -67,7 +68,11 @@ static PyObject* init(PyObject* self, PyObject* args)
 
        global_tmpdir = test_tmpdir_create();
        assert(global_tmpdir);
-       global_context.cache = kr_cache_open(global_tmpdir, &global_mm, 100 * 4096);
+       struct namedb_lmdb_opts opts;
+       memset(&opts, 0, sizeof(opts));
+       opts.path = global_tmpdir;
+       opts.mapsize = 100 * 4096;
+       global_context.cache = kr_cache_open(&opts, &global_mm);
        assert(global_context.cache);
 
        /* No configuration parsing support yet. */
index 0bb94031b8f24f08e0e84f007bd5afeaef058a16..a7693e3d76c7b3d410c696dff777ff1d872fb3c3 100644 (file)
@@ -72,11 +72,11 @@ static void test_get(void **state)
        in = malloc(strlen(dict[23])+1);
        strcpy(in, dict[23]);
 
-       assert_int_equal(map_get(tree, in), dict[23]);
-       assert_int_equal(map_get(tree, notin), NULL);
-       assert_int_equal(map_get(tree, ""), NULL);
+       assert_true(map_get(tree, in) == dict[23]);
+       assert_true(map_get(tree, notin) == NULL);
+       assert_true(map_get(tree, "") == NULL);
        in[strlen(in)/2] = '\0';
-       assert_int_equal(map_get(tree, in), NULL);
+       assert_true(map_get(tree, in) == NULL);
 
        free(in);
 }
index 8a8d5d6496eea186f13bab234b7c28bb4e7791f2..d5eb1faba75dd4c6b46365391910e1cfc5344404 100644 (file)
@@ -23,20 +23,20 @@ static void test_rplan_params(void **state)
        /* NULL rplan */
 
        assert_int_equal(kr_rplan_init(NULL, NULL, NULL), KNOT_EINVAL);
-       assert_null(kr_rplan_push(NULL, NULL, NULL, 0, 0));
+       assert_null((void *)kr_rplan_push(NULL, NULL, NULL, 0, 0));
        assert_int_equal(kr_rplan_pop(NULL, NULL), KNOT_EINVAL);
-       assert_true(kr_rplan_empty(NULL));
-       assert_null(kr_rplan_current(NULL));
+       assert_true(kr_rplan_empty(NULL) == true);
+       assert_null((void *)kr_rplan_current(NULL));
        kr_rplan_deinit(NULL);
 
        /* NULL mandatory parameters */
 
        struct kr_rplan rplan;
        assert_int_equal(kr_rplan_init(&rplan, NULL, NULL), KNOT_EOK);
-       assert_null(kr_rplan_push(&rplan, NULL, NULL, 0, 0));
+       assert_null((void *)kr_rplan_push(&rplan, NULL, NULL, 0, 0));
        assert_int_equal(kr_rplan_pop(&rplan, NULL), KNOT_EINVAL);
-       assert_true(kr_rplan_empty(&rplan));
-       assert_null(kr_rplan_current(&rplan));
+       assert_true(kr_rplan_empty(&rplan) == true);
+       assert_null((void *)kr_rplan_current(&rplan));
        kr_rplan_deinit(&rplan);
 }
 
@@ -52,7 +52,7 @@ static void test_rplan_push(void **state)
        kr_rplan_init(&rplan, &context, &mm);
 
        /* Push query. */
-       assert_non_null(kr_rplan_push(&rplan, NULL, (knot_dname_t *)"", 0, 0));
+       assert_non_null((void *)kr_rplan_push(&rplan, NULL, (knot_dname_t *)"", 0, 0));
 
        kr_rplan_deinit(&rplan);
 }
index d2e0eb6c1fd5f16f03c0c5f9e44d9e36d6df1064..18452749aa76f8252f59a5a8c80d592066484033 100644 (file)
@@ -27,8 +27,8 @@ static void test_zonecut_params(void **state)
        kr_zonecut_set(NULL, NULL);
        kr_zonecut_set(&cut, NULL);
        assert_int_not_equal(kr_zonecut_add(NULL, NULL, NULL), 0);
-       assert_null(kr_zonecut_find(NULL, NULL));
-       assert_null(kr_zonecut_find(&cut, NULL));
+       assert_null((void *)kr_zonecut_find(NULL, NULL));
+       assert_null((void *)kr_zonecut_find(&cut, NULL));
        assert_int_not_equal(kr_zonecut_set_sbelt(NULL), 0);
        assert_int_not_equal(kr_zonecut_find_cached(NULL, NULL, 0), 0);
 }