From 0e63f18a73754ebf68ebf286a95af222ab058538 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 4 Jul 2022 01:06:57 +0200 Subject: [PATCH] Add utility script to stress-test mapgen --- util/helper_mod/init.lua | 51 ++++++++++++++++++++++++++++++++++++++++ util/helper_mod/mod.conf | 3 +++ util/stress_mapgen.sh | 30 +++++++++++++++++++++++ util/test_multiplayer.sh | 27 ++++----------------- 4 files changed, 89 insertions(+), 22 deletions(-) create mode 100644 util/helper_mod/init.lua create mode 100644 util/helper_mod/mod.conf create mode 100755 util/stress_mapgen.sh diff --git a/util/helper_mod/init.lua b/util/helper_mod/init.lua new file mode 100644 index 000000000..4da832ed7 --- /dev/null +++ b/util/helper_mod/init.lua @@ -0,0 +1,51 @@ +local mode = core.settings:get("helper_mode") + +if mode == "devtest" then + + -- Provide feedback to script by creating files in world path + core.after(0, function() + io.close(io.open(core.get_worldpath() .. "/startup", "w")) + end) + local function callback(test_ok) + if not test_ok then + io.close(io.open(core.get_worldpath() .. "/test_failure", "w")) + end + io.close(io.open(core.get_worldpath() .. "/done", "w")) + core.request_shutdown("", false, 2) + end + -- If tests are enabled exit when they're done, otherwise exit on player join + if core.settings:get_bool("devtest_unittests_autostart") and core.global_exists("unittests") then + unittests.on_finished = callback + else + core.register_on_joinplayer(function() callback(true) end) + end + +elseif mode == "mapgen" then + + -- Stress-test mapgen by constantly generating new area + local csize = tonumber(core.settings:get("chunksize")) * core.MAP_BLOCKSIZE + local MINP, MAXP = vector.new(0, -csize, 0), vector.new(csize*3, csize*2, csize) + local DIR = "x" + local pstart = vector.new(0, 0, 0) + local next_, callback + next_ = function(arg) + print("emerging " .. core.pos_to_string(pstart)) + core.emerge_area( + vector.add(pstart, MINP), vector.add(pstart, MAXP), + callback, arg + ) + end + local trig = {} + callback = function(blockpos, action, calls_rem, n) + if action == core.EMERGE_CANCELLED or action == core.EMERGE_ERRORED then + return + end + if calls_rem <= 20 and not trig[n] then + trig[n] = true + pstart[DIR] = pstart[DIR] + (MAXP[DIR] - MINP[DIR]) + next_(n + 1) + end + end + core.after(0, next_, 1) + +end diff --git a/util/helper_mod/mod.conf b/util/helper_mod/mod.conf new file mode 100644 index 000000000..efdd9eaf3 --- /dev/null +++ b/util/helper_mod/mod.conf @@ -0,0 +1,3 @@ +name = helper_mod +description = Helper used by various test scripts +optional_depends = unittests diff --git a/util/stress_mapgen.sh b/util/stress_mapgen.sh new file mode 100755 index 000000000..ba152dd80 --- /dev/null +++ b/util/stress_mapgen.sh @@ -0,0 +1,30 @@ +#!/bin/bash +dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +gameid=${gameid:-devtest} +minetest=$dir/../bin/minetest +testspath=$dir/../tests +conf_server=$testspath/server.conf +worldpath=$testspath/world + +run () { + if [ -n "$PERF" ]; then + perf record -z --call-graph dwarf -- "$@" + else + "$@" + fi +} + +[ -e $minetest ] || { echo "executable $minetest missing"; exit 1; } + +rm -rf $worldpath +mkdir -p $worldpath/worldmods + +settings=(sqlite_synchronous=0 helper_mode=mapgen) +[ -n "$PROFILER" ] && settings+=(profiler_print_interval=15) +printf '%s\n' "${settings[@]}" >$testspath/server.conf \ + +ln -s $dir/helper_mod $worldpath/worldmods/ + +args=(--config $conf_server --world $worldpath --gameid $gameid) +[ -n "$PROFILER" ] && args+=(--verbose) +run $minetest --server "${args[@]}" diff --git a/util/test_multiplayer.sh b/util/test_multiplayer.sh index 5ffc044e0..e0d0ec742 100755 --- a/util/test_multiplayer.sh +++ b/util/test_multiplayer.sh @@ -1,6 +1,6 @@ #!/bin/bash dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -gameid=devtest +gameid=${gameid:-devtest} minetest=$dir/../bin/minetest testspath=$dir/../tests conf_client1=$testspath/client1.conf @@ -26,34 +26,17 @@ gdbrun () { [ -e $minetest ] || { echo "executable $minetest missing"; exit 1; } rm -rf $worldpath -mkdir -p $worldpath/worldmods/test +mkdir -p $worldpath/worldmods printf '%s\n' >$testspath/client1.conf \ video_driver=null name=client1 viewing_range=10 \ enable_{sound,minimap,shaders}=false printf '%s\n' >$testspath/server.conf \ - max_block_send_distance=1 devtest_unittests_autostart=true + max_block_send_distance=1 devtest_unittests_autostart=true \ + helper_mode=devtest -cat >$worldpath/worldmods/test/init.lua <<"LUA" -core.after(0, function() - io.close(io.open(core.get_worldpath() .. "/startup", "w")) -end) -local function callback(test_ok) - if not test_ok then - io.close(io.open(core.get_worldpath() .. "/test_failure", "w")) - end - io.close(io.open(core.get_worldpath() .. "/done", "w")) - core.request_shutdown("", false, 2) -end -if core.settings:get_bool("devtest_unittests_autostart") then - unittests.on_finished = callback -else - core.register_on_joinplayer(function() callback(true) end) -end -LUA -printf '%s\n' >$worldpath/worldmods/test/mod.conf \ - name=test optional_depends=unittests +ln -s $dir/helper_mod $worldpath/worldmods/ echo "Starting server" gdbrun $minetest --server --config $conf_server --world $worldpath --gameid $gameid 2>&1 | sed -u 's/^/(server) /' &