Feature #445
openlttng enable-event and event redefinition: user feedback can be misleading
0%
Description
Here is an abridged log that outlines the problem:
$ sudo -H lttng create asession
Session asession created.
Traces will be written in /root/lttng-traces/asession-20130214-134634
$ sudo -H lttng list asession
Tracing session asession: [inactive]
Trace path: /root/lttng-traces/asession-20130214-134634
$ sudo -H lttng enable-event sched_switch -k --tracepoint
kernel event sched_switch created in channel channel0
$ sudo -H lttng list asession
Tracing session asession: [inactive]
[...]
Events:
sched_switch (loglevel: TRACE_EMERG (0)) (type: tracepoint) [enabled]
$ sudo -H lttng disable-event sched_switch -k
kernel event sched_switch disabled in channel channel0 for session asession
$ sudo -H lttng list asession
Tracing session asession: [inactive]
[...]
Events:
sched_switch (loglevel: TRACE_EMERG (0)) (type: tracepoint) [disabled]
$ sudo -H lttng enable-event sched_switch -k --function lttng_calibrate_kretprobe
kernel event sched_switch created in channel channel0
$ sudo -H lttng list asession
Tracing session asession: [inactive]
[...]
Events:
sched_switch (loglevel: TRACE_EMERG (0)) (type: tracepoint) [enabled]
The problem is that when the user tries to redefine an event by issuing enable-event again, if the event is enabled he gets LTTNG_ERR_KERN_EVENT_EXIST "Kernel event already exists", but if it is disabled, he gets no error and apparent confirmation ("kernel event sched_switch created in channel channel0"). This can be misleading.
It seems the intent is that an event, once defined, is immutable. In that case, any redefinition attempt should yield LTTNG_ERR_KERN_EVENT_EXIST, whether the event is currently enabled or not. Having a dual-use command "enable-event" that acts upon a number of its options only when the event is first defined, while ignoring them when the event is merely re-enabled, is confusing for the user (it also makes the code unwieldy).
My suggestion is that event definition be split off into its own command, "define-event", while restricting "enable-event" to enabling already-defined events only. The corresponding --help could be something like this (abridged):
usage: lttng define-event [NAME (-k|-u)] [OPTIONS]
Options:
-h, --help Show this help and exit
--list-options List the options and exit
-s, --session NAME Apply to session NAME
-k, --kernel Apply to the kernel tracer
-u, --userspace Apply to the userspace tracer
-c, --channel NAME Apply to channel NAME
Event options:
--tracepoint Tracepoint event (default)
--probe [addr | symbol | symbol+offset]
Dynamic probe. Kernel only.
Addr and offset can be octal (0NNN...),
decimal (NNN...) or hexadecimal (0xNNN...)
--function [addr | symbol | symbol+offset]
Dynamic function entry/return probe. Kernel only.
--syscall System call event. Kernel only.
--loglevel NAME Tracepoint loglevel range from 0 to NAME.
Userspace only.
--loglevel-only NAME Tracepoint loglevel (only NAME)
Userspace only.
--filter 'expression' Filter expression on event fields,
event recording depends on evaluation.
Userspace only.
usage: lttng enable-event [[NAME[,NAME2,...]] (-k|-u)] [OPTIONS]
NAME can be omitted when using -a, --all.
The userspace tracer supports wildcards at the end of the NAME strings for
tracepoints. Don't forget to quote to deal with bash expansion. e.g.: "*",
"app_component:na*"
Options:
-h, --help Show this help and exit
--list-options List the options and exit
-s, --session NAME Apply to session NAME
-k, --kernel Apply to the kernel tracer
-u, --userspace Apply to the user-space tracer
-c, --channel NAME Apply to channel NAME
-a, --all [TYPE] Enable all events
If TYPE is specified, enable all events of the TYPE;
TYPE can be tracepoint, syscall, probe, or function
Some features of the current enable-event could be kept in the new enable-event: for instance, an event could have its loglevel or filter settings adjusted (assuming this is possible now or in the future). Note how event definition now accepts a single event name to avoid bug #444.