From 901d4f3ccd0a52ae9d898e5cfd8c3de4a87b6c10 Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Fri, 10 Sep 2010 16:37:39 +0000 Subject: [PATCH] Move more logic from lua code up into the C plugin for easier use --- contribs/lua/job_submit.lua | 13 ++--- src/plugins/job_submit/lua/job_submit_lua.c | 55 +++++++++++++++++++-- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/contribs/lua/job_submit.lua b/contribs/lua/job_submit.lua index 1e70fbd320d..815b79a397b 100644 --- a/contribs/lua/job_submit.lua +++ b/contribs/lua/job_submit.lua @@ -3,8 +3,8 @@ Example lua script demonstrating the SLURM job_submit/lua interface. This is only an example, not meant for use in its current form. Leave the function names, arguments, local varialbes and setmetatable - set up logic in each function unchanged. Change only the logic after - the "*** YOUR LOGIC GOES BELOW ***". + set up logic in each function unchanged. Change only the logic after + the line containing "*** YOUR LOGIC GOES BELOW ***". --]] @@ -16,8 +16,7 @@ require "posix" -- --########################################################################-- -function slurm_job_submit ( job_desc_addr, part_list ) - local job_desc = { job_desc_ptr=job_desc_addr } +function slurm_job_submit ( job_desc, part_list ) setmetatable (job_desc, job_req_meta) local part_rec = {} local i = 1 @@ -42,7 +41,7 @@ function slurm_job_submit ( job_desc_addr, part_list ) local last_priority = -1 i = 1 while part_rec[i] do --- log_info("part name[%d]:%s", i, part_rec[i].name) + log_info("part name[%d]:%s", i, part_rec[i].name) if part_rec[i].flag_default ~= 0 then top_priority = -1 break @@ -64,10 +63,8 @@ function slurm_job_submit ( job_desc_addr, part_list ) return end -function slurm_job_modify ( job_desc_addr, job_rec_addr, part_list ) - local job_desc = { job_desc_ptr=job_desc_addr } +function slurm_job_modify ( job_desc, job_rec, part_list ) setmetatable (job_desc, job_req_meta) - local job_rec = { job_rec_ptr=job_rec_addr } setmetatable (job_rec, job_rec_meta) local part_rec = {} local i = 1 diff --git a/src/plugins/job_submit/lua/job_submit_lua.c b/src/plugins/job_submit/lua/job_submit_lua.c index dd6869675a7..1ce6bc4f44d 100644 --- a/src/plugins/job_submit/lua/job_submit_lua.c +++ b/src/plugins/job_submit/lua/job_submit_lua.c @@ -67,6 +67,7 @@ #include "src/common/slurm_xlator.h" #include "src/slurmctld/slurmctld.h" +#define _DEBUG 1 #define MIN_ACCTG_FREQUENCY 30 /* @@ -117,6 +118,36 @@ static pthread_mutex_t lua_lock = PTHREAD_MUTEX_INITIALIZER; * please post it to slurm-dev@lists.llnl.gov Thanks! \*****************************************************************************/ +/* Generic stack dump function for debugging purposes */ +static void _stack_dump (char *header, lua_State *L) +{ +#if _DEBUG + int i; + int top = lua_gettop(L); + + info("%s: dumping job_submit/lua stack, %d elements", header, top); + for (i = 1; i <= top; i++) { /* repeat for each level */ + int type = lua_type(L, i); + switch (type) { + case LUA_TSTRING: + info("string[%d]:%s", i, lua_tostring(L, i)); + break; + case LUA_TBOOLEAN: + info("boolean[%d]:%s", i, + lua_toboolean(L, i) ? "true" : "false"); + break; + case LUA_TNUMBER: + info("number[%d]:%d", i, + (int) lua_tonumber(L, i)); + break; + default: + info("other[%d]:%s", i, lua_typename(L, type)); + break; + } + } +#endif +} + /* * Lua interface to SLURM log facility: */ @@ -628,6 +659,20 @@ static void _push_partition_list(uint32_t user_id, uint32_t submit_uid) list_iterator_destroy(part_iterator); } +static void _push_job_desc(struct job_descriptor *job_desc) +{ + lua_newtable(L); + lua_pushlightuserdata(L, job_desc); + lua_setfield(L, -2, "job_desc_ptr"); +} + +static void _push_job_rec(struct job_record *job_ptr) +{ + lua_newtable(L); + lua_pushlightuserdata (L, job_ptr); + lua_setfield(L, -2, "job_rec_ptr"); +} + /* * NOTE: The init callback should never be called multiple times, * let alone called from multiple threads. Therefore, locking @@ -709,13 +754,15 @@ extern int job_submit(struct job_descriptor *job_desc, uint32_t submit_uid) if (lua_isnil(L, -1)) goto out; - lua_pushlightuserdata (L, job_desc); + _push_job_desc(job_desc); _push_partition_list(job_desc->user_id, submit_uid); + _stack_dump("job_submit, before lua_pcall", L); if (lua_pcall (L, 2, 0, 0) != 0) { error("%s/lua: %s: %s", __func__, lua_script_path, lua_tostring (L, -1)); } else rc = SLURM_SUCCESS; + _stack_dump("job_submit, after lua_pcall", L); out: slurm_mutex_unlock (&lua_lock); return rc; @@ -736,14 +783,16 @@ extern int job_modify(struct job_descriptor *job_desc, if (lua_isnil(L, -1)) goto out; - lua_pushlightuserdata (L, job_desc); - lua_pushlightuserdata (L, job_ptr); + _push_job_desc(job_desc); + _push_job_rec(job_ptr); _push_partition_list(job_ptr->user_id, submit_uid); + _stack_dump("job_modify, before lua_pcall", L); if (lua_pcall (L, 3, 0, 0) != 0) { error("%s/lua: %s: %s", __func__, lua_script_path, lua_tostring (L, -1)); } else rc = SLURM_SUCCESS; + _stack_dump("job_modify, after lua_pcall", L); out: slurm_mutex_unlock (&lua_lock); return rc; -- GitLab