commit 3eedfda1fed73f15d7737c77fec9fe60a9b38fa2 Author: Josh Stone Date: Wed Jan 27 14:20:06 2016 -0800 PR19525: always use a SIGUSR2 handler in stapio It was conditionally ignored by commit 62d2a73ee995, to avoid confusing error messages about file rotation when there's no output file. But bulk-mode close_relayfs() still needs the signal to cause EINTR on the waiting threads, so SIG_IGN is too much. Now we just return from the handler immediately if there's no output file to rotate. Also add a SIGUSR2 test for the original error and with bulk mode. diff --git a/staprun/relay.c b/staprun/relay.c index e994cdec9f6d..010063dda687 100644 --- a/staprun/relay.c +++ b/staprun/relay.c @@ -212,7 +212,7 @@ error_out: static void switchfile_handler(int sig) { int i; - if (stop_threads) + if (stop_threads || !outfile_name) return; for (i = 0; i < ncpus; i++) if (reader[i] && switch_file[i]) { @@ -355,7 +355,7 @@ int init_relayfs(void) } memset(&sa, 0, sizeof(sa)); - sa.sa_handler = outfile_name ? switchfile_handler : SIG_IGN; + sa.sa_handler = switchfile_handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaction(SIGUSR2, &sa, NULL); diff --git a/testsuite/systemtap.base/sigusr2.exp b/testsuite/systemtap.base/sigusr2.exp new file mode 100644 index 000000000000..76ec28a54f22 --- /dev/null +++ b/testsuite/systemtap.base/sigusr2.exp @@ -0,0 +1,18 @@ +# Check that SIGUSR2 doesn't cause errors when not using file rotation. +# +# It used to say something like: +# stapio:open_outfile:75: ERROR: -S is set without -o. Please file a bug report. +# ERROR: Couldn't open file for cpu 0, exiting.: Success + + +set test "sigusr2" +stap_run $srcdir/$subdir/$test.stp no_load $all_pass_string -g + +# PR19525: In bulk-mode (-b), close_relayfs() expects SIGUSR2 to cause EINTR on +# the relay threads, so it can't be SIG_IGN. But the output is written to +# files for later stap-merge, so we can't use normal proc stap_run. +# Just make sure it doesn't hang, at least. + +set result_string {} +stap_run3 "$test bulk" $srcdir/$subdir/$test.stp -g -b -c true + diff --git a/testsuite/systemtap.base/sigusr2.stp b/testsuite/systemtap.base/sigusr2.stp new file mode 100644 index 000000000000..dd2cc485e4b6 --- /dev/null +++ b/testsuite/systemtap.base/sigusr2.stp @@ -0,0 +1,18 @@ +/* + * sigusr2.stp + * + * Check that SIGUSR2 doesn't cause errors when not using file rotation. + */ + +probe begin +{ + println("systemtap starting probe") + raise(%{ SIGUSR2 %}) +} + +probe end +{ + println("systemtap ending probe") + println("systemtap test success") +} +