Fix directory creation of UST traces
[lttng-tools.git] / lttng-sessiond / ust-app.c
index 58ca9d3f235639847d7c17710940e9f3a6f5a8e7..39bfaea1595698128df2807c9d0d34d21ef72cd7 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <unistd.h>
 
 #include <lttngerr.h>
@@ -692,6 +694,8 @@ int ust_app_start_trace(struct ltt_ust_session *usess)
        struct lttng_ust_channel_attr uattr;
        struct ltt_ust_channel *uchan;
 
+       DBG("Starting all UST traces");
+
        rcu_read_lock();
        hashtable_get_first(ust_app_ht, &iter);
        while ((node = hashtable_iter_get_node(&iter)) != NULL) {
@@ -742,8 +746,20 @@ int ust_app_start_trace(struct ltt_ust_session *usess)
                                goto next;
                        }
 
+                       ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/%s-%d",
+                                       usess->pathname, app->name, app->key.pid);
+                       if (ret < 0) {
+                               PERROR("asprintf UST create stream");
+                               goto next;
+                       }
+
+                       ret = mkdir(ua_sess->metadata->pathname, S_IRWXU | S_IRWXG);
+                       if (ret < 0) {
+                               goto next;
+                       }
+
                        ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/%s",
-                                       usess->pathname, "metadata");
+                                       ua_sess->metadata->pathname, "metadata");
                        if (ret < 0) {
                                PERROR("asprintf UST create stream");
                                goto next;
@@ -790,9 +806,9 @@ int ust_app_start_trace(struct ltt_ust_session *usess)
                                ustream->handle = ustream->obj->handle;
                                /* Order is important */
                                cds_list_add_tail(&ustream->list, &ua_chan->streams.head);
-                               ret = snprintf(ustream->pathname, PATH_MAX, "%s/%s_%u",
-                                               uchan->pathname, uchan->name,
-                                               ua_chan->streams.count++);
+                               ret = snprintf(ustream->pathname, PATH_MAX, "%s/%s-%d/%s_%u",
+                                               usess->pathname, app->name, app->key.pid,
+                                               uchan->name, ua_chan->streams.count++);
                                if (ret < 0) {
                                        PERROR("asprintf UST create stream");
                                        goto next_chan;
@@ -841,6 +857,7 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
        struct lttng_ust_event ltt_uevent;
        struct ltt_ust_channel *uchan;
        struct lttng_ust_object_data *obj_event;
+       struct lttng_ust_channel_attr uattr;
 
        DBG2("UST app global update for app sock %d for session uid %d", sock,
                        usess->uid);
@@ -887,6 +904,70 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
                goto error;
        }
 
+       if (ua_sess->metadata == NULL) {
+               /* Allocate UST metadata */
+               ua_sess->metadata = trace_ust_create_metadata(usess->pathname);
+               if (ua_sess->metadata == NULL) {
+                       ERR("UST app session %d creating metadata failed",
+                                       ua_sess->handle);
+                       goto error;
+               }
+
+               uattr.overwrite = ua_sess->metadata->attr.overwrite;
+               uattr.subbuf_size = ua_sess->metadata->attr.subbuf_size;
+               uattr.num_subbuf = ua_sess->metadata->attr.num_subbuf;
+               uattr.switch_timer_interval =
+                       ua_sess->metadata->attr.switch_timer_interval;
+               uattr.read_timer_interval =
+                       ua_sess->metadata->attr.read_timer_interval;
+               uattr.output = ua_sess->metadata->attr.output;
+
+               /* UST tracer metadata creation */
+               ret = ustctl_open_metadata(app->key.sock, ua_sess->handle, &uattr,
+                               &ua_sess->metadata->obj);
+               if (ret < 0) {
+                       ERR("UST app open metadata failed for app pid:%d",
+                                       app->key.pid);
+                       goto error;
+               }
+
+               DBG2("UST metadata opened for app pid %d", app->key.pid);
+       }
+
+       /* Open UST metadata stream */
+       if (ua_sess->metadata->stream_obj == NULL) {
+               ret = ustctl_create_stream(app->key.sock, ua_sess->metadata->obj,
+                               &ua_sess->metadata->stream_obj);
+               if (ret < 0) {
+                       ERR("UST create metadata stream failed");
+                       goto error;
+               }
+
+               ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/%s-%d",
+                               usess->pathname, app->name, app->key.pid);
+               if (ret < 0) {
+                       PERROR("asprintf UST create stream");
+                       goto error;
+               }
+
+               ret = mkdir(ua_sess->metadata->pathname, S_IRWXU | S_IRWXG);
+               if (ret < 0) {
+                       PERROR("mkdir UST metadata");
+                       goto error;
+               }
+
+               ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/metadata",
+                               ua_sess->metadata->pathname);
+               if (ret < 0) {
+                       PERROR("asprintf UST create stream");
+                       goto error;
+               }
+
+               DBG2("UST metadata stream object created for app pid %d",
+                               app->key.pid);
+       }
+
+
        /* Iterate over all channels */
        hashtable_get_first(usess->domain_global.channels, &iter);
        while ((node = hashtable_iter_get_node(&iter)) != NULL) {
@@ -955,11 +1036,62 @@ next_event:
                        hashtable_get_next(ua_chan->events, &iter);
                }
 
+               for (;;) {
+                       struct lttng_ust_object_data *obj;
+                       struct ltt_ust_stream *ustream;
+
+                       ret = ustctl_create_stream(app->key.sock, ua_chan->obj, &obj);
+                       if (ret < 0) {
+                               /* Got all streams */
+                               break;
+                       }
+
+                       ustream = zmalloc(sizeof(*ustream));
+                       if (ustream == NULL) {
+                               PERROR("zmalloc ust stream");
+                               goto error;
+                       }
+
+                       ustream->obj = obj;
+                       ustream->handle = ustream->obj->handle;
+                       /* Order is important */
+                       cds_list_add_tail(&ustream->list, &ua_chan->streams.head);
+
+                       ret = snprintf(ustream->pathname, PATH_MAX, "%s/%s-%d/%s_%u",
+                                       usess->pathname, app->name, app->key.pid,
+                                       uchan->name, ua_chan->streams.count++);
+                       if (ret < 0) {
+                               PERROR("asprintf UST create stream");
+                               goto error;
+                       }
+               }
+
 next_chan:
                /* Next applications */
                hashtable_get_next(ua_sess->channels, &iter);
        }
 
+       if (usess->start_trace) {
+               /* Setup UST consumer socket and send fds to it */
+               ret = ust_consumer_send_session(usess->consumer_fd, ua_sess);
+               if (ret < 0) {
+                       ERR("UST consumer send session failed");
+                       goto error;
+               }
+
+               /* This start the UST tracing */
+               ret = ustctl_start_session(app->key.sock, ua_sess->handle);
+               if (ret < 0) {
+                       ERR("Error starting tracing for app pid: %d", app->key.pid);
+                       goto error;
+               }
+
+               /* Quiescent wait after starting trace */
+               ustctl_wait_quiescent(app->key.sock);
+
+               DBG2("UST trace started for app pid %d", app->key.pid);
+       }
+
 error:
        rcu_read_unlock();
        return;
This page took 0.025433 seconds and 4 git commands to generate.