X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=tests%2Fregression%2Ftools%2Fnotification%2Ftest_notification_notifier_discarded_count;h=c9235393ef27cfba645d62eb0f5be132a432ba60;hb=63dd3d7b5b0979c4b11a6bb8d0e4155120482977;hp=b0fce8aa8d59f722a469d6d08cb6fd6c7ffdd374;hpb=761ffce23895ccf66a7a410b9037fa3f128fb20a;p=lttng-tools.git diff --git a/tests/regression/tools/notification/test_notification_notifier_discarded_count b/tests/regression/tools/notification/test_notification_notifier_discarded_count index b0fce8aa8..c9235393e 100755 --- a/tests/regression/tools/notification/test_notification_notifier_discarded_count +++ b/tests/regression/tools/notification/test_notification_notifier_discarded_count @@ -7,14 +7,14 @@ CURDIR=$(dirname "$0")/ TESTDIR=$CURDIR/../../../ -TMPDIR=$(mktemp -d) +TEST_TMPDIR=$(mktemp --tmpdir -d tmp.test_notifier_discarded_count.XXXXXX) TESTAPP_PATH="$TESTDIR/utils/testapp" TESTAPP_NAME="gen-ust-events" TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" -TESTPOINT_BASE_PATH=$(readlink -f "$TMPDIR/lttng.t_p_n") -TESTPOINT_PIPE_PATH=$(mktemp -u "${TESTPOINT_BASE_PATH}.XXXXXX") +TESTPOINT_BASE_PATH=$(readlink -f "$TEST_TMPDIR/lttng.t_p_n") +TESTPOINT_PIPE_PATH=$(mktemp -u --tmpdir="$TEST_TMPDIR" "lttng.t_p_n.XXXXXX") TESTPOINT=$(readlink -f "${CURDIR}/.libs/libpause_sessiond.so") SH_TAP=1 @@ -27,17 +27,40 @@ source "$CURDIR/util_event_generator.sh" FULL_LTTNG_BIN="${TESTDIR}/../src/bin/lttng/${LTTNG_BIN}" FULL_LTTNG_SESSIOND_BIN="${TESTDIR}/../src/bin/lttng-sessiond/lttng-sessiond" -UST_NUM_TESTS=18 -KERNEL_NUM_TESTS=17 +UST_NUM_TESTS=15 +DESTRUCTIVE_TESTS_NUM=12 +KERNEL_NUM_TESTS=$((14 + $DESTRUCTIVE_TESTS_NUM)) NUM_TESTS=$(($UST_NUM_TESTS + $KERNEL_NUM_TESTS)) plan_tests $NUM_TESTS +function trigger_get_discarded_notif_number() +{ + local trigger_name="$1" + local list_triggers_stdout=$(mktemp --tmpdir="$TEST_TMPDIR" "list_triggers_stdout.XXXXXX") + + "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" + + cat "$list_triggers_stdout" | grep -A7 "$trigger_name" | grep -A2 "event rule matches" | tail -1 | grep --quiet "errors: none" + ret=$? + + if [ "$ret" -eq "0" ]; then + notif_nb="0" + else + notif_nb=$(cat "$list_triggers_stdout" | grep -A7 "$trigger_name" | grep "discarded tracer messages" | cut -d' ' -f10) + fi + + rm -f "$list_triggers_stdout" + + # Printing the value to that the caller can get it back. + echo "$notif_nb" +} + function test_kernel_notifier_discarded_count { local sessiond_pipe=() local trigger_name="my_trigger" - local list_triggers_stdout=$(mktemp -t list_triggers_stdout.XXXXXX) + local list_triggers_stdout=$(mktemp --tmpdir="$TEST_TMPDIR" "list_triggers_stdout.XXXXXX") # Used on sessiond launch. LTTNG_SESSIOND_ENV_VARS="LTTNG_TESTPOINT_ENABLE=1 \ @@ -55,17 +78,11 @@ function test_kernel_notifier_discarded_count done lttng_add_trigger_ok "$trigger_name" \ - --condition on-event --kernel lttng_test_filter_event \ + --condition event-rule-matches --type=kernel --name=lttng_test_filter_event \ --action notify - "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" - - # Confirm that the discarded notification line is not present. - cat "$list_triggers_stdout" | grep -v --quiet "discarded tracer messages" - ok $? "No discarded tracer notification message" - - tail -n 1 "$list_triggers_stdout" | grep --quiet "errors: none" - ok $? "Trigger 'errors: none' notification message" + trigger_discarded_nb=$(trigger_get_discarded_notif_number "$trigger_name") + is $trigger_discarded_nb 0 "No discarded tracer notification" # Stop consumption of notifier tracer notifications. diag "Pause consumption of tracer messages" @@ -78,36 +95,23 @@ function test_kernel_notifier_discarded_count # is lost in subbuffer boundaries. echo -n "2000" > /proc/lttng-test-filter-event - "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" - - # Confirm that the discarded notification line is present. To avoid - # false positives. - cat "$list_triggers_stdout" | grep --quiet "discarded tracer messages" - ok $? "Tracer notification discarded line printed" - - # Confirm that the number of dicarded tracer messages is not zero. - cat "$list_triggers_stdout" | grep --quiet "discarded tracer messages: 0" - isnt $? 0 "Discarded tracer notification number non-zero as expected" + # Confirm that the number of tracer notifications discarded is non-zero. + trigger_discarded_nb=$(trigger_get_discarded_notif_number "$trigger_name") + isnt $trigger_discarded_nb 0 "Discarded tracer notification number non-zero ($trigger_discarded_nb) as expected" lttng_remove_trigger_ok "$trigger_name" # Confirm that no notifier is enabled. list_triggers_line_count=$("$FULL_LTTNG_BIN" list-triggers | wc -l) - is "$list_triggers_line_count" "0" "No \`on-event\` kernel notifier enabled as expected" + is "$list_triggers_line_count" "0" "No \`event-rule-matches\` kernel notifier enabled as expected" # Enable another notifier and list it to confirm the counter was cleared. lttng_add_trigger_ok "$trigger_name" \ - --condition on-event --kernel lttng_test_filter_event \ + --condition event-rule-matches --type=kernel --name=lttng_test_filter_event \ --action notify - "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" - - # Confirm that the discarded notification line is not present. - cat "$list_triggers_stdout" | grep -v --quiet "discarded tracer messages" - ok $? "No discarded tracer notification message" - - tail -n 1 "$list_triggers_stdout" | grep --quiet "errors: none" - ok $? "Trigger 'errors: none' notification message" + trigger_discarded_nb=$(trigger_get_discarded_notif_number "$trigger_name") + is $trigger_discarded_nb 0 "No discarded tracer notification" lttng_remove_trigger_ok "$trigger_name" @@ -125,13 +129,13 @@ function test_kernel_notifier_discarded_count_max_bucket diag "Kernel event notifer error counter bucket limit" for i in $(seq 3); do lttng_add_trigger_ok "$i" \ - --condition on-event --kernel my_event_that_doesnt_need_to_really_exist_$i \ + --condition event-rule-matches --type=kernel --name=my_event_that_doesnt_need_to_really_exist_$i \ --action notify done for i in $(seq 4 5); do lttng_add_trigger_fail "$i" \ - --condition on-event --kernel my_event_that_doesnt_need_to_really_exist_$i \ + --condition event-rule-matches --type=kernel --name=my_event_that_doesnt_need_to_really_exist_$i \ --action notify done @@ -142,7 +146,6 @@ function test_ust_notifier_discarded_count { local sessiond_pipe=() local trigger_name="my_trigger" - local list_triggers_stdout=$(mktemp -t list_triggers_stdout.XXXXXX) local NR_USEC_WAIT=0 local PIPE_SIZE local NR_ITER @@ -177,17 +180,11 @@ function test_ust_notifier_discarded_count done lttng_add_trigger_ok "$trigger_name" \ - --condition on-event --userspace tp:tptest \ + --condition event-rule-matches --type=user --name=tp:tptest \ --action notify - "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" - - # Confirm that the discarded notification line is not present. - cat "$list_triggers_stdout" | grep -v --quiet "discarded tracer messages" - ok $? "No discarded tracer notification message" - - tail -n 1 "$list_triggers_stdout" | grep --quiet "errors: none" - ok $? "Trigger 'errors: none' notification message" + trigger_discarded_nb=$(trigger_get_discarded_notif_number "$trigger_name") + is $trigger_discarded_nb 0 "No discarded tracer notification" # Stop consumption of notifier tracer notifications. diag "Pause consumption of tracer messages" @@ -196,47 +193,32 @@ function test_ust_notifier_discarded_count $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT ok $? "Generating $NR_ITER tracer notifications" - "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" - - # Confirm that the discarded notification line is present. To avoid - # false positive. - cat "$list_triggers_stdout" | grep --quiet "discarded tracer messages" - ok $? "Tracer notification discarded line printed" - - # Confirm that the number of discarded tracer messages is not zero. - cat "$list_triggers_stdout" | grep --quiet "discarded tracer messages: 0" - isnt $? 0 "Discarded tracer notification number non-zero as expected" + # Confirm that the number of tracer notifications discarded is non-zero. + trigger_discarded_nb=$(trigger_get_discarded_notif_number "$trigger_name") + isnt $trigger_discarded_nb 0 "Discarded tracer notification number non-zero ($trigger_discarded_nb) as expected" # Remove the notifier. lttng_remove_trigger_ok "$trigger_name" - # Confirm that no notifier is enabled. + # Confirm that no trigger is enabled. list_triggers_line_count=$("$FULL_LTTNG_BIN" list-triggers | wc -l) - is "$list_triggers_line_count" "0" "No \`on-event\` userspace notifier enabled as expected" + is "$list_triggers_line_count" "0" "No \`event-rule-matches\` userspace notifier enabled as expected" # Enable another notifier and list it to confirm the counter was cleared. lttng_add_trigger_ok "$trigger_name" \ - --condition on-event --userspace tp:tptest \ + --condition event-rule-matches --type=user --name=tp:tptest \ --action notify - # Confirm that the discarded notification line is not present. - "$FULL_LTTNG_BIN" list-triggers > "$list_triggers_stdout" - - # Confirm that the discarded notification line is not present. - cat "$list_triggers_stdout" | grep -v --quiet "discarded tracer messages" - ok $? "No discarded tracer notification message" - - tail -n 1 "$list_triggers_stdout" | grep --quiet "errors: none" - ok $? "Trigger 'errors: none' notification message" + trigger_discarded_nb=$(trigger_get_discarded_notif_number "$trigger_name") + is $trigger_discarded_nb 0 "No discarded tracer notification" lttng_remove_trigger_ok "$trigger_name" stop_lttng_sessiond_notap unset LTTNG_SESSIOND_ENV_VARS - - rm -f "$list_triggers_stdout" } + function test_ust_notifier_discarded_count_max_bucket { start_lttng_sessiond "" "--event-notifier-error-buffer-size-userspace=3" @@ -244,19 +226,168 @@ function test_ust_notifier_discarded_count_max_bucket diag "UST event notifer error counter bucket limit" for i in $(seq 3); do lttng_add_trigger_ok "$i" \ - --condition on-event --userspace my_event_that_doesnt_need_to_really_exist_$i \ + --condition event-rule-matches --type=user --name=my_event_that_doesnt_need_to_really_exist_$i \ --action notify done for i in $(seq 4 5); do lttng_add_trigger_fail "$i" \ - --condition on-event --userspace my_event_that_doesnt_need_to_really_exist_$i \ + --condition event-rule-matches --type=user --name=my_event_that_doesnt_need_to_really_exist_$i \ --action notify done stop_lttng_sessiond_notap } +function test_ust_notifier_discarded_count_multi_uid +{ + local sessiond_pipe=() + local root_trigger_name="root_trigger" + local user_trigger_name="user_trigger" + local list_triggers_stdout=$(mktemp --tmpdir="$TEST_TMPDIR" "list_triggers_stdout.XXXXXX") + local NR_USEC_WAIT=0 + local PIPE_SIZE + local NR_ITER + local new_user="dummy_lttng_test_user" + + diag "UST event notifer error counter multiple UIDs" + + # Create a dummy user to run test apps as. + useradd --no-create-home "$new_user" + new_uid=$(id -u "$new_user") + + PIPE_SIZE=$("$CURDIR"/default_pipe_size_getter) + if [ $? -ne 0 ]; then + BAIL_OUT "Failed to get system default pipe size" + else + diag "Default system pipe size: $PIPE_SIZE bytes" + fi + + # Find the number of events needed to overflow the event notification + # pipe buffer. Each LTTng-UST notification is at least 42 bytes long. + # Double that number to ensure enough events are created to overflow + # the buffer. + NR_ITER=$(( (PIPE_SIZE / 42) * 2 )) + diag "Test applications will emit $NR_ITER events" + + # Used on sessiond launch. + LTTNG_SESSIOND_ENV_VARS="LTTNG_TESTPOINT_ENABLE=1 \ + NOTIFIER_PAUSE_PIPE_PATH=${TESTPOINT_PIPE_PATH} \ + LD_PRELOAD=${TESTPOINT}" + + start_lttng_sessiond_notap + + # This is needed since the testpoint create a pipe with the sessiond + # type suffixed. + for f in "$TESTPOINT_BASE_PATH"*; do + sessiond_pipe+=("$f") + done + + lttng_add_trigger_ok "$root_trigger_name" \ + --condition event-rule-matches --type=user --name tp:tptest \ + --action notify + + lttng_add_trigger_ok "$user_trigger_name" --owner-uid "$new_uid" \ + --condition event-rule-matches --type=user --name tp:tptest \ + --action notify + + # Stop consumption of notifier tracer notifications. + echo -n 1 > $sessiond_pipe + + $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT + ok $? "Generating $NR_ITER tracer notifications as UID: $(id -u)" + + su "$new_user" -c "$TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT" + ok $? "Generating $NR_ITER tracer notifications as UID: $new_uid" + + root_trigger_discarded_nb=$(trigger_get_discarded_notif_number "$root_trigger_name") + user_trigger_discarded_nb=$(trigger_get_discarded_notif_number "$user_trigger_name") + + isnt $root_trigger_discarded_nb 0 \ + "Root trigger discarded notifications number ($root_trigger_discarded_nb) is non-zero" + isnt $user_trigger_discarded_nb 0 \ + "User trigger discarded notifications number ($user_trigger_discarded_nb) is non-zero" + + lttng_remove_trigger_ok "$root_trigger_name" + lttng_remove_trigger_ok "$user_trigger_name" --owner-uid "$new_uid" + + stop_lttng_sessiond_notap + + unset LTTNG_SESSIOND_ENV_VARS + + userdel "$new_user" + rm -f "$list_triggers_stdout" +} + +function test_ust_notifier_discarded_regardless_trigger_owner +{ + local sessiond_pipe=() + local root_trigger_name="root_trigger" + local user_trigger_name="user_trigger" + local list_triggers_stdout=$(mktemp --tmpdir="$TEST_TMPDIR" "list_triggers_stdout.XXXXXX") + local NR_USEC_WAIT=0 + local PIPE_SIZE + local NR_ITER + local new_user="dummy_lttng_test_user" + + PIPE_SIZE=$("$CURDIR"/default_pipe_size_getter) + if [ $? -ne 0 ]; then + BAIL_OUT "Failed to get system default pipe size" + else + diag "Default system pipe size: $PIPE_SIZE bytes" + fi + + # Find the number of events needed to overflow the event notification + # pipe buffer. Each LTTng-UST notification is at least 42 bytes long. + # Double that number to ensure enough events are created to overflow + # the buffer. + NR_ITER=$(( (PIPE_SIZE / 42) * 2 )) + diag "Test applications will emit $NR_ITER events" + + diag "UST event notifer error counter persists when a root trigger is present" + + # Create a dummy user to run test apps as. + useradd --no-create-home "$new_user" + new_uid=$(id -u "$new_user") + + # Used on sessiond launch. + LTTNG_SESSIOND_ENV_VARS="LTTNG_TESTPOINT_ENABLE=1 \ + NOTIFIER_PAUSE_PIPE_PATH=${TESTPOINT_PIPE_PATH} \ + LD_PRELOAD=${TESTPOINT}" + + start_lttng_sessiond_notap + + # This is needed since the testpoint create a pipe with the sessiond + # type suffixed. + for f in "$TESTPOINT_BASE_PATH"*; do + sessiond_pipe+=("$f") + done + + lttng_add_trigger_ok "$root_trigger_name" \ + --condition event-rule-matches --type=user --name tp:tptest \ + --action notify + + # Stop consumption of notifier tracer notifications. + echo -n 1 > $sessiond_pipe + + su "$new_user" -c "$TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT" + ok $? "Generating $NR_ITER tracer notifications as UID: $new_uid" + + root_trigger_discarded_nb=$(trigger_get_discarded_notif_number "$root_trigger_name") + + isnt $root_trigger_discarded_nb 0 \ + "Root trigger discarded notifications number ($root_trigger_discarded_nb) is non-zero" + + lttng_remove_trigger_ok "$root_trigger_name" + + stop_lttng_sessiond_notap + + unset LTTNG_SESSIOND_ENV_VARS + + userdel "$new_user" + rm -f "$list_triggers_stdout" +} + test_ust_notifier_discarded_count test_ust_notifier_discarded_count_max_bucket @@ -267,9 +398,18 @@ if [ "$(id -u)" == "0" ]; then modprobe lttng-test test_kernel_notifier_discarded_count - test_kernel_notifier_discarded_count_max_bucket + if destructive_tests_enabled ; then + # Those tests add a new user on the system. Since it's a quite + # intrusive change to the system, we decide to only run it when + # the user knows what they are doing. + test_ust_notifier_discarded_count_multi_uid + test_ust_notifier_discarded_regardless_trigger_owner + else + skip 0 "You need to set the LTTNG_ENABLE_DESTRUCTIVE_TESTS environment variable to \"will-break-my-system\" to run this test" $DESTRUCTIVE_TESTS_NUM + fi + modprobe --remove lttng-test rm -rf "${sessiond_pipe[@]}" 2> /dev/null @@ -278,4 +418,4 @@ else skip 0 "Root access is needed. Skipping all kernel notification tests." $KERNEL_NUM_TESTS fi -rm -rf "$TMPDIR" +rm -rf "$TEST_TMPDIR"