Fix: initialize kernel stream max subbuffer size on creation
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 8 Aug 2019 20:39:56 +0000 (16:39 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 5 Sep 2019 20:39:14 +0000 (16:39 -0400)
A consumer stream's maximal subbuffer size is only initialized while
taking a snapshot. This unexpectedly leaves the max_sb_size at 0
causing the rotation target sequence number computation to crash with
a SIGFPE.

This fix initializes the value as soon as possible to provide a
behaviour in line with that of the ust-consumer.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/kernel-consumer/kernel-consumer.c

index 29ccd0f091d7c7c55ed95b0465d489d54ea2e0fc..9742ea0844d79d5b64a1e9888d7b8bb54217c332 100644 (file)
@@ -231,15 +231,6 @@ static int lttng_kconsumer_snapshot_channel(
                        goto end_unlock;
                }
 
-               if (stream->max_sb_size == 0) {
-                       ret = kernctl_get_max_subbuf_size(stream->wait_fd,
-                                       &stream->max_sb_size);
-                       if (ret < 0) {
-                               ERR("Getting kernel max_sb_size");
-                               goto end_unlock;
-                       }
-               }
-
                consumed_pos = consumer_get_consume_start_pos(consumed_pos,
                                produced_pos, nb_packets_per_stream,
                                stream->max_sb_size);
@@ -668,6 +659,14 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
                new_stream->chan = channel;
                new_stream->wait_fd = fd;
+               ret = kernctl_get_max_subbuf_size(new_stream->wait_fd,
+                               &new_stream->max_sb_size);
+               if (ret < 0) {
+                       pthread_mutex_unlock(&channel->lock);
+                       ERR("Failed to get kernel maximal subbuffer size");
+                       goto end_nosignal;
+               }
+
                consumer_stream_update_channel_attributes(new_stream,
                                channel);
                switch (channel->output) {
This page took 0.027089 seconds and 4 git commands to generate.