consumerd: tag metadata channel as being part of a live session
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 5 May 2020 19:48:05 +0000 (15:48 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 26 May 2020 20:25:31 +0000 (16:25 -0400)
metadata channels that are part of a live session must be handled
differently than when they are part of non-live sessions since
complete "metadata units" must be accumulated before they are
forwarded to a relay daemon.

This allows a follow-up fix to use this information since the
live_timer_interval of a metadata channel is always 0.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I53db4bc717b149ed20e0309531db6f0241e873e1

src/bin/lttng-sessiond/client.c
src/bin/lttng-sessiond/consumer.c
src/bin/lttng-sessiond/consumer.h
src/bin/lttng-sessiond/kernel-consumer.c
src/bin/lttng-sessiond/trace-kernel.h
src/bin/lttng-sessiond/ust-consumer.c
src/common/consumer/consumer.c
src/common/consumer/consumer.h
src/common/kernel-consumer/kernel-consumer.c
src/common/sessiond-comm/sessiond-comm.h
src/common/ust-consumer/ust-consumer.c

index a36b81c18a127b536f0a11abf5d48ccc2fafe4be..9f9afa25acd1f45d64eb7cd6e7ce5b0b53b571c2 100644 (file)
@@ -495,6 +495,7 @@ static int create_kernel_session(struct ltt_session *session)
        session->kernel_session->gid = session->gid;
        session->kernel_session->output_traces = session->output_traces;
        session->kernel_session->snapshot_mode = session->snapshot_mode;
+       session->kernel_session->is_live_session = session->live_timer != 0;
 
        return LTTNG_OK;
 
index dc945020bf49853edf2e3369c48c4c9096a2acaa..d282f59c9266e1b22fc0aa581576c8e30d3fd32d 100644 (file)
@@ -913,6 +913,7 @@ void consumer_init_ask_channel_comm_msg(struct lttcomm_consumer_msg *msg,
                unsigned int switch_timer_interval,
                unsigned int read_timer_interval,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                unsigned int monitor_timer_interval,
                int output,
                int type,
@@ -959,6 +960,7 @@ void consumer_init_ask_channel_comm_msg(struct lttcomm_consumer_msg *msg,
        msg->u.ask_channel.switch_timer_interval = switch_timer_interval;
        msg->u.ask_channel.read_timer_interval = read_timer_interval;
        msg->u.ask_channel.live_timer_interval = live_timer_interval;
+       msg->u.ask_channel.is_live = is_in_live_session;
        msg->u.ask_channel.monitor_timer_interval = monitor_timer_interval;
        msg->u.ask_channel.output = output;
        msg->u.ask_channel.type = type;
@@ -1014,6 +1016,7 @@ void consumer_init_add_channel_comm_msg(struct lttcomm_consumer_msg *msg,
                uint64_t tracefile_count,
                unsigned int monitor,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                unsigned int monitor_timer_interval,
                struct lttng_trace_chunk *trace_chunk)
 {
@@ -1043,6 +1046,7 @@ void consumer_init_add_channel_comm_msg(struct lttcomm_consumer_msg *msg,
        msg->u.channel.tracefile_count = tracefile_count;
        msg->u.channel.monitor = monitor;
        msg->u.channel.live_timer_interval = live_timer_interval;
+       msg->u.channel.is_live = is_in_live_session;
        msg->u.channel.monitor_timer_interval = monitor_timer_interval;
 
        strncpy(msg->u.channel.pathname, pathname,
index 926697e1e9bd9e162881a0291076ebb747e4d671..54c962a86847baf3f74d941bbcfb23018e14bfc8 100644 (file)
@@ -233,6 +233,7 @@ void consumer_init_ask_channel_comm_msg(struct lttcomm_consumer_msg *msg,
                unsigned int switch_timer_interval,
                unsigned int read_timer_interval,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                unsigned int monitor_timer_interval,
                int output,
                int type,
@@ -275,6 +276,7 @@ void consumer_init_add_channel_comm_msg(struct lttcomm_consumer_msg *msg,
                uint64_t tracefile_count,
                unsigned int monitor,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                unsigned int monitor_timer_interval,
                struct lttng_trace_chunk *trace_chunk);
 int consumer_is_data_pending(uint64_t session_id,
index 0fff2c1a1e05ec63d584ff28ed59b06f43067241..9622d3058941e6cbe79ffac6528356b14b0a00ad 100644 (file)
@@ -156,6 +156,7 @@ int kernel_consumer_add_channel(struct consumer_socket *sock,
                        channel->channel->attr.tracefile_count,
                        monitor,
                        channel->channel->attr.live_timer_interval,
+                       ksession->is_live_session,
                        channel_attr_extended->monitor_timer_interval,
                        ksession->current_trace_chunk);
 
@@ -221,19 +222,13 @@ int kernel_consumer_add_metadata(struct consumer_socket *sock,
        consumer = ksession->consumer;
 
        /* Prep channel message structure */
-       consumer_init_add_channel_comm_msg(&lkm,
-                       ksession->metadata->key,
-                       ksession->id,
-                       "",
-                       ksession->uid,
-                       ksession->gid,
-                       consumer->net_seq_index,
-                       DEFAULT_METADATA_NAME,
-                       1,
+       consumer_init_add_channel_comm_msg(&lkm, ksession->metadata->key,
+                       ksession->id, "", ksession->uid, ksession->gid,
+                       consumer->net_seq_index, DEFAULT_METADATA_NAME, 1,
                        DEFAULT_KERNEL_CHANNEL_OUTPUT,
-                       CONSUMER_CHANNEL_TYPE_METADATA,
-                       0, 0,
-                       monitor, 0, 0, ksession->current_trace_chunk);
+                       CONSUMER_CHANNEL_TYPE_METADATA, 0, 0, monitor, 0,
+                       ksession->is_live_session, 0,
+                       ksession->current_trace_chunk);
 
        health_code_update();
 
index 61dd8eae99dfbaba96cb0bdd31db92166ceb11be..dd6f21edf2bb06452d8f2c8f399d73aec65cf4ee 100644 (file)
@@ -111,6 +111,7 @@ struct ltt_kernel_session {
        unsigned int output_traces;
        unsigned int snapshot_mode;
        unsigned int has_non_default_channel;
+       bool is_live_session;
        /* Current trace chunk of the ltt_session. */
        struct lttng_trace_chunk *current_trace_chunk;
        /* Tracker lists */
index e5ba996cceaf160a4bc207113b22f7c08b4c05a9..25dc7ed1c6da96c5fa8cfba14e95d78dab0e9ac1 100644 (file)
@@ -136,6 +136,7 @@ static int ask_channel_creation(struct ust_app_session *ua_sess,
                        ua_chan->attr.switch_timer_interval,
                        ua_chan->attr.read_timer_interval,
                        ua_sess->live_timer_interval,
+                       ua_sess->live_timer_interval != 0,
                        ua_chan->monitor_timer_interval,
                        output,
                        (int) ua_chan->attr.type,
index 4101925c6a8419bcfd40629918d5696f377a6be6..e2e7438f62d29a942740f37dcd255c6e9242cbf7 100644 (file)
@@ -1066,6 +1066,7 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key,
                uint64_t session_id_per_pid,
                unsigned int monitor,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                const char *root_shm_path,
                const char *shm_path)
 {
@@ -1097,6 +1098,7 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key,
        channel->tracefile_count = tracefile_count;
        channel->monitor = monitor;
        channel->live_timer_interval = live_timer_interval;
+       channel->is_live = is_in_live_session;
        pthread_mutex_init(&channel->lock, NULL);
        pthread_mutex_init(&channel->timer_lock, NULL);
 
index 077e959d7863ee6653552166bac768d775917e07..000040982d5dfb4bba6abaa2bb2a6a9e1f3d5b75 100644 (file)
@@ -183,6 +183,8 @@ struct lttng_consumer_channel {
        int live_timer_enabled;
        timer_t live_timer;
        int live_timer_error;
+       /* Channel is part of a live session ? */
+       bool is_live;
 
        /* For channel monitoring timer. */
        int monitor_timer_enabled;
@@ -764,6 +766,7 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key,
                uint64_t session_id_per_pid,
                unsigned int monitor,
                unsigned int live_timer_interval,
+               bool is_in_live_session,
                const char *root_shm_path,
                const char *shm_path);
 void consumer_del_stream(struct lttng_consumer_stream *stream,
index 5aec4ecf8bdb856b4b2c5fb41b6d79e1c269dcf9..7032a7f7ffcc9bea224db0c6059f1928de72aa47 100644 (file)
@@ -513,6 +513,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.channel.tracefile_count, 0,
                                msg.u.channel.monitor,
                                msg.u.channel.live_timer_interval,
+                               msg.u.channel.is_live,
                                NULL, NULL);
                if (new_channel == NULL) {
                        lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_OUTFD_ERROR);
index fd1ceae117c279210071326ab3544ebe58ad2253..0b4c05fb795359b3e936008024d41c68eaf3288d 100644 (file)
@@ -534,6 +534,8 @@ struct lttcomm_consumer_msg {
                        uint32_t monitor;
                        /* timer to check the streams usage in live mode (usec). */
                        unsigned int live_timer_interval;
+                       /* is part of a live session */
+                       uint8_t is_live;
                        /* timer to sample a channel's positions (usec). */
                        unsigned int monitor_timer_interval;
                } LTTNG_PACKED channel; /* Only used by Kernel. */
@@ -567,6 +569,7 @@ struct lttcomm_consumer_msg {
                        uint32_t switch_timer_interval;         /* usec */
                        uint32_t read_timer_interval;           /* usec */
                        unsigned int live_timer_interval;       /* usec */
+                       uint8_t is_live;                        /* is part of a live session */
                        uint32_t monitor_timer_interval;        /* usec */
                        int32_t output;                         /* splice, mmap */
                        int32_t type;                           /* metadata or per_cpu */
index b46a505021203a017832cec88826244f02895643..e5143cd4a5f38afbc8e77189135c68fff25e4e96 100644 (file)
@@ -111,26 +111,6 @@ error:
        return ret;
 }
 
-/*
- * Allocate and return a consumer channel object.
- */
-static struct lttng_consumer_channel *allocate_channel(uint64_t session_id,
-               const uint64_t *chunk_id, const char *pathname, const char *name,
-               uint64_t relayd_id, uint64_t key, enum lttng_event_output output,
-               uint64_t tracefile_size, uint64_t tracefile_count,
-               uint64_t session_id_per_pid, unsigned int monitor,
-               unsigned int live_timer_interval,
-               const char *root_shm_path, const char *shm_path)
-{
-       assert(pathname);
-       assert(name);
-
-       return consumer_allocate_channel(key, session_id, chunk_id, pathname,
-                       name, relayd_id, output, tracefile_size,
-                       tracefile_count, session_id_per_pid, monitor,
-                       live_timer_interval, root_shm_path, shm_path);
-}
-
 /*
  * Allocate and return a consumer stream object. If _alloc_ret is not NULL, the
  * error value if applicable is set in it else it is kept untouched.
@@ -1480,19 +1460,21 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                };
 
                /* Create a plain object and reserve a channel key. */
-               channel = allocate_channel(msg.u.ask_channel.session_id,
+               channel = consumer_allocate_channel(
+                               msg.u.ask_channel.key,
+                               msg.u.ask_channel.session_id,
                                msg.u.ask_channel.chunk_id.is_set ?
                                                &chunk_id : NULL,
                                msg.u.ask_channel.pathname,
                                msg.u.ask_channel.name,
                                msg.u.ask_channel.relayd_id,
-                               msg.u.ask_channel.key,
                                (enum lttng_event_output) msg.u.ask_channel.output,
                                msg.u.ask_channel.tracefile_size,
                                msg.u.ask_channel.tracefile_count,
                                msg.u.ask_channel.session_id_per_pid,
                                msg.u.ask_channel.monitor,
                                msg.u.ask_channel.live_timer_interval,
+                               msg.u.ask_channel.is_live,
                                msg.u.ask_channel.root_shm_path,
                                msg.u.ask_channel.shm_path);
                if (!channel) {
This page took 0.031549 seconds and 4 git commands to generate.