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