Observed issue
==============
When running the test as root, so both UST and kernel tests are
exercised, this test takes about 100s to run on my development system.
Solution
========
By using session destroy with '--no-wait', the runtime is reduced by
30-40s. For the kernel tests in particular this introduces a detail to
keep in mind with regards to unloading the lttng-tests kernel
module. More details in the 'Known drawbacks' section.
The test applications (both userspace and kernel) also execute much
more quickly than the 0.5s sleep they are given. By reducing the sleep
to a hundreth of a second, another 15s or so can be shaved off the
test runtime.
Overall, the test runtime is reduced from 102s to 45s on my
development machine.
Known drawbacks
===============
If `modprobe -r lttng-tests` is run too quickly after the last session
destruction with `--no-wait`, the removal will fail. This patch uses a
simple one second sleep to give some time for the processes using that
module to get completely shutdown. I think it could be somewhat
brittle on systems that are slow or overcommitted; however, it seemed
more 'maintainable' than remembering to ensure that the last kernel
test session destruction doesn't use `--no-wait`.
Change-Id: Ib953ef22299d30507f46d2e6507fbd0f5641aa27
Signed-off-by: Kienan Stewart <kstewart@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
# Wait for the app to execute all the way to right before the last
# event.
while [ ! -f "${TOUCH_BEFORE_LAST_PATH}" ]; do
# Wait for the app to execute all the way to right before the last
# event.
while [ ! -f "${TOUCH_BEFORE_LAST_PATH}" ]; do
trace_"$domain"_app
stop_lttng_tracing_ok
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
if [ "$expect_event" -eq 1 ]; then
trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
create_lttng_session_ok $SESSION_NAME "$trace_path"
enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard"
lttng_track_"$domain"_fail "${tracker}"
create_lttng_session_ok $SESSION_NAME "$trace_path"
enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard"
lttng_track_"$domain"_fail "${tracker}"
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
trace_"$domain"_app
stop_lttng_tracing_ok
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
if [ "$expect_event" -eq 1 ]; then
trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
lttng_snapshot_record $SESSION_NAME
stop_lttng_tracing_ok
lttng_snapshot_record $SESSION_NAME
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
snapshot_count=$(find "$trace_path" -name metadata | wc -l)
is "$snapshot_count" 0 "Number of snapshot is zero"
snapshot_count=$(find "$trace_path" -name metadata | wc -l)
is "$snapshot_count" 0 "Number of snapshot is zero"
test_event_tracker kernel 1 "${EVENT_NAME}" "--pid --all"
test_event_pid_tracker kernel 1 "${EVENT_NAME}"
test_event_tracker kernel 1 "${EVENT_NAME}" "--pid --all"
test_event_pid_tracker kernel 1 "${EVENT_NAME}"
+ # When using session destroy with '--no-wait', the quick
+ # exit at the end means that the lttng-test modules is
+ # still marked as being in use and 'modprobe --remove' fails.
+ #
+ # It is possible to work around the issue by not setting
+ # '--no-wait' on the last kernel test, but it seems like
+ # an easy detail to forget about.
+ #
+ # The sleep here gives the system a small amount of time to
+ # finish wrapping up the session that had the lttng-test kernel
+ # module loaded.
+ sleep 1
+
modprobe --remove lttng-test
ok $? "Unloading lttng-test module"
}
modprobe --remove lttng-test
ok $? "Unloading lttng-test module"
}