#!/bin/bash # # Copyright (C) 2019 Jonathan Rajotte # # SPDX-License-Identifier: LGPL-2.1-only TEST_DESC="Clear - Kernel tracing" CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../../.. EVENT_NAME="lttng_test_filter_event" PAGE_SIZE=$(getconf PAGE_SIZE) TRACE_PATH=$(mktemp -d) NUM_TESTS=837 source $TESTDIR/utils/utils.sh function signal_cleanup () { stop_lttng_sessiond modprobe -r lttng-test full_cleanup } function clean_path () { local trace_path=$1 set -u rm -rf $trace_path set +u } function cond_start_tracing () { local session_name=$1 local tracing_active=$2 if [[ $tracing_active -ne 1 ]]; then start_lttng_tracing_ok $session_name fi } function cond_stop_tracing () { local session_name=$1 local tracing_active=$2 if [[ $tracing_active -ne 1 ]]; then stop_lttng_tracing_ok $session_name fi } function do_clear_session () { local session_name=$1 local tracing_active=$2 local clear_twice=$3 local rotate_before=$4 local rotate_after=$5 cond_stop_tracing $session_name $tracing_active if [[ $rotate_before -eq 1 ]]; then rotate_session_ok $SESSION_NAME fi lttng_clear_session_ok $SESSION_NAME if [[ $clear_twice -eq 1 ]]; then lttng_clear_session_ok $SESSION_NAME fi if [[ $rotate_after -eq 1 ]]; then if [[ $tracing_active -eq 1 ]]; then rotate_session_ok $SESSION_NAME else # Expect failure rotate_session_fail $SESSION_NAME fi fi cond_start_tracing $session_name $tracing_active } function test_kernel_streaming () { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" diag "Test kernel streaming clear" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_uri $SESSION_NAME net://localhost lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME # Generate 10 events that will sit in the buffers. echo -n "10" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then validate_trace_count $EVENT_NAME $local_path 10 else validate_trace_empty $local_path fi destroy_lttng_session_ok $SESSION_NAME } function test_kernel_streaming_rotate_clear () { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" diag "Test kernel streaming rotate-clear" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_uri $SESSION_NAME net://localhost lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME echo -n "1" > /proc/lttng-test-filter-event rotate_session_ok $SESSION_NAME echo -n "2" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after echo -n "3" > /proc/lttng-test-filter-event stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then local expect_count=6 else local expect_count=4 fi validate_trace_count $EVENT_NAME $local_path $expect_count destroy_lttng_session_ok $SESSION_NAME } function test_kernel_streaming_clear_rotate() { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" diag "Test kernel streaming clear-rotate" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_uri $SESSION_NAME net://localhost lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME echo -n "1" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after echo -n "2" > /proc/lttng-test-filter-event rotate_session_ok $SESSION_NAME echo -n "3" > /proc/lttng-test-filter-event stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then local expect_count=6 else local expect_count=5 fi validate_trace_count $EVENT_NAME $local_path $expect_count destroy_lttng_session_ok $SESSION_NAME } function test_kernel_streaming_live () { local tracing_active=$1 local clear_twice=$2 local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" diag "Test kernel streaming live clear" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" create_lttng_session_uri $SESSION_NAME net://localhost "--live" lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME # Generate 10 events that will sit in the buffers. echo -n "10" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice 0 0 stop_lttng_tracing_ok $SESSION_NAME validate_trace_empty $local_path destroy_lttng_session_ok $SESSION_NAME } #no clear function test_kernel_basic_streaming_live_viewer () { local tracing_active=$1 local clear_twice=$2 # 3, 4 unused local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" local remote_trace_path="${HOSTNAME}/${SESSION_NAME}" local channel_name="chan" local bt_output_path=$(mktemp -u) local file_sync_before_exit=$(mktemp -u) diag "Test kernel basic streaming live with viewer" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" create_lttng_session_uri $SESSION_NAME net://localhost "--live" enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name start_lttng_tracing_ok $SESSION_NAME wait_live_trace_ready net://localhost # Connect a live viewer $BABELTRACE_BIN -i lttng-live net://localhost/host/$remote_trace_path > $bt_output_path & local viewer_pid=$! wait_live_viewer_connect net://localhost echo -n "10" > /proc/lttng-test-filter-event diag "Wait until viewer sees all 10 expected events" local evcount=0 while [ $evcount -ne 10 ]; do evcount=$(cat $bt_output_path | wc -l) sleep 0.5 done pass "Live viewer read $evcount events, expect 10" destroy_lttng_session_ok $SESSION_NAME touch $file_sync_before_exit diag "Wait for viewer to exit" wait $viewer_pid ok $? "Babeltrace succeeds" pass "Wait for viewer to exit" rm -f $bt_output_path rm -f $file_sync_before_exit } function test_kernel_streaming_live_viewer () { local tracing_active=$1 local clear_twice=$2 # 3, 4 unused local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" local remote_trace_path="${HOSTNAME}/${SESSION_NAME}" local channel_name="chan" local bt_output_path=$(mktemp -d)/bt-output.txt diag "Test kernel streaming live clear with viewer" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" create_lttng_session_uri $SESSION_NAME net://localhost "--live" enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name start_lttng_tracing_ok $SESSION_NAME wait_live_trace_ready net://localhost # Connect a live viewer $BABELTRACE_BIN -i lttng-live net://localhost/host/$remote_trace_path > $bt_output_path & local viewer_pid=$! wait_live_viewer_connect net://localhost echo -n "10" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice 0 0 stop_lttng_tracing_ok $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME diag "Wait for viewer to exit" wait $viewer_pid ok $? "Babeltrace succeeds" pass "Wait for viewer to exit" clean_path $bt_output_path } function test_kernel_local () { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 diag "Test kernel local" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_ok $SESSION_NAME $TRACE_PATH lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME # Generate 10 events that will sit in the buffers. echo -n "10" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then validate_trace_count $EVENT_NAME $TRACE_PATH 10 else validate_trace_empty $TRACE_PATH fi destroy_lttng_session_ok $SESSION_NAME } function test_kernel_local_rotate_clear () { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 diag "Test kernel local rotate-clear" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_ok $SESSION_NAME $TRACE_PATH lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME echo -n "1" > /proc/lttng-test-filter-event rotate_session_ok $SESSION_NAME echo -n "2" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after echo -n "3" > /proc/lttng-test-filter-event stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then local expect_count=6 else local expect_count=4 fi validate_trace_count $EVENT_NAME $TRACE_PATH $expect_count destroy_lttng_session_ok $SESSION_NAME } function test_kernel_local_clear_rotate() { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 diag "Test kernel local clear-rotate" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_ok $SESSION_NAME $TRACE_PATH lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME echo -n "1" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after echo -n "2" > /proc/lttng-test-filter-event rotate_session_ok $SESSION_NAME echo -n "3" > /proc/lttng-test-filter-event stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then local expect_count=6 else local expect_count=5 fi validate_trace_count $EVENT_NAME $TRACE_PATH $expect_count destroy_lttng_session_ok $SESSION_NAME } function do_kernel_snapshot () { local session_name=$1 local trace_path=$2 local tracing_active=$3 local clear_twice=$4 local rotate_before=$5 local rotate_after=$6 lttng_enable_kernel_event $session_name $EVENT_NAME start_lttng_tracing_ok $session_name # Generate 10 events that will sit in the buffers. echo -n "10" > /proc/lttng-test-filter-event # Take a first snapshot and validate that the events are present. lttng_snapshot_record $session_name stop_lttng_tracing_ok $session_name validate_trace_count $EVENT_NAME $trace_path 10 # Clean the output path clean_path $trace_path start_lttng_tracing_ok $session_name do_clear_session $SESSION_NAME $tracing_active $clear_twice 0 0 # Make sure the subsequent snapshot is empty and valid. lttng_snapshot_record $session_name stop_lttng_tracing_ok $session_name validate_trace_empty $trace_path # Clean the output path clean_path $trace_path start_lttng_tracing_ok $session_name # Make sure that everything still works, generate events and take a # snapshot. echo -n "10" > /proc/lttng-test-filter-event lttng_snapshot_record $session_name stop_lttng_tracing_ok $session_name validate_trace_count $EVENT_NAME $trace_path 10 } function test_kernel_streaming_snapshot () { local tracing_active=$1 local clear_twice=$2 diag "Test kernel streaming snapshot clear" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" create_lttng_session_uri $SESSION_NAME net://localhost "--snapshot" do_kernel_snapshot $SESSION_NAME $TRACE_PATH $tracing_active $clear_twice destroy_lttng_session_ok $SESSION_NAME } function test_kernel_local_snapshot () { local tracing_active=$1 local clear_twice=$2 diag "Test kernel local snapshot clear" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" create_lttng_session_ok $SESSION_NAME $TRACE_PATH "--snapshot" do_kernel_snapshot $SESSION_NAME $TRACE_PATH $tracing_active $clear_twice destroy_lttng_session_ok $SESSION_NAME } function test_kernel_streaming_tracefile_rotation () { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 local channel_name="rotchan" local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" diag "Test kernel streaming clear with tracefile rotation" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_uri $SESSION_NAME net://localhost enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name --subbuf-size=$PAGE_SIZE \ --tracefile-size=$PAGE_SIZE --tracefile-count=2 enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name start_lttng_tracing_ok $SESSION_NAME echo -n "10" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then validate_trace_count $EVENT_NAME $local_path 10 else validate_trace_empty $local_path fi start_lttng_tracing_ok $SESSION_NAME echo -n "20" > /proc/lttng-test-filter-event stop_lttng_tracing_ok if [[ $rotate_before -eq 1 ]]; then validate_trace_count $EVENT_NAME $local_path 30 else validate_trace_count $EVENT_NAME $local_path 20 fi destroy_lttng_session_ok $SESSION_NAME } # With 1 byte per event (as strict minimum), generating 200000 events # guarantees filling up 2 files of 64k in size, which is the maximum # page size known on Linux function test_kernel_streaming_tracefile_rotation_overwrite_files () { local tracing_active=$1 local clear_twice=$2 local rotate_before=$3 local rotate_after=$4 local channel_name="rotchan" local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" diag "Test kernel streaming clear with tracefile rotation, overwrite files" diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" create_lttng_session_uri $SESSION_NAME net://localhost enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name --subbuf-size=$PAGE_SIZE \ --tracefile-size=$PAGE_SIZE --tracefile-count=2 enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name start_lttng_tracing_ok $SESSION_NAME taskset -c 0 echo -n "200000" > /proc/lttng-test-filter-event do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after stop_lttng_tracing_ok $SESSION_NAME if [[ $rotate_before -eq 1 ]]; then validate_trace_count_range_incl_min_excl_max $EVENT_NAME $local_path 1 200000 else validate_trace_empty $local_path fi start_lttng_tracing_ok $SESSION_NAME taskset -c 0 echo -n "400000" > /proc/lttng-test-filter-event stop_lttng_tracing_ok if [[ $rotate_before -eq 1 ]]; then validate_trace_count_range_incl_min_excl_max $EVENT_NAME $local_path 1 600000 else validate_trace_count_range_incl_min_excl_max $EVENT_NAME $local_path 1 200000 fi destroy_lttng_session_ok $SESSION_NAME } function test_kernel_disallow_clear () { diag "Test kernel disallow clear on relay daemon" SESSION_NAME=$(randstring 16 0) LTTNG_RELAYD_DISALLOW_CLEAR=1 start_lttng_relayd "-o $TRACE_PATH" start_lttng_sessiond create_lttng_session_uri $SESSION_NAME net://localhost enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME start_lttng_tracing_ok $SESSION_NAME lttng_clear_session_fail $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME stop_lttng_sessiond stop_lttng_relayd clean_path $TRACE_PATH } plan_tests $NUM_TESTS print_test_banner "$TEST_DESC" if [ "$(id -u)" == "0" ]; then isroot=1 else isroot=0 fi streaming_tests=(test_kernel_streaming test_kernel_streaming_rotate_clear test_kernel_streaming_clear_rotate test_kernel_streaming_tracefile_rotation test_kernel_streaming_tracefile_rotation_overwrite_files ) live_tests=(test_kernel_streaming_live test_kernel_basic_streaming_live_viewer test_kernel_streaming_live_viewer ) local_tests=(test_kernel_local test_kernel_local_rotate_clear test_kernel_local_clear_rotate ) snapshot_tests=(test_kernel_streaming_snapshot test_kernel_local_snapshot ) skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS || { trap signal_cleanup SIGTERM SIGINT validate_lttng_modules_present start_lttng_relayd "-o $TRACE_PATH" start_lttng_sessiond modprobe lttng-test # Clear with tracing active, clear once for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} 1 0 0 0 clean_path $TRACE_PATH done # Clear with tracing active, clear twice for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} 1 1 0 0 clean_path $TRACE_PATH done # Clear with tracing inactive, clear once for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} 0 0 0 0 clean_path $TRACE_PATH done # Clear with tracing inactive, clear twice for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} 0 1 0 0 clean_path $TRACE_PATH done # Clear with tracing inactive, rotate-clear once for fct_test in ${streaming_tests[@]} ${local_tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} 0 0 1 0 clean_path $TRACE_PATH done # Clear with tracing inactive, clear once-rotate(fail) for fct_test in ${streaming_tests[@]} ${local_tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} 0 0 0 1 clean_path $TRACE_PATH done rmmod lttng-test stop_lttng_sessiond stop_lttng_relayd test_kernel_disallow_clear } clean_path $TRACE_PATH