return 1;
}
+
+
+/** @internal return cache, or throw lua error if not open */
+struct kr_cache * cache_assert_open(lua_State *L)
+{
+ struct engine *engine = engine_luaget(L);
+ struct kr_cache *cache = &engine->resolver.cache;
+ assert(cache);
+ if (!cache || !kr_cache_is_open(cache)) {
+ format_error(L, "no cache is open yet, use cache.open() or cache.size, etc.");
+ lua_error(L);
+ }
+ return cache;
+}
+
/** Return available cached backends. */
static int cache_backends(lua_State *L)
{
/** Return number of cached records. */
static int cache_count(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- const struct kr_cdb_api *api = engine->resolver.cache.api;
+ struct kr_cache *cache = cache_assert_open(L);
- struct kr_cache *cache = &engine->resolver.cache;
- int count = api->count(cache->db);
- if (kr_cache_is_open(cache) && count >= 0) {
+ int count = cache->api->count(cache->db);
+ if (count >= 0) {
/* First key is a version counter, omit it if nonempty. */
lua_pushinteger(L, count ? count - 1 : 0);
return 1;
/** Return time of last checkpoint, or re-set it if passed `true`. */
static int cache_checkpoint(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
+ struct kr_cache *cache = cache_assert_open(L);
if (lua_gettop(L) == 0) { /* Return the current value. */
lua_newtable(L);
/** Return cache statistics. */
static int cache_stats(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
+ struct kr_cache *cache = cache_assert_open(L);
lua_newtable(L);
lua_pushnumber(L, cache->stats.hit);
lua_setfield(L, -2, "hit");
static int cache_max_ttl(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
+ struct kr_cache *cache = cache_assert_open(L);
int n = lua_gettop(L);
if (n > 0) {
static int cache_min_ttl(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
+ struct kr_cache *cache = cache_assert_open(L);
int n = lua_gettop(L);
if (n > 0) {
/** Prune expired/invalid records. */
static int cache_prune(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
- if (!kr_cache_is_open(cache)) {
- return 0;
- }
-
+ struct kr_cache *cache = cache_assert_open(L);
/* Check parameters */
int prune_max = UINT16_MAX;
int n = lua_gettop(L);
/** Clear all records. */
static int cache_clear(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
- if (!kr_cache_is_open(cache)) {
- return 0;
- }
+ struct kr_cache *cache = cache_assert_open(L);
/* Check parameters */
const char *args = NULL;
}
/* Clear reputation tables */
+ struct engine *engine = engine_luaget(L);
lru_reset(engine->resolver.cache_rtt);
lru_reset(engine->resolver.cache_rep);
lru_reset(engine->resolver.cache_cookie);
/** Query cached records. */
static int cache_get(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
- if (!kr_cache_is_open(cache)) {
- return 0;
- }
+ //struct kr_cache *cache = cache_assert_open(L); // to be fixed soon
/* Check parameters */
int n = lua_gettop(L);
goto finish;
}
- struct engine *engine = engine_luaget(L);
- if (!engine) {
- strncpy(msg, "internal error, empty engine pointer", sizeof(msg));
- goto finish;
- }
- struct kr_cache *cache = &engine->resolver.cache;
- if (!kr_cache_is_open(cache)) {
- strncpy(msg, "cache isn't open", sizeof(msg));
- goto finish;
- }
+ (void)cache_assert_open(L); /* just check it in advance */
/* Check parameters */
int n = lua_gettop(L);
is(cache.min_ttl(), 1, 'stored minimum TTL')
end
--- test if the stats work with reopening the cache
+-- test if the stats work with reopening the cache and operations fail with closed cache
local function test_stats()
ok(cache.close(), 'cache can be closed')
boom(cache.open, {100 * MB, 'invalid://'}, 'cache cannot be opened with invalid backend')
+
+ boom(cache.clear, {}, '.clear() does not work on closed cache')
+ boom(cache.count, {}, '.count() does not work on closed cache')
+ boom(cache.get, { 'key' }, '.get(...) does not work on closed cache')
+
ok(cache.open(100 * MB), 'cache can be reopened')
local s = cache.stats()
is(type(s), 'table', 'stats returns a table')