Fix end condition on rotate with live reading
[lttng-tools.git] / src / bin / lttng-relayd / live.c
index 480c459ce6a49724f54d1b6ef71c0b5a6d458a1b..851be9f8e3165c85eb4bcf69bfbeb3d29508dade 100644 (file)
@@ -698,6 +698,7 @@ int init_viewer_stream(struct relay_stream *stream, int seek_last)
                        LTTNG_VIEWER_NAME_MAX);
        viewer_stream->tracefile_count = stream->tracefile_count;
        viewer_stream->metadata_flag = stream->metadata_flag;
+       viewer_stream->tracefile_count_last = -1ULL;
        if (seek_last) {
                viewer_stream->tracefile_count_current =
                        stream->tracefile_count_current;
@@ -764,7 +765,7 @@ error:
 /*
  * Rotate a stream to the next tracefile.
  *
- * Returns 0 on success, a negative value on error.
+ * Returns 0 on success, 1 on EOF, a negative value on error.
  */
 static
 int rotate_viewer_stream(struct relay_viewer_stream *viewer_stream,
@@ -777,6 +778,15 @@ int rotate_viewer_stream(struct relay_viewer_stream *viewer_stream,
 
        tracefile_id = (viewer_stream->tracefile_count_current + 1) %
                viewer_stream->tracefile_count;
+       /*
+        * Detect the last tracefile to open.
+        */
+       if (viewer_stream->tracefile_count_last != -1ULL &&
+                       viewer_stream->tracefile_count_last ==
+                       viewer_stream->tracefile_count_current) {
+               ret = 1;
+               goto end;
+       }
 
        if (stream) {
                pthread_mutex_lock(&stream->viewer_stream_rotation_lock);
@@ -802,26 +812,22 @@ int rotate_viewer_stream(struct relay_viewer_stream *viewer_stream,
        }
        viewer_stream->tracefile_count_current = tracefile_id;
 
-       if (viewer_stream->abort_flag == 0) {
-               if (viewer_stream->index_read_fd > 0) {
-                       ret = close(viewer_stream->index_read_fd);
-                       if (ret < 0) {
-                               PERROR("close index file %d",
-                                               viewer_stream->index_read_fd);
-                       }
-                       viewer_stream->index_read_fd = -1;
-               }
-               if (viewer_stream->read_fd > 0) {
-                       ret = close(viewer_stream->read_fd);
-                       if (ret < 0) {
-                               PERROR("close tracefile %d",
-                                               viewer_stream->read_fd);
-                       }
-                       viewer_stream->read_fd = -1;
-               }
-       } else {
-               viewer_stream->abort_flag = 0;
+       ret = close(viewer_stream->index_read_fd);
+       if (ret < 0) {
+               PERROR("close index file %d",
+                               viewer_stream->index_read_fd);
        }
+       viewer_stream->index_read_fd = -1;
+       ret = close(viewer_stream->read_fd);
+       if (ret < 0) {
+               PERROR("close tracefile %d",
+                               viewer_stream->read_fd);
+       }
+       viewer_stream->read_fd = -1;
+
+       pthread_mutex_lock(&viewer_stream->overwrite_lock);
+       viewer_stream->abort_flag = 0;
+       pthread_mutex_unlock(&viewer_stream->overwrite_lock);
 
        viewer_stream->index_read_fd = -1;
        viewer_stream->read_fd = -1;
@@ -836,6 +842,7 @@ int rotate_viewer_stream(struct relay_viewer_stream *viewer_stream,
 
        ret = 0;
 
+end:
 error:
        return ret;
 }
@@ -1134,6 +1141,9 @@ int viewer_get_next_index(struct relay_command *cmd,
                        ret = rotate_viewer_stream(vstream, rstream);
                        if (ret < 0) {
                                goto end_unlock;
+                       } else if (ret == 1) {
+                               viewer_index.status = htobe32(VIEWER_INDEX_HUP);
+                               goto send_reply;
                        }
                }
                pthread_mutex_lock(&rstream->viewer_stream_rotation_lock);
@@ -1184,6 +1194,9 @@ int viewer_get_next_index(struct relay_command *cmd,
                ret = rotate_viewer_stream(vstream, rstream);
                if (ret < 0) {
                        goto end_unlock;
+               } else if (ret == 1) {
+                       viewer_index.status = htobe32(VIEWER_INDEX_HUP);
+                       goto send_reply;
                }
                goto send_reply;
        }
@@ -1200,6 +1213,9 @@ int viewer_get_next_index(struct relay_command *cmd,
                        ret = rotate_viewer_stream(vstream, rstream);
                        if (ret < 0) {
                                goto end_unlock;
+                       } else if (ret == 1) {
+                               viewer_index.status = htobe32(VIEWER_INDEX_HUP);
+                               goto send_reply;
                        }
                } else {
                        PERROR("Relay reading index file %d",
This page took 0.026841 seconds and 5 git commands to generate.