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:51:18 +0000 (13:51 -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 f13d5d341d608b8e6a3c77106bf5e9be9e5ff235..ff30576268e798a086286c1874788e8d96451548 100644 (file)
@@ -645,6 +645,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 43caabf933f7ae747b96051ef11efe31f748dd8b..28b761dc58c149e4292493ef87d0f207792df2b4 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 6ad4a3775198959b1ded8ffc04f50eb8bcbba7ea..a14131cdae00d4a6ef8d635147d9d7b944e74ba0 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 4d31289a4682a932428cf37e0a11dd29e9b7712d..d37970797445274ff5368b7a5f7c2cb709f7feec 100644 (file)
@@ -159,6 +159,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.030824 seconds and 4 git commands to generate.