diff --git a/daemon/lua/kres-gen.lua b/daemon/lua/kres-gen.lua index 37743387596be1a4e94a9caa601d1cae12135df7..5b9b69275f56da1caa1680e6e4d4987b8bba812e 100644 --- a/daemon/lua/kres-gen.lua +++ b/daemon/lua/kres-gen.lua @@ -153,6 +153,7 @@ typedef struct { struct kr_rplan { kr_qarray_t pending; kr_qarray_t resolved; + struct kr_query *initial; struct kr_request *request; knot_mm_t *pool; uint32_t next_uid; diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua index bf9bde77315a51c221a791858315bbe59468b60d..1bdc30a31544f9ec6813a6145c7042ebe0760ec8 100644 --- a/daemon/lua/kres.lua +++ b/daemon/lua/kres.lua @@ -766,6 +766,13 @@ ffi.metatype( kr_request_t, { if req.current_query == nil then return nil end return req.current_query end, + -- returns the initial query that started the request + initial = function(req) + assert(ffi.istype(kr_request_t, req)) + local rplan = C.kr_resolve_plan(req) + if rplan.initial == nil then return nil end + return rplan.initial + end, -- Return last query on the resolution plan last = function(req) assert(ffi.istype(kr_request_t, req)) diff --git a/lib/rplan.c b/lib/rplan.c index ae0855121f8119195d86572208a05c0aad2fb4cf..18dc6b8276c0b3186b3ebd130d881b8a643a4a72 100644 --- a/lib/rplan.c +++ b/lib/rplan.c @@ -176,6 +176,12 @@ static struct kr_query *kr_rplan_push_query(struct kr_rplan *rplan, } } + assert((rplan->pending.len == 0 && rplan->resolved.len == 0) + == (rplan->initial == NULL)); + if (rplan->initial == NULL) { + rplan->initial = qry; + } + array_push(rplan->pending, qry); return qry; diff --git a/lib/rplan.h b/lib/rplan.h index 7ac294718e3dd07b6c2fcafe965eb57571c7a7e3..c2888726c1dd51ee839cf9b4a55dadef99a02143 100644 --- a/lib/rplan.h +++ b/lib/rplan.h @@ -121,6 +121,8 @@ struct kr_rplan { as the last is the next one to solve, and they may be inter-dependent. */ kr_qarray_t resolved; /**< List of resolved queries. */ + struct kr_query *initial; /**< The initial query (also in pending or resolved). */ + struct kr_request *request; /**< Parent resolution request. */ knot_mm_t *pool; /**< Temporary memory pool. */ uint32_t next_uid; /**< Next value for kr_query::uid (incremental). */ diff --git a/modules/policy/policy.lua b/modules/policy/policy.lua index b413eb07a6a4914755bdf74af29b972a12cb54c7..23cba3dfcfe7e8618dc790ba8b019e24d7b60d5e 100644 --- a/modules/policy/policy.lua +++ b/modules/policy/policy.lua @@ -880,7 +880,7 @@ policy.layer = { begin = function(state, req) -- Don't act on "finished" cases. if bit.band(state, bit.bor(kres.FAIL, kres.DONE)) ~= 0 then return state end - local qry = req:current() + local qry = req:initial() -- same as :current() but more descriptive return policy.evaluate(policy.rules, req, qry, state) or (special_names_optim(req, qry.sname) and policy.evaluate(policy.special_names, req, qry, state)) @@ -891,7 +891,7 @@ policy.layer = { if #policy.postrules == 0 then return state end -- Don't act on failed cases. if bit.band(state, kres.FAIL) ~= 0 then return state end - return policy.evaluate(policy.postrules, req, req:current(), state) or state + return policy.evaluate(policy.postrules, req, req:initial(), state) or state end }