+ const uint32_t connection_major = stream->trace->session->major;
+ const uint32_t connection_minor = stream->trace->session->minor;
+ enum lttng_trace_chunk_status chunk_status;
+
+ chunk_status = lttng_index_file_create_from_trace_chunk_read_only(
+ vstream->stream_file.trace_chunk,
+ stream->path_name,
+ stream->channel_name, stream->tracefile_size,
+ vstream->current_tracefile_id,
+ lttng_to_index_major(connection_major,
+ connection_minor),
+ lttng_to_index_minor(connection_major,
+ connection_minor),
+ true, &vstream->index_file);
+ if (chunk_status != LTTNG_TRACE_CHUNK_STATUS_OK) {
+ if (chunk_status == LTTNG_TRACE_CHUNK_STATUS_NO_FILE) {
+ vstream->index_file = NULL;
+ } else {
+ goto error_unlock;
+ }
+ }
+ }
+
+ /*
+ * If we never received a data file for the current stream, delay the
+ * opening, otherwise open it right now.
+ */
+ if (stream->stream_fd) {
+ int fd, ret;
+ char file_path[LTTNG_PATH_MAX];
+ enum lttng_trace_chunk_status status;
+
+ ret = utils_stream_file_path(stream->path_name,
+ stream->channel_name, stream->tracefile_size,
+ vstream->current_tracefile_id, NULL, file_path,
+ sizeof(file_path));
+ if (ret < 0) {
+ goto error_unlock;
+ }
+
+ status = lttng_trace_chunk_open_file(
+ vstream->stream_file.trace_chunk,
+ file_path, O_RDONLY, 0, &fd, true);
+ if (status != LTTNG_TRACE_CHUNK_STATUS_OK) {
+ goto error_unlock;
+ }
+ vstream->stream_file.fd = stream_fd_create(fd);
+ if (!vstream->stream_file.fd) {
+ if (close(fd)) {
+ PERROR("Failed to close viewer %sfile",
+ stream->is_metadata ? "metadata " : "");
+ }