From fb7e62db24262d080168d81b8a4086f6c9fa5fc0 Mon Sep 17 00:00:00 2001 From: Alexey Kopytov Date: Fri, 31 Mar 2017 13:52:55 +0300 Subject: [PATCH] Allow benchmarks to be specified as a module name, i.e. a require() argument. --- src/sb_lua.c | 29 +++++++++++++++++++++-------- src/sysbench.c | 11 ----------- tests/t/cmd_cleanup.t | 2 +- tests/t/cmd_help.t | 2 +- tests/t/cmd_prepare.t | 2 +- tests/t/cmd_run.t | 2 +- tests/t/cmdline.t | 22 +++++++++++++++++++--- 7 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/sb_lua.c b/src/sb_lua.c index 6e3c46d..0ace19c 100644 --- a/src/sb_lua.c +++ b/src/sb_lua.c @@ -766,22 +766,35 @@ static lua_State *sb_lua_new_state(void) if (load_internal_scripts(L)) return NULL; - if (luaL_loadfile(L, sbtest.lname)) - { - lua_error(L); - return NULL; - } + int rc; - if (lua_pcall(L, 0, 0, 0)) + if ((rc = luaL_loadfile(L, sbtest.lname)) != 0) { - lua_error(L); - return NULL; + if (rc != LUA_ERRFILE) + goto loaderr; + + /* Try to handle the given string as a module name */ + lua_getglobal(L, "require"); + lua_pushstring(L, sbtest.lname); + if (lua_pcall(L, 1, 0, 0)) + { + log_text(LOG_FATAL, "Cannot find benchmark '%s': no such built-in test, " + "file or module", sbtest.lname); + return NULL; + } } + else if (lua_pcall(L, 0, 0, 0)) + goto loaderr; /* Create new L context */ tls_lua_ctxt.L = L; return L; + +loaderr: + lua_error(L); + + return NULL; } /* Close interpreter state */ diff --git a/src/sysbench.c b/src/sysbench.c index 5d69a96..6ae220b 100644 --- a/src/sysbench.c +++ b/src/sysbench.c @@ -1468,19 +1468,8 @@ int main(int argc, char *argv[]) if (test == NULL) { - /* Is it a path? */ - if (access(sb_globals.testname, R_OK)) - { - fprintf(stderr, "Cannot find script %s: %s\n", sb_globals.testname, - strerror(errno)); - return EXIT_FAILURE; - } - if ((test = sb_load_lua(sb_globals.testname)) == NULL) - { - fprintf(stderr, "Script execution failed"); return EXIT_FAILURE; - } if (sb_globals.cmdname == NULL) { diff --git a/tests/t/cmd_cleanup.t b/tests/t/cmd_cleanup.t index 0e2ea0b..d9605fb 100644 --- a/tests/t/cmd_cleanup.t +++ b/tests/t/cmd_cleanup.t @@ -1,7 +1,7 @@ $ sysbench cleanup sysbench * (glob) - Cannot find script cleanup: No such file or directory + FATAL: Cannot find benchmark 'cleanup': no such built-in test, file or module [1] $ cat >cmd_cleanup.lua <cmd_help.lua <cmd_prepare.lua <cmd_run.lua < EOF sysbench * (glob) - Cannot find script run: No such file or directory + FATAL: Cannot find benchmark 'run': no such built-in test, file or module [1] $ cat >$CRAMTMP/cmdline.lua < cmdline_module.lua < print("cmdline_module loaded") + > function event() + > print("cmdline_module event") + > end + > EOF + + $ LUA_PATH="$PWD/?.lua;$LUA_PATH" sysbench cmdline_module --verbosity=0 + cmdline_module loaded + + $ LUA_PATH="$PWD/?.lua;$LUA_PATH" sysbench cmdline_module --events=1 --verbosity=0 run + cmdline_module loaded + cmdline_module loaded + cmdline_module event