]> git.lizzy.rs Git - minetest.git/commitdiff
Add utility script to stress-test mapgen
authorsfan5 <sfan5@live.de>
Sun, 3 Jul 2022 23:06:57 +0000 (01:06 +0200)
committerGitHub <noreply@github.com>
Sun, 3 Jul 2022 23:06:57 +0000 (01:06 +0200)
util/helper_mod/init.lua [new file with mode: 0644]
util/helper_mod/mod.conf [new file with mode: 0644]
util/stress_mapgen.sh [new file with mode: 0755]
util/test_multiplayer.sh

diff --git a/util/helper_mod/init.lua b/util/helper_mod/init.lua
new file mode 100644 (file)
index 0000000..4da832e
--- /dev/null
@@ -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 (file)
index 0000000..efdd9ea
--- /dev/null
@@ -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 (executable)
index 0000000..ba152dd
--- /dev/null
@@ -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[@]}"
index 5ffc044e06bc099d153df8381f7ccc6897e1185c..e0d0ec742b1ffe711fc754e5c9c4a37c35d72da2 100755 (executable)
@@ -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) /' &