Fix: Empty metadata buffer(s) on HUP|ERR
authorDavid Goulet <dgoulet@efficios.com>
Tue, 16 Oct 2012 18:21:29 +0000 (14:21 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Tue, 16 Oct 2012 18:21:29 +0000 (14:21 -0400)
The metadata fd was not emptying all the buffers on POLLHUP | POLLERR.
This patch makes the read subbuffer operation, for hung up metadata fd,
loop until the returned len is a negative value. For user space tracing,
-EAGAIN is returned and -ENODATA for the kernel tracer.

We also fixes another issue where an error returned (not -EAGAIN) by the
read subbuffer function call was stopping the thread. Now, the fd is
removed from the poll set, the stream is freed and the thread continues.

Fixes #378

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

index 242b05b3d6bb9c65939ea72a900a84fa74d382b7..8b43257bd134987a3d0811320276010b724579b3 100644 (file)
@@ -1888,12 +1888,15 @@ restart:
                                        lttng_ustconsumer_on_stream_hangup(stream);
 
                                        /* We just flushed the stream now read it. */
-                                       len = ctx->on_buffer_ready(stream, ctx);
-                                       /* It's ok to have an unavailable sub-buffer */
-                                       if (len < 0 && len != -EAGAIN) {
-                                               rcu_read_unlock();
-                                               goto end;
-                                       }
+                                       do {
+                                               len = ctx->on_buffer_ready(stream, ctx);
+                                               /*
+                                                * We don't check the return value here since if we get
+                                                * a negative len, it means an error occured thus we
+                                                * simply remove it from the poll set and free the
+                                                * stream.
+                                                */
+                                       } while (len > 0);
                                }
 
                                lttng_poll_del(&events, stream->wait_fd);
This page took 0.027907 seconds and 4 git commands to generate.