Fix: consumer should await for initial streams
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index cd814b8a7f92d5e482d1fd142fb3a6d2dbb68e8c..5a219fc0b6c543d5c0f5270c3febd4ccfb4adb3a 100644 (file)
@@ -118,7 +118,8 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                new_channel = consumer_allocate_channel(msg.u.channel.channel_key,
                                -1, -1,
                                msg.u.channel.mmap_len,
-                               msg.u.channel.max_sb_size);
+                               msg.u.channel.max_sb_size,
+                               msg.u.channel.nb_init_streams);
                if (new_channel == NULL) {
                        lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_OUTFD_ERROR);
                        goto end_nosignal;
@@ -337,8 +338,12 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                padding = 0;
 
                /* splice the subbuffer to the tracefile */
-               ret = lttng_consumer_on_read_subbuffer_splice(ctx, stream,
-                               subbuf_size, padding);
+               ret = lttng_consumer_on_read_subbuffer_splice(ctx, stream, subbuf_size,
+                               padding);
+               /*
+                * XXX: Splice does not support network streaming so the return value
+                * is simply checked against subbuf_size and not like the mmap() op.
+                */
                if (ret != subbuf_size) {
                        /*
                         * display the error but continue processing to try
@@ -364,15 +369,22 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                padding = len - subbuf_size;
 
                /* write the subbuffer to the tracefile */
-               ret = lttng_consumer_on_read_subbuffer_mmap(ctx, stream,
-                               subbuf_size, padding);
-               if (ret != subbuf_size) {
+               ret = lttng_consumer_on_read_subbuffer_mmap(ctx, stream, subbuf_size,
+                               padding);
+               /*
+                * The mmap operation should write subbuf_size amount of data when
+                * network streaming or the full padding (len) size when we are _not_
+                * streaming.
+                */
+               if ((ret != subbuf_size && stream->net_seq_idx != -1) ||
+                               (ret != len && stream->net_seq_idx == -1)) {
                        /*
-                        * display the error but continue processing to try
-                        * to release the subbuffer
+                        * Display the error but continue processing to try to release the
+                        * subbuffer
                         */
-                       ERR("Error writing to tracefile (ret: %zd != len: %lu",
-                                       ret, subbuf_size);
+                       ERR("Error writing to tracefile "
+                                       "(ret: %zd != len: %lu != subbuf_size: %lu)",
+                                       ret, len, subbuf_size);
                }
                break;
        default:
This page took 0.02397 seconds and 4 git commands to generate.