X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fconsumer%2Fconsumer.h;h=af36de11c2504b39e23039a2cff1235385443267;hb=e8360425c2fd0f8cfef1e678af5adfde7ae0a68e;hp=a7d0ee1a706cc719f6877b168a6819f97f72b0ac;hpb=d9a2e16ee3abce83801f58473831330aa8a5463b;p=lttng-tools.git diff --git a/src/common/consumer/consumer.h b/src/common/consumer/consumer.h index a7d0ee1a7..af36de11c 100644 --- a/src/common/consumer/consumer.h +++ b/src/common/consumer/consumer.h @@ -62,7 +62,10 @@ enum lttng_consumer_command { LTTNG_CONSUMER_LOST_PACKETS, LTTNG_CONSUMER_CLEAR_QUIESCENT_CHANNEL, LTTNG_CONSUMER_SET_CHANNEL_MONITOR_PIPE, + LTTNG_CONSUMER_SET_CHANNEL_ROTATE_PIPE, + LTTNG_CONSUMER_ROTATE_CHANNEL, LTTNG_CONSUMER_ROTATE_RENAME, + LTTNG_CONSUMER_ROTATE_PENDING_RELAY, LTTNG_CONSUMER_MKDIR, }; @@ -228,6 +231,20 @@ struct lttng_consumer_channel { uint64_t lost_packets; bool streams_sent_to_relayd; + + /* + * Account how many streams are waiting for their rotation to be + * complete. When this number reaches 0, we inform the session + * daemon that this channel has finished its rotation. + */ + uint64_t nr_stream_rotate_pending; + + /* + * The chunk id where we currently write the data. This value is sent + * to the relay when we add a stream and when a stream rotates. This + * allows to keep track of where each stream on the relay is writing. + */ + uint64_t current_chunk_id; }; /* @@ -415,6 +432,14 @@ struct lttng_consumer_stream { pthread_cond_t metadata_rdv; pthread_mutex_t metadata_rdv_lock; + /* + * rotate_position represents the position in the ring-buffer that has to + * be flushed to disk to complete the ongoing rotation. When that position + * is reached, this tracefile can be closed and a new one is created in + * channel_read_only_attributes.path. + */ + unsigned long rotate_position; + /* * Read-only copies of channel values. We cannot safely access the * channel from a stream, so we need to have a local copy of these @@ -426,6 +451,12 @@ struct lttng_consumer_stream { uint64_t tracefile_size; } channel_read_only_attributes; + /* + * Flag to inform the data or metadata thread that a stream is + * ready to be rotated. + */ + bool rotate_ready; + /* Indicate if the stream still has some data to be read. */ unsigned int has_data:1; /* @@ -565,6 +596,11 @@ struct lttng_consumer_local_data { * to the session daemon (write-only). */ int channel_monitor_pipe; + /* + * Pipe used to inform the session daemon that a stream has finished + * its rotation (write-only). + */ + int channel_rotate_pipe; }; /* @@ -744,9 +780,12 @@ ssize_t lttng_consumer_on_read_subbuffer_splice( struct lttng_consumer_stream *stream, unsigned long len, unsigned long padding, struct ctf_packet_index *index); +int lttng_consumer_sample_snapshot_positions(struct lttng_consumer_stream *stream); int lttng_consumer_take_snapshot(struct lttng_consumer_stream *stream); int lttng_consumer_get_produced_snapshot(struct lttng_consumer_stream *stream, unsigned long *pos); +int lttng_consumer_get_consumed_snapshot(struct lttng_consumer_stream *stream, + unsigned long *pos); int lttng_ustconsumer_get_wakeup_fd(struct lttng_consumer_stream *stream); int lttng_ustconsumer_close_wakeup_fd(struct lttng_consumer_stream *stream); void *consumer_thread_metadata_poll(void *data); @@ -780,8 +819,19 @@ void consumer_del_stream_for_data(struct lttng_consumer_stream *stream); void consumer_add_metadata_stream(struct lttng_consumer_stream *stream); void consumer_del_stream_for_metadata(struct lttng_consumer_stream *stream); int consumer_create_index_file(struct lttng_consumer_stream *stream); +int lttng_consumer_rotate_channel(uint64_t key, const char *path, + uint64_t relayd_id, uint32_t metadata, + uint64_t new_chunk_id, struct lttng_consumer_local_data *ctx); +int lttng_consumer_stream_is_rotate_ready(struct lttng_consumer_stream *stream); +int lttng_consumer_rotate_stream(struct lttng_consumer_local_data *ctx, + struct lttng_consumer_stream *stream, bool *rotated); +int lttng_consumer_rotate_ready_streams(uint64_t key, + struct lttng_consumer_local_data *ctx); int lttng_consumer_rotate_rename(const char *current_path, const char *new_path, uid_t uid, gid_t gid, uint64_t relayd_id); +int lttng_consumer_rotate_pending_relay( uint64_t session_id, + uint64_t relayd_id, uint64_t chunk_id); +void lttng_consumer_reset_stream_rotate_state(struct lttng_consumer_stream *stream); int lttng_consumer_mkdir(const char *path, uid_t uid, gid_t gid, uint64_t relayd_id);