Fix: consumer: Move sanity check within `consumer_subbuffer` functions
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Thu, 9 Jul 2020 21:38:17 +0000 (17:38 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 29 Jul 2020 17:02:52 +0000 (13:02 -0400)
The sanity check on the number bytes written by the `consumer_subbuffer`
callback was not correct channel configured in the splice output type in
a live session.

To simplify this, move checks in the callback themselves so they can be
specialized.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I4e47a305860684c461ba7ffffd5e3bb3a21990b0

src/common/consumer/consumer-stream.c
src/common/consumer/consumer.c

index 1f0aad00b5b05a5fd37ce2646d5e56a24a95a421..532675c809b9f793939634e23ba8b92efeca8510 100644 (file)
@@ -161,9 +161,40 @@ static ssize_t consumer_stream_consume_mmap(
        const unsigned long padding_size =
                        subbuffer->info.data.padded_subbuf_size -
                        subbuffer->info.data.subbuf_size;
-
-       return lttng_consumer_on_read_subbuffer_mmap(
+       const ssize_t written_bytes = lttng_consumer_on_read_subbuffer_mmap(
                        stream, &subbuffer->buffer.buffer, padding_size);
+
+       if (stream->net_seq_idx == -1ULL) {
+               /*
+                * When writing on disk, check that only the subbuffer (no
+                * padding) was written to disk.
+                */
+               if (written_bytes != subbuffer->info.data.padded_subbuf_size) {
+                       DBG("Failed to write the entire padded subbuffer on disk (written_bytes: %zd, padded subbuffer size %lu)",
+                                       written_bytes,
+                                       subbuffer->info.data.padded_subbuf_size);
+               }
+       } else {
+               /*
+                * When streaming over the network, check that the entire
+                * subbuffer including padding was successfully written.
+                */
+               if (written_bytes != subbuffer->info.data.subbuf_size) {
+                       DBG("Failed to write only the subbuffer over the network (written_bytes: %zd, subbuffer size %lu)",
+                                       written_bytes,
+                                       subbuffer->info.data.subbuf_size);
+               }
+       }
+
+       /*
+        * If `lttng_consumer_on_read_subbuffer_mmap()` returned an error, pass
+        * it along to the caller, else return zero.
+        */
+       if (written_bytes < 0) {
+               ERR("Error reading mmap subbuffer: %zd", written_bytes);
+       }
+
+       return written_bytes;
 }
 
 static ssize_t consumer_stream_consume_splice(
@@ -171,8 +202,24 @@ static ssize_t consumer_stream_consume_splice(
                struct lttng_consumer_stream *stream,
                const struct stream_subbuffer *subbuffer)
 {
-       return lttng_consumer_on_read_subbuffer_splice(ctx, stream,
-                       subbuffer->info.data.padded_subbuf_size, 0);
+       const ssize_t written_bytes = lttng_consumer_on_read_subbuffer_splice(
+                       ctx, stream, subbuffer->info.data.padded_subbuf_size, 0);
+
+       if (written_bytes != subbuffer->info.data.padded_subbuf_size) {
+               DBG("Failed to write the entire padded subbuffer (written_bytes: %zd, padded subbuffer size %lu)",
+                               written_bytes,
+                               subbuffer->info.data.padded_subbuf_size);
+       }
+
+       /*
+        * If `lttng_consumer_on_read_subbuffer_splice()` returned an error,
+        * pass it along to the caller, else return zero.
+        */
+       if (written_bytes < 0) {
+               ERR("Error reading splice subbuffer: %zd", written_bytes);
+       }
+
+       return written_bytes;
 }
 
 static int consumer_stream_send_index(
index 1b46a707146204e3e823462be801befa5c2853e8..628fa1842128f96ac774c6ff78a214fb097d7e53 100644 (file)
@@ -3360,24 +3360,10 @@ ssize_t lttng_consumer_read_subbuffer(struct lttng_consumer_stream *stream,
 
        written_bytes = stream->read_subbuffer_ops.consume_subbuffer(
                        ctx, stream, &subbuffer);
-       /*
-        * Should write subbuf_size amount of data when network streaming or
-        * the full padded size when we are not streaming.
-        */
-       if ((written_bytes != subbuffer.info.data.subbuf_size &&
-                           stream->net_seq_idx != (uint64_t) -1ULL) ||
-                       (written_bytes != subbuffer.info.data.padded_subbuf_size &&
-                                       stream->net_seq_idx ==
-                                                       (uint64_t) -1ULL)) {
-               /*
-                * Display the error but continue processing to try to
-                * release the subbuffer. This is a DBG statement
-                * since this can happen without being a critical
-                * error.
-                */
-               DBG("Failed to write to tracefile (written_bytes: %zd != padded subbuffer size: %lu, subbuffer size: %lu)",
-                               written_bytes, subbuffer.info.data.padded_subbuf_size,
-                               subbuffer.info.data.subbuf_size);
+       if (written_bytes <= 0) {
+               ERR("Error consuming subbuffer: (%zd)", written_bytes);
+               ret = (int) written_bytes;
+               goto error_put_subbuf;
        }
 
        ret = stream->read_subbuffer_ops.put_next_subbuffer(stream, &subbuffer);
This page took 0.028315 seconds and 4 git commands to generate.