Fix: sessions with agent channels fail to load
[lttng-tools.git] / src / common / config / session-config.c
index 8b91f32d5aebf47f6a05af102bb3358c069155b7..0d75a088d402e17076b53994fb6f6915b0d8f13c 100644 (file)
@@ -2437,10 +2437,31 @@ int process_domain_node(xmlNodePtr domain_node, const char *session_name)
        /* create all channels */
        for (node = xmlFirstElementChild(channels_node); node;
                node = xmlNextElementSibling(node)) {
+               const enum lttng_domain_type original_domain = domain.type;
                xmlNodePtr contexts_node = NULL;
                xmlNodePtr events_node = NULL;
                xmlNodePtr channel_attr_node;
 
+               /*
+                * Channels of the "agent" types cannot be created directly.
+                * They are meant to be created implicitly through the
+                * activation of events in their domain. However, a user
+                * can override the default channel configuration attributes
+                * by creating the underlying UST channel _before_ enabling
+                * an agent domain event.
+                *
+                * Hence, the channel's type is substituted before the creation
+                * and restored by the time the events are created.
+                */
+               switch (domain.type) {
+               case LTTNG_DOMAIN_JUL:
+               case LTTNG_DOMAIN_LOG4J:
+               case LTTNG_DOMAIN_PYTHON:
+                       domain.type = LTTNG_DOMAIN_UST;
+               default:
+                       break;
+               }
+
                channel = lttng_channel_create(&domain);
                if (!channel) {
                        ret = -1;
@@ -2462,6 +2483,9 @@ int process_domain_node(xmlNodePtr domain_node, const char *session_name)
                        goto end;
                }
 
+               /* Restore the original channel domain. */
+               domain.type = original_domain;
+
                ret = process_events_node(events_node, handle, channel->name);
                if (ret) {
                        goto end;
This page took 0.02442 seconds and 5 git commands to generate.