Add creation time to UST app path to ensure uniqueness
[lttng-tools.git] / lttng-sessiond / ust-app.c
index 43832aacba25a56b8b6f90791afd5067b487b59f..2bee4d90ab7626b7b51c314b67ef539d65441634 100644 (file)
@@ -479,8 +479,11 @@ static void shadow_copy_channel(struct ust_app_channel *ua_chan,
 
        /* Copy all events from ltt ust channel to ust app channel */
        cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) {
+               struct cds_lfht_iter uiter;
+
                ua_event_node = hashtable_lookup(ua_chan->events,
-                               (void *) uevent->attr.name, strlen(uevent->attr.name), &iter);
+                               (void *) uevent->attr.name, strlen(uevent->attr.name),
+                               &uiter);
                if (ua_event_node == NULL) {
                        DBG2("UST event %s not found on shadow copy channel",
                                        uevent->attr.name);
@@ -500,24 +503,47 @@ static void shadow_copy_channel(struct ust_app_channel *ua_chan,
  * Copy data between a UST app session and a regular LTT session.
  */
 static void shadow_copy_session(struct ust_app_session *ua_sess,
-               struct ltt_ust_session *usess)
+               struct ltt_ust_session *usess,
+               struct ust_app *app)
 {
        struct cds_lfht_node *ua_chan_node;
        struct cds_lfht_iter iter;
        struct ltt_ust_channel *uchan;
        struct ust_app_channel *ua_chan;
+       time_t rawtime;
+       struct tm *timeinfo;
+       char datetime[16];
+       int ret;
+
+       /* Get date and time for unique app path */
+       time(&rawtime);
+       timeinfo = localtime(&rawtime);
+       strftime(datetime, sizeof(datetime), "%Y%m%d-%H%M%S", timeinfo);
 
        DBG2("Shadow copy of session handle %d", ua_sess->handle);
 
        ua_sess->uid = usess->uid;
 
+       ret = snprintf(ua_sess->path, PATH_MAX,
+                       "%s/%s-%d-%s",
+                       usess->pathname, app->name, app->key.pid,
+                       datetime);
+       if (ret < 0) {
+               PERROR("asprintf UST shadow copy session");
+               /* TODO: We cannot return an error from here.. */
+               assert(0);
+       }
+
        /* TODO: support all UST domain */
 
        /* Iterate over all channels in global domain. */
        cds_lfht_for_each_entry(usess->domain_global.channels, &iter,
                        uchan, node) {
+               struct cds_lfht_iter uiter;
+
                ua_chan_node = hashtable_lookup(ua_sess->channels,
-                               (void *)uchan->name, strlen(uchan->name), &iter);
+                               (void *)uchan->name, strlen(uchan->name),
+                               &uiter);
                if (ua_chan_node != NULL) {
                        continue;
                }
@@ -579,7 +605,7 @@ static struct ust_app_session *create_ust_app_session(
                        /* Only malloc can failed so something is really wrong */
                        goto error;
                }
-               shadow_copy_session(ua_sess, usess);
+               shadow_copy_session(ua_sess, usess, app);
        }
 
        if (ua_sess->handle == -1) {
@@ -721,21 +747,14 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess,
                        goto error;
                }
 
-               ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/%s-%d",
-                               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);
+               ret = mkdir(ua_sess->path, S_IRWXU | S_IRWXG);
                if (ret < 0) {
                        PERROR("mkdir UST metadata");
                        goto error;
                }
 
-               ret = snprintf(ua_sess->metadata->pathname, PATH_MAX, "%s/%s-%d/metadata",
-                               pathname, app->name, app->key.pid);
+               ret = snprintf(ua_sess->metadata->pathname, PATH_MAX,
+                               "%s/metadata", ua_sess->path);
                if (ret < 0) {
                        PERROR("asprintf UST create stream");
                        goto error;
@@ -1054,6 +1073,8 @@ int ust_app_create_event_all(struct ltt_ust_session *usess,
 
        /* For all registered applications */
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                /* Create session on the tracer side and add it to app session HT */
                ua_sess = create_ust_app_session(usess, app);
                if (ua_sess == NULL) {
@@ -1062,7 +1083,8 @@ int ust_app_create_event_all(struct ltt_ust_session *usess,
 
                /* Lookup channel in the ust app session */
                ua_chan_node = hashtable_lookup(ua_sess->channels,
-                               (void *)uchan->name, strlen(uchan->name), &iter);
+                               (void *)uchan->name, strlen(uchan->name),
+                               &uiter);
                if (ua_chan_node == NULL) {
                        ERR("Channel %s not found in session uid %d. Skipping",
                                        uchan->name, usess->uid);
@@ -1128,9 +1150,9 @@ int ust_app_start_trace(struct ltt_ust_session *usess, struct ust_app *app)
 
                        /* 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,
-                                       ua_chan->name, ua_chan->streams.count++);
+                       ret = snprintf(ustream->pathname, PATH_MAX, "%s/%s_%u",
+                                       ua_sess->path, ua_chan->name,
+                                       ua_chan->streams.count++);
                        if (ret < 0) {
                                PERROR("asprintf UST create stream");
                                continue;
@@ -1141,7 +1163,7 @@ int ust_app_start_trace(struct ltt_ust_session *usess, struct ust_app *app)
        }
 
        /* Setup UST consumer socket and send fds to it */
-       ret = ust_consumer_send_session(usess->consumer_fd, ua_sess);
+       ret = ust_consumer_send_session(ust_consumer_fd, ua_sess);
        if (ret < 0) {
                goto error_rcu_unlock;
        }
This page took 0.02552 seconds and 4 git commands to generate.