Fix: kernel consumer: signal metadata ready condition variable
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 30 Apr 2021 14:44:44 +0000 (10:44 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 30 Apr 2021 23:04:51 +0000 (19:04 -0400)
The behaviour of the kernel consumer does not match that of the user
space consumer. When a live metadata stream goes back to "sleep", it
must broadcast on the metadata_rdv to wake-up any thread that is
performing a metadata sync.

This mismatch causes a hang in the kernel consumer during the kernel
clear tests.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ief15fc2b7c92582ea36bf64d185720e48d2c94d5

src/common/kernel-consumer/kernel-consumer.c

index 4f734294caa553477f46eb0858edc45b3476b1e9..46a9f52c0ac2406787f2743213da3380b2a503d4 100644 (file)
@@ -1710,6 +1710,14 @@ bool is_get_next_check_metadata_available(int tracer_fd)
        return available;
 }
 
+static
+int signal_metadata(struct lttng_consumer_stream *stream,
+               struct lttng_consumer_local_data *ctx)
+{
+       ASSERT_LOCKED(stream->metadata_rdv_lock);
+       return pthread_cond_broadcast(&stream->metadata_rdv) ? -errno : 0;
+}
+
 static
 int lttng_kconsumer_set_stream_ops(
                struct lttng_consumer_stream *stream)
@@ -1740,6 +1748,8 @@ int lttng_kconsumer_set_stream_ops(
                        metadata_bucket_destroy(stream->metadata_bucket);
                        stream->metadata_bucket = NULL;
                }
+
+               stream->read_subbuffer_ops.on_sleep = signal_metadata;
        }
 
        if (!stream->read_subbuffer_ops.get_next_subbuffer) {
This page took 0.02771 seconds and 4 git commands to generate.