Fix: disable event for JUL domain
[lttng-tools.git] / src / bin / lttng-sessiond / event.c
index 1efa5a1badf2ee8c6eed919aaa19b522c99e606e..a82ed9183da3c200b522efac133e2b648601fab8 100644 (file)
@@ -27,6 +27,7 @@
 #include "channel.h"
 #include "event.h"
 #include "kernel.h"
+#include "lttng-sessiond.h"
 #include "ust-ctl.h"
 #include "ust-app.h"
 #include "trace-kernel.h"
@@ -616,7 +617,7 @@ error:
  * Return LTTNG_OK on success or else a LTTNG_ERR* code.
  */
 int event_jul_enable_all(struct ltt_ust_session *usess,
-               struct lttng_event *event)
+               struct lttng_event *event, struct lttng_filter_bytecode *filter)
 {
        int ret;
        struct jul_event *jevent;
@@ -627,7 +628,7 @@ int event_jul_enable_all(struct ltt_ust_session *usess,
        DBG("Event JUL enabling ALL events for session %" PRIu64, usess->id);
 
        /* Enable event on JUL application through TCP socket. */
-       ret = event_jul_enable(usess, event);
+       ret = event_jul_enable(usess, event, filter);
        if (ret != LTTNG_OK) {
                goto error;
        }
@@ -651,7 +652,8 @@ error:
  *
  * Return LTTNG_OK on success or else a LTTNG_ERR* code.
  */
-int event_jul_enable(struct ltt_ust_session *usess, struct lttng_event *event)
+int event_jul_enable(struct ltt_ust_session *usess, struct lttng_event *event,
+               struct lttng_filter_bytecode *filter)
 {
        int ret, created = 0;
        struct jul_event *jevent;
@@ -672,6 +674,7 @@ int event_jul_enable(struct ltt_ust_session *usess, struct lttng_event *event)
                }
                jevent->loglevel = event->loglevel;
                jevent->loglevel_type = event->loglevel_type;
+               jevent->filter = filter;
                created = 1;
        }
 
@@ -708,7 +711,10 @@ error:
 int event_jul_disable(struct ltt_ust_session *usess, char *event_name)
 {
        int ret;
+       char *ust_event_name;
        struct jul_event *jevent;
+       struct ltt_ust_event *uevent = NULL;
+       struct ltt_ust_channel *uchan = NULL;
 
        assert(usess);
        assert(event_name);
@@ -726,6 +732,40 @@ int event_jul_disable(struct ltt_ust_session *usess, char *event_name)
                goto end;
        }
 
+       /*
+        * Disable it on the UST side. First get the channel reference then find
+        * the event and finally disable it.
+        */
+       uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
+                       DEFAULT_JUL_CHANNEL_NAME);
+       if (!uchan) {
+               ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
+               goto error;
+       }
+
+       if (is_root) {
+               ust_event_name = DEFAULT_SYS_JUL_EVENT_NAME;
+       } else {
+               ust_event_name = DEFAULT_USER_JUL_EVENT_NAME;
+       }
+
+       /*
+        * The loglevel is hardcoded with 0 here since the agent ust event is set
+        * with the loglevel type to ALL thus the loglevel stays 0. The event's
+        * filter is the one handling the loglevel for agent.
+        */
+       uevent = trace_ust_find_event(uchan->events, ust_event_name,
+                       jevent->filter, 0, NULL);
+       /* If the agent event exists, it must be available on the UST side. */
+       assert(uevent);
+
+       ret = ust_app_disable_event_glb(usess, uchan, uevent);
+       if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
+               ret = LTTNG_ERR_UST_DISABLE_FAIL;
+               goto error;
+       }
+       uevent->enabled = 0;
+
        ret = jul_disable_event(jevent);
        if (ret != LTTNG_OK) {
                goto error;
@@ -737,6 +777,7 @@ end:
 error:
        return ret;
 }
+
 /*
  * Disable all JUL event for a given UST session.
  *
@@ -744,7 +785,7 @@ error:
  */
 int event_jul_disable_all(struct ltt_ust_session *usess)
 {
-       int ret, do_disable = 0;
+       int ret;
        struct jul_event *jevent;
        struct lttng_ht_iter iter;
 
@@ -752,31 +793,23 @@ int event_jul_disable_all(struct ltt_ust_session *usess)
 
        /* Enable event on JUL application through TCP socket. */
        ret = event_jul_disable(usess, "*");
-       if (ret != LTTNG_OK) {
-               if (ret == LTTNG_ERR_UST_EVENT_NOT_FOUND) {
-                       /*
-                        * This means that no enable all was done before but still a user
-                        * could want to disable everything even though the * wild card
-                        * event does not exists.
-                        */
-                       do_disable = 1;
-               } else {
-                       goto error;
-               }
+       if (ret != LTTNG_OK && ret != LTTNG_ERR_UST_EVENT_NOT_FOUND) {
+               goto error;
        }
 
        /* Flag every event that they are now enabled. */
        rcu_read_lock();
        cds_lfht_for_each_entry(usess->domain_jul.events->ht, &iter.iter, jevent,
                        node.node) {
-               if (jevent->enabled && do_disable) {
-                       ret = event_jul_disable(usess, jevent->name);
-                       if (ret != LTTNG_OK) {
-                               rcu_read_unlock();
-                               goto error;
-                       }
+               if (!jevent->enabled) {
+                       continue;
+               }
+
+               ret = event_jul_disable(usess, jevent->name);
+               if (ret != LTTNG_OK) {
+                       rcu_read_unlock();
+                       goto error;
                }
-               jevent->enabled = 0;
        }
        rcu_read_unlock();
 
This page took 0.026205 seconds and 4 git commands to generate.