Fix: Consumer return value check after mmap/splice
authorDavid Goulet <dgoulet@efficios.com>
Mon, 17 Sep 2012 15:57:07 +0000 (11:57 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 17 Sep 2012 15:57:07 +0000 (11:57 -0400)
With the feature of not sending the trace file padding over the network
for streaming, the return value of mmap or splice failed to match the
passed value when the trace is written on disk since we ignore the
padding for that case.

However, this was simply to print an error message so no behavior is
changed with this patch.

Detail comments were added to explain this "complex" return value check.

Signed-off-by: David Goulet <dgoulet@efficios.com>
src/common/kernel-consumer/kernel-consumer.c
src/common/ust-consumer/ust-consumer.c

index cd814b8a7f92d5e482d1fd142fb3a6d2dbb68e8c..f910f033d9ea96e283f3ee5705e6cf9d599efef8 100644 (file)
@@ -337,8 +337,12 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                padding = 0;
 
                /* splice the subbuffer to the tracefile */
                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
                if (ret != subbuf_size) {
                        /*
                         * display the error but continue processing to try
@@ -364,15 +368,22 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                padding = len - subbuf_size;
 
                /* write the subbuffer to the tracefile */
                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:
                }
                break;
        default:
index e7d6dd4e780084879759055fe839e018f6d02048..8ab2b819dcee52a237518b1ce6f8cba5f3e1aa1f 100644 (file)
@@ -452,12 +452,20 @@ int lttng_ustconsumer_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);
        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) {
+       /*
+        * 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 (expected: %ld, got: %ld)", ret, len);
+               ERR("Error writing to tracefile "
+                               "(ret: %zd != len: %lu != subbuf_size: %lu)",
+                               ret, len, subbuf_size);
+
        }
        err = ustctl_put_next_subbuf(handle, buf);
        assert(err == 0);
        }
        err = ustctl_put_next_subbuf(handle, buf);
        assert(err == 0);
This page took 0.030944 seconds and 5 git commands to generate.