Fix: send per-pid session id in channel creation
[lttng-tools.git] / src / bin / lttng-sessiond / ust-consumer.c
index ba74112fa72a35758cde4006320dbbfbfd15ce37..d85e32aa0ce9f2a011887fd4b9a1c70e541ccca0 100644 (file)
@@ -30,6 +30,8 @@
 #include "consumer.h"
 #include "health.h"
 #include "ust-consumer.h"
+#include "buffer-registry.h"
+#include "session.h"
 
 /*
  * Return allocated full pathname of the session using the consumer trace path
@@ -59,7 +61,7 @@ static char *setup_trace_path(struct consumer_output *consumer,
        /* Get correct path name destination */
        if (consumer->type == CONSUMER_DST_LOCAL) {
                /* Set application path to the destination path */
-               ret = snprintf(pathname, PATH_MAX, "%s/%s/%s",
+               ret = snprintf(pathname, PATH_MAX, "%s%s%s",
                                consumer->dst.trace_path, consumer->subdir, ua_sess->path);
                if (ret < 0) {
                        PERROR("snprintf channel path");
@@ -76,7 +78,7 @@ static char *setup_trace_path(struct consumer_output *consumer,
                        }
                }
        } else {
-               ret = snprintf(pathname, PATH_MAX, "%s/%s", consumer->subdir,
+               ret = snprintf(pathname, PATH_MAX, "%s%s", consumer->subdir,
                                ua_sess->path);
                if (ret < 0) {
                        PERROR("snprintf channel path");
@@ -153,7 +155,11 @@ static int ask_channel_creation(struct ust_app_session *ua_sess,
                        consumer->net_seq_index,
                        ua_chan->key,
                        registry->uuid,
-                       chan_id);
+                       chan_id,
+                       ua_chan->tracefile_size,
+                       ua_chan->tracefile_count,
+                       ua_sess->id,
+                       ua_sess->output_traces);
 
        health_code_update();
 
@@ -199,6 +205,12 @@ int ust_consumer_ask_channel(struct ust_app_session *ua_sess,
        assert(socket->fd >= 0);
        assert(registry);
 
+       if (!consumer->enabled) {
+               ret = -LTTNG_ERR_NO_CONSUMER;
+               DBG3("Consumer is disabled");
+               goto error;
+       }
+
        pthread_mutex_lock(socket->lock);
 
        ret = ask_channel_creation(ua_sess, ua_chan, consumer, socket, registry);
@@ -405,3 +417,76 @@ int ust_consumer_send_channel_to_ust(struct ust_app *app,
 error:
        return ret;
 }
+
+/*
+ * Handle the metadata requests from the UST consumer
+ *
+ * Return 0 on success else a negative value.
+ */
+int ust_consumer_metadata_request(struct consumer_socket *socket)
+{
+       int ret;
+       ssize_t ret_push;
+       struct lttcomm_metadata_request_msg request;
+       struct buffer_reg_uid *reg_uid;
+       struct ust_registry_session *ust_reg;
+       struct lttcomm_consumer_msg msg;
+
+       assert(socket);
+
+       rcu_read_lock();
+       pthread_mutex_lock(socket->lock);
+
+       health_code_update();
+
+       /* Wait for a metadata request */
+       ret = lttcomm_recv_unix_sock(socket->fd, &request, sizeof(request));
+       if (ret <= 0) {
+               ERR("Consumer closed the metadata socket");
+               ret = -1;
+               goto end;
+       }
+
+       DBG("Metadata request received for session %" PRIu64 ", key %" PRIu64,
+                       request.session_id, request.key);
+
+       reg_uid = buffer_reg_uid_find(request.session_id,
+                       request.bits_per_long, request.uid);
+       if (reg_uid) {
+               ust_reg = reg_uid->registry->reg.ust;
+       } else {
+               struct buffer_reg_pid *reg_pid =
+                       buffer_reg_pid_find(request.session_id_per_pid);
+               if (!reg_pid) {
+                       DBG("PID registry not found for session id %" PRIu64,
+                                       request.session_id_per_pid);
+
+                       msg.cmd_type = LTTNG_ERR_UND;
+                       (void) consumer_send_msg(socket, &msg);
+                       /*
+                        * This is possible since the session might have been destroyed
+                        * during a consumer metadata request. So here, return gracefully
+                        * because the destroy session will push the remaining metadata to
+                        * the consumer.
+                        */
+                       ret = 0;
+                       goto end;
+               }
+               ust_reg = reg_pid->registry->reg.ust;
+       }
+       assert(ust_reg);
+
+       ret_push = ust_app_push_metadata(ust_reg, socket, 1);
+       if (ret_push < 0) {
+               ERR("Pushing metadata");
+               ret = -1;
+               goto end;
+       }
+       DBG("UST Consumer metadata pushed successfully");
+       ret = 0;
+
+end:
+       pthread_mutex_unlock(socket->lock);
+       rcu_read_unlock();
+       return ret;
+}
This page took 0.029913 seconds and 4 git commands to generate.