From 3f3848f78e3379e15cb814edd4eb9eb0ea831369 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Vavru=C5=A1a?= Date: Thu, 2 Jul 2015 22:09:22 +0200 Subject: [PATCH] prefetch wip --- daemon/ffimodule.c | 4 ++-- modules/modules.mk | 3 ++- modules/prefetch/README.rst | 4 ++++ modules/prefetch/prefetch.lua | 45 +++++++++++++++++++++++++++++++++++ modules/prefetch/prefetch.mk | 2 ++ 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 modules/prefetch/README.rst create mode 100644 modules/prefetch/prefetch.lua create mode 100644 modules/prefetch/prefetch.mk diff --git a/daemon/ffimodule.c b/daemon/ffimodule.c index 902991552..c6cc77883 100644 --- a/daemon/ffimodule.c +++ b/daemon/ffimodule.c @@ -180,8 +180,8 @@ static int l_ffi_layer_consume(knot_layer_t *ctx, knot_pkt_t *pkt) static int l_ffi_layer_produce(knot_layer_t *ctx, knot_pkt_t *pkt) { - if (ctx->state & (KNOT_STATE_FAIL|KNOT_STATE_DONE)) { - return ctx->state; /* Already resolved/failed, skip */ + if (ctx->state & (KNOT_STATE_FAIL)) { + return ctx->state; /* Already failed, skip */ } LAYER_FFI_CALL(ctx, "produce"); lua_pushlightuserdata(L, ctx->data); diff --git a/modules/modules.mk b/modules/modules.mk index 171771459..583e842f3 100644 --- a/modules/modules.mk +++ b/modules/modules.mk @@ -16,7 +16,8 @@ endif ifeq ($(HAS_lua),yes) modules_TARGETS += ketcd \ graphite \ - block + block \ + prefetch endif # List of Golang modules diff --git a/modules/prefetch/README.rst b/modules/prefetch/README.rst new file mode 100644 index 000000000..fefb476d9 --- /dev/null +++ b/modules/prefetch/README.rst @@ -0,0 +1,4 @@ +.. _mod-prefetch: + +Prefetching +----------- diff --git a/modules/prefetch/prefetch.lua b/modules/prefetch/prefetch.lua new file mode 100644 index 000000000..4035cad4a --- /dev/null +++ b/modules/prefetch/prefetch.lua @@ -0,0 +1,45 @@ +local prefetch = { + queue = {}, + frequency = 2 +} + +-- @function Block layer implementation +prefetch.layer = { + produce = function(state, req, pkt) + -- Schedule cached entries that are expiring soon + local qry = kres.query_current(req) + if not kres.query_has_flag(qry, kres.query.CACHED) then + return state + end + local rr = pkt:get(kres.ANSWER, 0) + if rr and rr.ttl > 0 and rr.ttl < prefetch.frequency then + local key = rr.owner..rr.type + local val = prefetch.queue[key] + if not val then + prefetch.queue[key] = 1 + else + prefetch.queue[key] = val + 1 + end + end + return state + end +} + +function prefetch.batch(module) + for key, val in pairs(prefetch.queue) do + print('prefetching',key,val) + end + prefetch.queue = {} + -- @TODO: next batch interval + event.after(prefetch.frequency * sec, prefetch.batch) +end + +function prefetch.init(module) + event.after(prefetch.frequency * sec, prefetch.batch) +end + +function prefetch.deinit(module) + if prefetch.ev then event.cancel(prefetch.ev) end +end + +return prefetch diff --git a/modules/prefetch/prefetch.mk b/modules/prefetch/prefetch.mk new file mode 100644 index 000000000..a4867745f --- /dev/null +++ b/modules/prefetch/prefetch.mk @@ -0,0 +1,2 @@ +prefetch_SOURCES := prefetch.lua +$(call make_lua_module,prefetch) -- 2.47.2