Merged!

Julien Desfossez:
> The registry indexing for per-pid sessions is done with a per-pid session id.
> So for per-pid buffers, we need to send the per-pid session id as well as the
> global session id to the consumer in order to give it enough information if it
> needs to request metadata later.
> 
> This patch adds the session_id_per_pid to the channel creation message and to
> the consumer. When the sessiond receives a metadata_request, depending on the
> buffer type (per-pid or per-uid), it selects the right id to do the registry
> lookup.
> 
> Signed-off-by: Julien Desfossez <[email protected]>
> ---
>  src/bin/lttng-sessiond/consumer.c            |    4 +++-
>  src/bin/lttng-sessiond/consumer.h            |    3 ++-
>  src/bin/lttng-sessiond/ust-consumer.c        |   11 ++++++-----
>  src/common/consumer.c                        |    4 +++-
>  src/common/consumer.h                        |    8 +++++++-
>  src/common/kernel-consumer/kernel-consumer.c |    2 +-
>  src/common/sessiond-comm/sessiond-comm.h     |    4 +++-
>  src/common/ust-consumer/ust-consumer.c       |   18 ++++++++++++------
>  8 files changed, 37 insertions(+), 17 deletions(-)
> 
> diff --git a/src/bin/lttng-sessiond/consumer.c 
> b/src/bin/lttng-sessiond/consumer.c
> index 2e20878..345a5a1 100644
> --- a/src/bin/lttng-sessiond/consumer.c
> +++ b/src/bin/lttng-sessiond/consumer.c
> @@ -684,7 +684,8 @@ void consumer_init_ask_channel_comm_msg(struct 
> lttcomm_consumer_msg *msg,
>               unsigned char *uuid,
>               uint32_t chan_id,
>               uint64_t tracefile_size,
> -             uint64_t tracefile_count)
> +             uint64_t tracefile_count,
> +             uint64_t session_id_per_pid)
>  {
>       assert(msg);
>  
> @@ -700,6 +701,7 @@ void consumer_init_ask_channel_comm_msg(struct 
> lttcomm_consumer_msg *msg,
>       msg->u.ask_channel.output = output;
>       msg->u.ask_channel.type = type;
>       msg->u.ask_channel.session_id = session_id;
> +     msg->u.ask_channel.session_id_per_pid = session_id_per_pid;
>       msg->u.ask_channel.uid = uid;
>       msg->u.ask_channel.gid = gid;
>       msg->u.ask_channel.relayd_id = relayd_id;
> diff --git a/src/bin/lttng-sessiond/consumer.h 
> b/src/bin/lttng-sessiond/consumer.h
> index 09f4545..ae28ca8 100644
> --- a/src/bin/lttng-sessiond/consumer.h
> +++ b/src/bin/lttng-sessiond/consumer.h
> @@ -202,7 +202,8 @@ void consumer_init_ask_channel_comm_msg(struct 
> lttcomm_consumer_msg *msg,
>               unsigned char *uuid,
>               uint32_t chan_id,
>               uint64_t tracefile_size,
> -             uint64_t tracefile_count);
> +             uint64_t tracefile_count,
> +             uint64_t session_id_per_pid);
>  void consumer_init_stream_comm_msg(struct lttcomm_consumer_msg *msg,
>               enum lttng_consumer_command cmd,
>               uint64_t channel_key,
> diff --git a/src/bin/lttng-sessiond/ust-consumer.c 
> b/src/bin/lttng-sessiond/ust-consumer.c
> index 367e92c..e287fae 100644
> --- a/src/bin/lttng-sessiond/ust-consumer.c
> +++ b/src/bin/lttng-sessiond/ust-consumer.c
> @@ -157,7 +157,8 @@ static int ask_channel_creation(struct ust_app_session 
> *ua_sess,
>                       registry->uuid,
>                       chan_id,
>                       ua_chan->tracefile_size,
> -                     ua_chan->tracefile_count);
> +                     ua_chan->tracefile_count,
> +                     ua_sess->id);
>  
>       health_code_update();
>  
> @@ -445,7 +446,7 @@ int ust_consumer_metadata_request(struct consumer_socket 
> *socket)
>               goto end;
>       }
>  
> -     DBG("Metadata request received for session %u, key %" PRIu64,
> +     DBG("Metadata request received for session %" PRIu64 ", key %" PRIu64,
>                       request.session_id, request.key);
>  
>       reg_uid = buffer_reg_uid_find(request.session_id,
> @@ -454,10 +455,10 @@ int ust_consumer_metadata_request(struct 
> consumer_socket *socket)
>               ust_reg = reg_uid->registry->reg.ust;
>       } else {
>               struct buffer_reg_pid *reg_pid =
> -                     buffer_reg_pid_find(request.session_id);
> +                     buffer_reg_pid_find(request.session_id_per_pid);
>               if (!reg_pid) {
> -                     DBG("PID registry not found for session id %u",
> -                                     request.session_id);
> +                     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);
> diff --git a/src/common/consumer.c b/src/common/consumer.c
> index 540c59f..1b319f5 100644
> --- a/src/common/consumer.c
> +++ b/src/common/consumer.c
> @@ -858,7 +858,8 @@ struct lttng_consumer_channel 
> *consumer_allocate_channel(uint64_t key,
>               uint64_t relayd_id,
>               enum lttng_event_output output,
>               uint64_t tracefile_size,
> -             uint64_t tracefile_count)
> +             uint64_t tracefile_count,
> +             uint64_t session_id_per_pid)
>  {
>       struct lttng_consumer_channel *channel;
>  
> @@ -871,6 +872,7 @@ struct lttng_consumer_channel 
> *consumer_allocate_channel(uint64_t key,
>       channel->key = key;
>       channel->refcount = 0;
>       channel->session_id = session_id;
> +     channel->session_id_per_pid = session_id_per_pid;
>       channel->uid = uid;
>       channel->gid = gid;
>       channel->relayd_id = relayd_id;
> diff --git a/src/common/consumer.h b/src/common/consumer.h
> index 650397a..b3810e0 100644
> --- a/src/common/consumer.h
> +++ b/src/common/consumer.h
> @@ -102,6 +102,11 @@ struct lttng_consumer_channel {
>       int refcount;
>       /* Tracing session id on the session daemon side. */
>       uint64_t session_id;
> +     /*
> +      * Session id when requesting metadata to the session daemon for
> +      * a session with per-PID buffers.
> +      */
> +     uint64_t session_id_per_pid;
>       /* Channel trace file path name. */
>       char pathname[PATH_MAX];
>       /* Channel name. */
> @@ -472,7 +477,8 @@ struct lttng_consumer_channel 
> *consumer_allocate_channel(uint64_t key,
>               uint64_t relayd_id,
>               enum lttng_event_output output,
>               uint64_t tracefile_size,
> -             uint64_t tracefile_count);
> +             uint64_t tracefile_count,
> +             uint64_t session_id_per_pid);
>  void consumer_del_stream(struct lttng_consumer_stream *stream,
>               struct lttng_ht *ht);
>  void consumer_del_metadata_stream(struct lttng_consumer_stream *stream,
> diff --git a/src/common/kernel-consumer/kernel-consumer.c 
> b/src/common/kernel-consumer/kernel-consumer.c
> index 11830fc..fc86965 100644
> --- a/src/common/kernel-consumer/kernel-consumer.c
> +++ b/src/common/kernel-consumer/kernel-consumer.c
> @@ -144,7 +144,7 @@ int lttng_kconsumer_recv_cmd(struct 
> lttng_consumer_local_data *ctx,
>                               msg.u.channel.name, msg.u.channel.uid, 
> msg.u.channel.gid,
>                               msg.u.channel.relayd_id, msg.u.channel.output,
>                               msg.u.channel.tracefile_size,
> -                             msg.u.channel.tracefile_count);
> +                             msg.u.channel.tracefile_count, 0);
>               if (new_channel == NULL) {
>                       lttng_consumer_send_error(ctx, 
> LTTCOMM_CONSUMERD_OUTFD_ERROR);
>                       goto end_nosignal;
> diff --git a/src/common/sessiond-comm/sessiond-comm.h 
> b/src/common/sessiond-comm/sessiond-comm.h
> index c0b89a1..64c8d18 100644
> --- a/src/common/sessiond-comm/sessiond-comm.h
> +++ b/src/common/sessiond-comm/sessiond-comm.h
> @@ -150,7 +150,8 @@ enum lttcomm_metadata_command {
>   * per PID registry indexed by session id ignoring the other values.
>   */
>  struct lttcomm_metadata_request_msg {
> -     unsigned int session_id; /* Tracing session id */
> +     uint64_t session_id; /* Tracing session id */
> +     uint64_t session_id_per_pid; /* Tracing session id for per-pid */
>       uint32_t bits_per_long; /* Consumer ABI */
>       uint32_t uid;
>       uint64_t key; /* Metadata channel key. */
> @@ -342,6 +343,7 @@ struct lttcomm_consumer_msg {
>                       uint32_t chan_id;                       /* Channel ID 
> on the tracer side. */
>                       uint64_t tracefile_size;        /* bytes */
>                       uint32_t tracefile_count;       /* number of tracefiles 
> */
> +                     uint64_t session_id_per_pid;    /* Per-pid session ID. 
> */
>               } LTTNG_PACKED ask_channel;
>               struct {
>                       uint64_t key;
> diff --git a/src/common/ust-consumer/ust-consumer.c 
> b/src/common/ust-consumer/ust-consumer.c
> index f783d40..e8e36d7 100644
> --- a/src/common/ust-consumer/ust-consumer.c
> +++ b/src/common/ust-consumer/ust-consumer.c
> @@ -114,13 +114,15 @@ error:
>  static struct lttng_consumer_channel *allocate_channel(uint64_t session_id,
>               const char *pathname, const char *name, uid_t uid, gid_t gid,
>               int relayd_id, uint64_t key, enum lttng_event_output output,
> -             uint64_t tracefile_size, uint64_t tracefile_count)
> +             uint64_t tracefile_size, uint64_t tracefile_count,
> +             uint64_t session_id_per_pid)
>  {
>       assert(pathname);
>       assert(name);
>  
> -     return consumer_allocate_channel(key, session_id, pathname, name, uid, 
> gid,
> -                     relayd_id, output, tracefile_size, tracefile_count);
> +     return consumer_allocate_channel(key, session_id, pathname, name, uid,
> +                     gid, relayd_id, output, tracefile_size,
> +                     tracefile_count, session_id_per_pid);
>  }
>  
>  /*
> @@ -924,7 +926,8 @@ int lttng_ustconsumer_recv_cmd(struct 
> lttng_consumer_local_data *ctx,
>                               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.tracefile_count,
> +                             msg.u.ask_channel.session_id_per_pid);
>               if (!channel) {
>                       goto end_channel_error;
>               }
> @@ -1500,10 +1503,13 @@ int lttng_ustconsumer_request_metadata(struct 
> lttng_consumer_local_data *ctx,
>       }
>  
>       request.session_id = channel->session_id;
> +     request.session_id_per_pid = channel->session_id_per_pid;
>       request.uid = channel->uid;
>       request.key = channel->key;
> -     DBG("Sending metadata request to sessiond, session %" PRIu64,
> -                     channel->session_id);
> +     DBG("Sending metadata request to sessiond, session id %" PRIu64
> +                     ", per-pid %" PRIu64,
> +                     channel->session_id,
> +                     channel->session_id_per_pid);
>  
>       ret = lttcomm_send_unix_sock(ctx->consumer_metadata_socket, &request,
>                       sizeof(request));

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to