When we send an empty index (beacon), we need to extract the stream_id
to avoid stalling the client on inactive streams on startup.
Since the live clients need to know this feature is implemented, we had
to bump the lttng-live protocol version.
This fix should be backported to stable-2.4 as well.
Refs: #811
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
*/
index->status = htobe32(LTTNG_VIEWER_INDEX_INACTIVE);
index->timestamp_end = htobe64(rstream->beacon_ts_end);
*/
index->status = htobe32(LTTNG_VIEWER_INDEX_INACTIVE);
index->timestamp_end = htobe64(rstream->beacon_ts_end);
+ index->stream_id = htobe64(rstream->ctf_stream_id);
goto index_ready;
} else if (rstream->total_index_received <= vstream->last_sent_index
&& !vstream->close_write_flag) {
goto index_ready;
} else if (rstream->total_index_received <= vstream->last_sent_index
&& !vstream->close_write_flag) {
stream->session_id = session->id;
stream->index_fd = -1;
stream->read_index_fd = -1;
stream->session_id = session->id;
stream->index_fd = -1;
stream->read_index_fd = -1;
+ stream->ctf_stream_id = -1ULL;
lttng_ht_node_init_u64(&stream->node, stream->stream_handle);
pthread_mutex_init(&stream->lock, NULL);
lttng_ht_node_init_u64(&stream->node, stream->stream_handle);
pthread_mutex_init(&stream->lock, NULL);
}
copy_index_control_data(index, &index_info);
}
copy_index_control_data(index, &index_info);
+ if (stream->ctf_stream_id == -1ULL) {
+ stream->ctf_stream_id = be64toh(index_info.stream_id);
+ }
* timestamp end, when it is active, this field == -1ULL.
*/
uint64_t beacon_ts_end;
* timestamp end, when it is active, this field == -1ULL.
*/
uint64_t beacon_ts_end;
+ /*
+ * CTF stream ID, -1ULL when unset.
+ */
+ uint64_t ctf_stream_id;
/*
* To protect the update of the close_write_flag and the checks of
* the tracefile_count_current.
/*
* To protect the update of the close_write_flag and the checks of
* the tracefile_count_current.
#include <common/kernel-ctl/kernel-ctl.h>
#include <common/kernel-consumer/kernel-consumer.h>
#include <common/consumer-stream.h>
#include <common/kernel-ctl/kernel-ctl.h>
#include <common/kernel-consumer/kernel-consumer.h>
#include <common/consumer-stream.h>
+#include <lttng/ust-ctl.h>
#include "consumer-timer.h"
#include "consumer-testpoint.h"
#include "consumer-timer.h"
#include "consumer-testpoint.h"
-static int send_empty_index(struct lttng_consumer_stream *stream, uint64_t ts)
+static int send_empty_index(struct lttng_consumer_stream *stream, uint64_t ts,
+ uint64_t stream_id)
{
int ret;
struct ctf_packet_index index;
memset(&index, 0, sizeof(index));
{
int ret;
struct ctf_packet_index index;
memset(&index, 0, sizeof(index));
+ index.stream_id = htobe64(stream_id);
index.timestamp_end = htobe64(ts);
ret = consumer_stream_write_index(stream, &index);
if (ret < 0) {
index.timestamp_end = htobe64(ts);
ret = consumer_stream_write_index(stream, &index);
if (ret < 0) {
static int check_kernel_stream(struct lttng_consumer_stream *stream)
{
static int check_kernel_stream(struct lttng_consumer_stream *stream)
{
+ uint64_t ts, stream_id;
ret = -1;
goto error_unlock;
}
ret = -1;
goto error_unlock;
}
+ ret = kernctl_get_stream_id(stream->wait_fd, &stream_id);
+ if (ret < 0) {
+ PERROR("kernctl_get_stream_id");
+ goto error_unlock;
+ }
DBG("Stream %" PRIu64 " empty, sending beacon", stream->key);
DBG("Stream %" PRIu64 " empty, sending beacon", stream->key);
- ret = send_empty_index(stream, ts);
+ ret = send_empty_index(stream, ts, stream_id);
if (ret < 0) {
goto error_unlock;
}
if (ret < 0) {
goto error_unlock;
}
static int check_ust_stream(struct lttng_consumer_stream *stream)
{
static int check_ust_stream(struct lttng_consumer_stream *stream)
{
+ uint64_t ts, stream_id;
ret = -1;
goto error_unlock;
}
ret = -1;
goto error_unlock;
}
+ ret = ustctl_get_stream_id(stream->ustream, &stream_id);
+ if (ret < 0) {
+ PERROR("ustctl_get_stream_id");
+ goto error_unlock;
+ }
DBG("Stream %" PRIu64 " empty, sending beacon", stream->key);
DBG("Stream %" PRIu64 " empty, sending beacon", stream->key);
- ret = send_empty_index(stream, ts);
+ ret = send_empty_index(stream, ts, stream_id);
if (ret < 0) {
goto error_unlock;
}
if (ret < 0) {
goto error_unlock;
}