Fix: enable event with different loglevel error
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 14 Jun 2012 14:43:04 +0000 (10:43 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Thu, 14 Jun 2012 17:46:43 +0000 (13:46 -0400)
This following example was NOT returning a correct error message.
"event1" is set with a loglevel "TRACE_CRIT". The normal behavior here
is that once enabled, you can not change the loglevel of the enable
event on the tracer side with a second command. It now returns a new
error message like so:

$ lttng enable-event event1 --loglevel-only TRACE-CRIT -u
$ lttng enable-event event1 --loglevel-only TRACE-WARNING -u
[...] Event already enabled with different loglevel

This commit makes the session daemon verify if _both_ the name and
loglevel are the same when enabling an event or else an error is
returned.

Also, the session daemon will continue enabling events and not return an
error is the loglevel does not match event for ust app on the tracer
which returns an EPERM at that stage. This is to address the case where
two applications have the same event name but with different loglevel.

Reported-by: Tan Dung Le Tran <tan.dung.le.tran@ericsson.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
doc/man/lttng.1
src/bin/lttng-sessiond/event.c
src/bin/lttng-sessiond/ust-app.c
src/common/sessiond-comm/sessiond-comm.c
src/common/sessiond-comm/sessiond-comm.h

index a74750e08cadcf2322463b4f04a4d2e95bbc2883..6bbf3154e3dd81151802bd63f51112f7df70f96a 100644 (file)
@@ -647,6 +647,9 @@ No UST consumer detected
 
 .IP "99"
 No Kernel consumer detected
+
+.IP "100"
+Event already enabled with different loglevel
 .PP
 .SH "ENVIRONMENT VARIABLES"
 
index c9c2f17f4a24450d561e7d4d607f95c5744de2a5..4bc8fb90df81f6b722d5ef50d282a6c4cf15d597 100644 (file)
@@ -45,6 +45,23 @@ static void init_syscalls_kernel_event(struct lttng_event *event)
        event->type = LTTNG_EVENT_SYSCALL;
 }
 
+/*
+ * Return 1 if loglevels match or 0 on failure.
+ */
+static int loglevel_match(struct ltt_ust_event *uevent,
+               enum lttng_ust_loglevel_type log_type, int loglevel)
+{
+       if (uevent == NULL || uevent->attr.loglevel_type != log_type ||
+                       uevent->attr.loglevel != loglevel) {
+               goto no_match;
+       }
+
+       return 1;
+
+no_match:
+       return 0;
+}
+
 /*
  * Disable kernel tracepoint event for a channel from the kernel session.
  */
@@ -395,8 +412,23 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain,
                to_create = 1;
        }
 
+       /* Check loglevels */
+       ret = loglevel_match(uevent, event->loglevel_type, event->loglevel);
+       if (ret == 0) {
+               /*
+                * No match meaning that the user tried to enable a known event but
+                * with a different loglevel.
+                */
+               DBG("Enable event %s does not match existing event %s with loglevel "
+                               "respectively of %d and %d", event->name, uevent->attr.name,
+                               uevent->attr.loglevel, event->loglevel);
+               ret = LTTCOMM_EVENT_EXIST_LOGLEVEL;
+               goto error;
+       }
+
        if (uevent->enabled) {
                /* It's already enabled so everything is OK */
+               ret = LTTCOMM_OK;
                goto end;
        }
 
index 63b106ae43a2de504df24aff7e6a070000bb5045..956c5dafec34e9a550d08b6bb6468e472639524b 100644 (file)
@@ -645,7 +645,7 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess,
        ret = ustctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
                        &ua_event->obj);
        if (ret < 0) {
-               if (ret == -EEXIST) {
+               if (ret == -EEXIST || ret == -EPERM) {
                        ret = 0;
                        goto error;
                }
index 891f532d669ec890a947d898ff41fd59edf94cfb..706b8a7cd69063cbc9b4f0d15a0af34be81090c3 100644 (file)
@@ -125,6 +125,7 @@ static const char *lttcomm_readable_code[] = {
        [ LTTCOMM_ERR_INDEX(LTTCOMM_INVALID) ] = "Invalid parameter",
        [ LTTCOMM_ERR_INDEX(LTTCOMM_NO_USTCONSUMERD) ] = "No UST consumer detected",
        [ LTTCOMM_ERR_INDEX(LTTCOMM_NO_KERNCONSUMERD) ] = "No kernel consumer detected",
+       [ LTTCOMM_ERR_INDEX(LTTCOMM_EVENT_EXIST_LOGLEVEL) ] = "Event already enabled with different loglevel",
 };
 
 /*
index eb9ae8475f272f9b2ad6ce8f22ce4fabadf5bbc3..1183535841453a3b220767476d04b63bdfaa41c8 100644 (file)
@@ -162,6 +162,7 @@ enum lttcomm_return_code {
        LTTCOMM_INVALID,                        /* Invalid parameter */
        LTTCOMM_NO_USTCONSUMERD,        /* No UST consumer detected */
        LTTCOMM_NO_KERNCONSUMERD,       /* No Kernel consumer detected */
+       LTTCOMM_EVENT_EXIST_LOGLEVEL,   /* Event already enabled with different loglevel */
 
        /* MUST be last element */
        LTTCOMM_NR,                                             /* Last element */
This page took 0.029449 seconds and 4 git commands to generate.