diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 16:28:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 16:28:20 +0000 |
commit | dcc721a95bef6f0d8e6d8775b8efe33e5aecd562 (patch) | |
tree | 66a2774cd0ee294d019efd71d2544c70f42b2842 /tests/omprog-output-capture-mt.sh | |
parent | Initial commit. (diff) | |
download | rsyslog-dcc721a95bef6f0d8e6d8775b8efe33e5aecd562.tar.xz rsyslog-dcc721a95bef6f0d8e6d8775b8efe33e5aecd562.zip |
Adding upstream version 8.2402.0.upstream/8.2402.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/omprog-output-capture-mt.sh')
-rwxr-xr-x | tests/omprog-output-capture-mt.sh | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/omprog-output-capture-mt.sh b/tests/omprog-output-capture-mt.sh new file mode 100755 index 0000000..ba1f86e --- /dev/null +++ b/tests/omprog-output-capture-mt.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# This file is part of the rsyslog project, released under ASL 2.0 + +# Similar to the 'omprog-output-capture.sh' test, with multiple worker +# threads on high load. Checks that the lines concurrently emitted to +# stdout/stderr by the various program instances are not intermingled in +# the output file (i.e., are captured atomically by omprog) when 1) the +# lines are less than PIPE_BUF bytes long and 2) the program writes the +# lines in unbuffered or line-buffered mode. + +. ${srcdir:=.}/diag.sh init +skip_platform "SunOS" "This test currently does not work on all flavors of Solaris (problems with Python?)" +if [ "$CC" == "gcc" ] && [[ "$CFLAGS" == *"-coverage"* ]]; then + printf 'This test does not work with gcc coverage instrumentation\n' + printf 'It will hang, but we do not know why. See\n' + printf 'https://github.com/rsyslog/rsyslog/issues/3361\n' + exit 77 +fi + +export NUMMESSAGES=20000 + +if [[ "$(uname)" == "Linux" ]]; then + export LINE_LENGTH=4095 # 4KB minus 1 byte (for the newline char) +else + export LINE_LENGTH=511 # 512 minus 1 byte (for the newline char) +fi + +empty_check() { + if [ $(wc -l < "$RSYSLOG_OUT_LOG") -ge $((NUMMESSAGES * 2)) ]; then + return 0 + fi + return 1 +} +export QUEUE_EMPTY_CHECK_FUNC=empty_check + +generate_conf +add_conf ' +module(load="../plugins/omprog/.libs/omprog") + +template(name="outfmt" type="string" string="%msg%\n") + +main_queue( + queue.timeoutShutdown="60000" # long shutdown timeout for the main queue +) + +:msg, contains, "msgnum:" { + action( + type="omprog" + binary="'$PYTHON' '$srcdir'/testsuites/omprog-output-capture-mt-bin.py '$LINE_LENGTH'" + template="outfmt" + name="omprog_action" + queue.type="LinkedList" # use a dedicated queue + queue.workerThreads="10" # ...with many workers + queue.timeoutShutdown="60000" # ...and a long shutdown timeout + closeTimeout="10000" # wait enough for program to terminate + output=`echo $RSYSLOG_OUT_LOG` + fileCreateMode="0644" + ) +} +' +startup + +# Issue a HUP signal when the output-capture thread has not started yet, +# to check that this case is handled correctly (the output file has not +# been opened yet, so omprog must not try to reopen it). +issue_HUP + +injectmsg 0 $NUMMESSAGES + +# Issue more HUP signals to cause the output file to be reopened during +# writing (not a complete test of this feature, but at least we check it +# doesn't break the output). +issue_HUP +./msleep 1000 +issue_HUP +./msleep 1000 +issue_HUP + +#wait_file_lines "$RSYSLOG_OUT_LOG" $((NUMMESSAGES * 2)) +shutdown_when_empty +wait_shutdown + +line_num=0 +while IFS= read -r line; do + ((line_num++)) + if [[ ${#line} != $LINE_LENGTH ]]; then + echo "intermingled line in captured output: line: $line_num, length: ${#line} (expected: $LINE_LENGTH)" + echo "$line" + error_exit 1 + fi +done < $RSYSLOG_OUT_LOG + +if (( line_num != NUMMESSAGES * 2 )); then + echo "unexpected number of lines in captured output: $line_num (expected: $((NUMMESSAGES * 2)))" + error_exit 1 +fi + +exit_test |