Fix: relayd: failure to read index entry or stream packet after clear
[lttng-tools.git] / src / bin / lttng-relayd / viewer-stream.h
index cc46db4e2a3545cb283ddb5c3260001bcf82d320..e7d733b9e60ecb10479992b5e74042089e824cdb 100644 (file)
@@ -2,22 +2,12 @@
 #define _VIEWER_STREAM_H
 
 /*
- * Copyright (C) 2013 Julien Desfossez <jdesfossez@efficios.com>
- *                      David Goulet <dgoulet@efficios.com>
- *               2015 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright (C) 2013 Julien Desfossez <jdesfossez@efficios.com>
+ * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #include <limits.h>
@@ -45,24 +35,38 @@ struct relay_stream;
  */
 struct relay_viewer_stream {
        struct urcu_ref ref;
-       pthread_mutex_t reflock;
 
        /* Back ref to stream. */
        struct relay_stream *stream;
 
-       /* FD from which to read the stream data. */
-       struct stream_fd *stream_fd;
-       /* FD from which to read the index data. */
-       struct stream_fd *index_fd;
+       struct {
+               struct fs_handle *handle;
+               struct lttng_trace_chunk *trace_chunk;
+       } stream_file;
+       /* index file from which to read the index data. */
+       struct lttng_index_file *index_file;
+       /*
+        * Last seen rotation count in stream.
+        *
+        * Sampled on every change to the viewer stream trace chunk,
+        * this allows the live server to determine if it saw the latest
+        * rotation that occurred on the receiving end.
+        */
+       uint64_t last_seen_rotation_count;
 
        char *path_name;
        char *channel_name;
 
        uint64_t current_tracefile_id;
-       /* Free-running counter. */
-       uint64_t current_tracefile_seq;
 
-       uint64_t last_sent_index;
+       /*
+        * Counts the number of sent indexes. The "tag" associated
+        * with an index to send is the current index_received_seqcount,
+        * because we increment index_received_seqcount after sending
+        * each index. This index_received_seqcount counter can also be
+        * updated when catching up with the producer.
+        */
+       uint64_t index_sent_seqcount;
 
        /* Indicates if this stream has been sent to a viewer client. */
        bool sent_flag;
@@ -74,6 +78,7 @@ struct relay_viewer_stream {
 };
 
 struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream,
+               struct lttng_trace_chunk *viewer_trace_chunk,
                enum lttng_viewer_seek seek_t);
 
 struct relay_viewer_stream *viewer_stream_get_by_id(uint64_t id);
@@ -83,5 +88,7 @@ int viewer_stream_rotate(struct relay_viewer_stream *vstream);
 bool viewer_stream_is_tracefile_seq_readable(struct relay_viewer_stream *vstream,
                uint64_t seq);
 void print_viewer_streams(void);
+void viewer_stream_close_files(struct relay_viewer_stream *vstream);
+void viewer_stream_sync_tracefile_array_tail(struct relay_viewer_stream *vstream);
 
 #endif /* _VIEWER_STREAM_H */
This page took 0.024629 seconds and 4 git commands to generate.