From fcf57985e05d709b3e7a0655010cec01903a4b40 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Tue, 20 May 2025 12:53:09 +0200 Subject: Add end-to-end test that serve can handle canceled requests This test actually tests the serve process brought in by the ["end-to-end", "with serve"] rule. It starts several requests to serve and, while serve is still building those, stops the clients. The serve service should handle those aborted requests gracefully and afterwards still be ready to take on a new requests. --- test/end-to-end/serve-service/TARGETS | 13 +++ .../serve-service/data/targets/TARGETS.slow | 20 ++++ test/end-to-end/serve-service/interruption-test.sh | 129 +++++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 test/end-to-end/serve-service/data/targets/TARGETS.slow create mode 100644 test/end-to-end/serve-service/interruption-test.sh (limited to 'test') diff --git a/test/end-to-end/serve-service/TARGETS b/test/end-to-end/serve-service/TARGETS index 8a98ebd1..a76f68b4 100644 --- a/test/end-to-end/serve-service/TARGETS +++ b/test/end-to-end/serve-service/TARGETS @@ -147,6 +147,18 @@ , "repos": ["failure-report (data)"] , "keep": ["out/log", "out/serve.log", "out/failure.log"] } +, "interruption-test (data)": + { "type": "install" + , "files": {"ROOT": "data/ROOT", "TARGETS": "data/targets/TARGETS.slow"} + } +, "interruption-test": + { "type": ["end-to-end", "with serve"] + , "name": ["interruption-test"] + , "test": ["interruption-test.sh"] + , "deps": [["", "mr-tool-under-test"], ["", "tool-under-test"]] + , "repos": ["interruption-test (data)"] + , "keep-dirs": ["out"] + } , "serve-many-targets (data)": { "type": "install" , "files": {"ROOT": "data/ROOT", "TARGETS": "data/targets/TARGETS.transform"} @@ -190,6 +202,7 @@ , "describe" , "deduplication-of-serve-requests" , "failure-report" + , "interruption-test" , "serve-tree" ] , [ ["./", "serve-archive-root", "TESTS"] diff --git a/test/end-to-end/serve-service/data/targets/TARGETS.slow b/test/end-to-end/serve-service/data/targets/TARGETS.slow new file mode 100644 index 00000000..af92d998 --- /dev/null +++ b/test/end-to-end/serve-service/data/targets/TARGETS.slow @@ -0,0 +1,20 @@ +{ "": {"type": "export", "target": "slow", "flexible_config": ["RANGE"]} +, "slow": + { "type": "generic" + , "arguments_config": ["RANGE"] + , "outs": ["out.txt"] + , "cmds": + [ "touch out.txt" + , { "type": "join" + , "$1": + [ "for entry in " + , {"type": "var", "name": "RANGE"} + , " ; " + , "do echo $entry >> out.txt ; " + , "sleep 1 ; " + , "done" + ] + } + ] + } +} diff --git a/test/end-to-end/serve-service/interruption-test.sh b/test/end-to-end/serve-service/interruption-test.sh new file mode 100644 index 00000000..bf9efe50 --- /dev/null +++ b/test/end-to-end/serve-service/interruption-test.sh @@ -0,0 +1,129 @@ +#!/bin/sh +# Copyright 2025 Huawei Cloud Computing Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +env + +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" +readonly LBR="${TEST_TMPDIR}/local-build-root" +readonly OUT="${PWD}/out" +mkdir -p "${OUT}" + + +COMPAT="" +if [ "${COMPATIBLE:-}" = "YES" ]; then + COMPAT="--compatible" +fi + +mkdir work +cd work +touch ROOT + +cat > repos.json <&1 & +pid="$!" +pids="${pids} ${pid}" +done +echo +echo Starting processes expected to be interrupted +echo +for i in `seq 20 35` +do echo Starting build with parameter $i +"${JUST_MR}" --norc --local-build-root "${LBR}" \ + --remote-serve-address ${SERVE} \ + -f "${OUT}/proc$i.log" \ + --restrict-stderr-log-limit 1 \ + -r ${REMOTE_EXECUTION_ADDRESS} ${COMPAT} \ + --just "${JUST}" \ + build -D '{"RANGE": "`seq 1 '"${i}"'`"}' \ + 2>&1 & +pid="$!" +pids="${pids} ${pid}" +killpids="${killpids} ${pid}" +done +echo "Started ${pids}" + +sleep 7 +echo "Stopping processes ${killpids}" +for pid in ${killpids}; do + kill $pid +done +echo "Waiting for processes ${pids}" +for pid in ${pids}; do + wait $pid || echo "$pid has exit code $?" +done +echo done +echo + +# Serve should not be affected by clients disappearing and we +# still should be able to build, both targets already requested +# as well as new ones. +"${JUST_MR}" --norc --local-build-root "${LBR}" \ + --remote-serve-address ${SERVE} \ + -f "${OUT}/finalout3.log" \ + -r ${REMOTE_EXECUTION_ADDRESS} ${COMPAT} \ + --just "${JUST}" \ + install -o "${OUT}/finalout3" -D '{"RANGE": "`seq 1 3`"}' 2>&1 +echo +"${JUST_MR}" --norc --local-build-root "${LBR}" \ + --remote-serve-address ${SERVE} \ + -f "${OUT}/finalout7.log" \ + -r ${REMOTE_EXECUTION_ADDRESS} ${COMPAT} \ + --just "${JUST}" \ + install -o "${OUT}/finalout7" -D '{"RANGE": "`seq 1 7`"}' 2>&1 +echo +echo Sanity checks +grep 2 "${OUT}/finalout7/out.txt" +grep 6 "${OUT}/finalout7/out.txt" +grep 2 "${OUT}/finalout3/out.txt" +grep 6 "${OUT}/finalout3/out.txt" && exit 1 || : +echo +echo OK -- cgit v1.2.3