From: Julien Desfossez Date: Fri, 14 Feb 2014 20:51:34 +0000 (-0500) Subject: Fix: deadlock during rotation X-Git-Tag: v2.5.0-rc1~172 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=56611b069e7d0a64148cd990f88b4090298a9a0f Fix: deadlock during rotation The overwrite_lock is nested inside the viewer_stream_rotation_lock. And the viewer_stream_rotate function is always called with the viewer_stream_rotation_lock held. Signed-off-by: Julien Desfossez Signed-off-by: David Goulet --- diff --git a/src/bin/lttng-relayd/live.c b/src/bin/lttng-relayd/live.c index d29804cd6..a720ed732 100644 --- a/src/bin/lttng-relayd/live.c +++ b/src/bin/lttng-relayd/live.c @@ -1337,11 +1337,13 @@ int viewer_get_next_index(struct relay_connection *conn) viewer_index.flags |= LTTNG_VIEWER_FLAG_NEW_STREAM; } + pthread_mutex_lock(&rstream->viewer_stream_rotation_lock); pthread_mutex_lock(&vstream->overwrite_lock); if (vstream->abort_flag) { /* The file is being overwritten by the writer, we cannot use it. */ pthread_mutex_unlock(&vstream->overwrite_lock); ret = viewer_stream_rotate(vstream, rstream); + pthread_mutex_unlock(&rstream->viewer_stream_rotation_lock); if (ret < 0) { goto end_unlock; } else if (ret == 1) { @@ -1357,6 +1359,7 @@ int viewer_get_next_index(struct relay_connection *conn) read_ret = lttng_read(vstream->index_read_fd, &packet_index, sizeof(packet_index)); pthread_mutex_unlock(&vstream->overwrite_lock); + pthread_mutex_unlock(&rstream->viewer_stream_rotation_lock); if (read_ret < 0) { viewer_index.status = htobe32(LTTNG_VIEWER_INDEX_HUP); viewer_stream_delete(vstream); diff --git a/src/bin/lttng-relayd/viewer-stream.c b/src/bin/lttng-relayd/viewer-stream.c index 8ed84a1d1..5ab7be790 100644 --- a/src/bin/lttng-relayd/viewer-stream.c +++ b/src/bin/lttng-relayd/viewer-stream.c @@ -196,6 +196,7 @@ end: /* * Rotate a stream to the next tracefile. * + * Must be called with viewer_stream_rotation_lock held. * Returns 0 on success, 1 on EOF, a negative value on error. */ int viewer_stream_rotate(struct relay_viewer_stream *vstream, @@ -224,12 +225,6 @@ int viewer_stream_rotate(struct relay_viewer_stream *vstream, goto end; } - /* - * Lock to execute rotation in order to avoid races between a modification - * on the index values. - */ - pthread_mutex_lock(&stream->viewer_stream_rotation_lock); - /* * The writer and the reader are not working in the same tracefile, we can * read up to EOF, we don't care about the total_index_received. @@ -264,8 +259,6 @@ int viewer_stream_rotate(struct relay_viewer_stream *vstream, vstream->abort_flag = 0; pthread_mutex_unlock(&vstream->overwrite_lock); - pthread_mutex_unlock(&stream->viewer_stream_rotation_lock); - ret = index_open(vstream->path_name, vstream->channel_name, vstream->tracefile_count, vstream->tracefile_count_current); if (ret < 0) {