X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fconsumer%2Fconsumer.h;h=72c580eb2e1be87894d98a4c40e83a09ce07b8a5;hp=0c757b84fb3c56b4399afee157d47fe0808b398a;hb=c70636a7342f34e3be68fcf411cf3e3718b8e73f;hpb=28cc88f3d462587c4fe37497b728fdb7cbc73e97 diff --git a/src/common/consumer/consumer.h b/src/common/consumer/consumer.h index 0c757b84f..72c580eb2 100644 --- a/src/common/consumer/consumer.h +++ b/src/common/consumer/consumer.h @@ -30,11 +30,12 @@ #include #include -#include +#include #include #include #include #include +#include /* Commands for consumer */ enum lttng_consumer_command { @@ -65,17 +66,10 @@ enum lttng_consumer_command { LTTNG_CONSUMER_CLEAR_QUIESCENT_CHANNEL, LTTNG_CONSUMER_SET_CHANNEL_MONITOR_PIPE, LTTNG_CONSUMER_ROTATE_CHANNEL, - LTTNG_CONSUMER_ROTATE_RENAME, - LTTNG_CONSUMER_CHECK_ROTATION_PENDING_LOCAL, - LTTNG_CONSUMER_CHECK_ROTATION_PENDING_RELAY, - LTTNG_CONSUMER_MKDIR, -}; - -/* State of each fd in consumer */ -enum lttng_consumer_stream_state { - LTTNG_CONSUMER_ACTIVE_STREAM, - LTTNG_CONSUMER_PAUSE_STREAM, - LTTNG_CONSUMER_DELETE_STREAM, + LTTNG_CONSUMER_INIT, + LTTNG_CONSUMER_CREATE_TRACE_CHUNK, + LTTNG_CONSUMER_CLOSE_TRACE_CHUNK, + LTTNG_CONSUMER_TRACE_CHUNK_EXISTS, }; enum lttng_consumer_type { @@ -111,6 +105,14 @@ struct stream_list { struct consumer_metadata_cache; struct lttng_consumer_channel { + /* Is the channel published in the channel hash tables? */ + bool is_published; + /* + * Was the channel deleted (logically) and waiting to be reclaimed? + * If this flag is set, no modification that is not cleaned-up by the + * RCU reclamation callback should be made + */ + bool is_deleted; /* HT node used for consumer_data.channel_ht */ struct lttng_ht_node_u64 node; /* HT node used for consumer_data.channels_by_session_id_ht */ @@ -121,18 +123,27 @@ struct lttng_consumer_channel { int refcount; /* Tracing session id on the session daemon side. */ uint64_t session_id; + /* Current trace chunk of the session in which this channel exists. */ + struct lttng_trace_chunk *trace_chunk; /* * Session id when requesting metadata to the session daemon for * a session with per-PID buffers. */ uint64_t session_id_per_pid; - /* Channel trace file path name. */ + /* + * In the case of local streams, this field contains the channel's + * output path; a path relative to the session's output path. + * e.g. ust/uid/1000/64-bit + * + * In the case of remote streams, the contents of this field depends + * on the version of the relay daemon peer. For 2.11+ peers, the + * contents are the same as in the local case. However, for legacy + * peers, this contains a path of the form: + * /hostname/session_path/ust/uid/1000/64-bit + */ char pathname[PATH_MAX]; /* Channel name. */ char name[LTTNG_SYMBOL_NAME_LEN]; - /* UID and GID of the session owning this channel. */ - uid_t uid; - gid_t gid; /* Relayd id of the channel. -1ULL if it does not apply. */ uint64_t relayd_id; /* @@ -148,7 +159,7 @@ struct lttng_consumer_channel { /* For UST */ uid_t ust_app_uid; /* Application UID. */ struct ustctl_consumer_channel *uchan; - unsigned char uuid[UUID_STR_LEN]; + unsigned char uuid[LTTNG_UUID_STR_LEN]; /* * Temporary stream list used to store the streams once created and waiting * to be sent to the session daemon by receiving the @@ -229,19 +240,14 @@ struct lttng_consumer_channel { int nr_stream_fds; char root_shm_path[PATH_MAX]; char shm_path[PATH_MAX]; + /* Only set for UST channels. */ + LTTNG_OPTIONAL(struct lttng_credentials) buffer_credentials; /* Total number of discarded events for that channel. */ uint64_t discarded_events; /* Total number of missed packets due to overwriting (overwrite). */ uint64_t lost_packets; bool streams_sent_to_relayd; - - /* - * 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; }; /* @@ -257,6 +263,12 @@ struct lttng_consumer_stream { struct lttng_ht_node_u64 node_session_id; /* Pointer to associated channel. */ struct lttng_consumer_channel *chan; + /* + * Current trace chunk. Holds a reference to the trace chunk. + * `chunk` can be NULL when a stream is not associated to a chunk, e.g. + * when it was created in the context of a no-output session. + */ + struct lttng_trace_chunk *trace_chunk; /* Key by which the stream is indexed for 'node'. */ uint64_t key; @@ -269,7 +281,6 @@ struct lttng_consumer_stream { off_t out_fd_offset; /* Amount of bytes written to the output */ uint64_t output_written; - enum lttng_consumer_stream_state state; int shm_fd_is_copy; int data_read; int hangup_flush_done; @@ -308,7 +319,7 @@ struct lttng_consumer_stream { bool missed_metadata_flush; enum lttng_event_output output; - /* Maximum subbuffer size. */ + /* Maximum subbuffer size (in bytes). */ unsigned long max_sb_size; /* @@ -321,9 +332,6 @@ struct lttng_consumer_stream { /* For UST */ int wait_fd; - /* UID/GID of the user owning the session to which stream belongs */ - uid_t uid; - gid_t gid; /* Network sequence number. Indicating on which relayd socket it goes. */ uint64_t net_seq_idx; /* @@ -413,12 +421,6 @@ struct lttng_consumer_stream { uint64_t last_discarded_events; /* Copy of the sequence number of the last packet extracted. */ uint64_t last_sequence_number; - /* - * A stream is created with a trace_archive_id matching the session's - * current trace archive id at the time of the creation of the stream. - * It is incremented when the rotate_position is reached. - */ - uint64_t trace_archive_id; /* * Index file object of the index file for this stream. */ @@ -450,7 +452,6 @@ struct lttng_consumer_stream { * the stream objects when we introduce refcounting. */ struct { - char path[LTTNG_PATH_MAX]; uint64_t tracefile_size; } channel_read_only_attributes; @@ -600,6 +601,7 @@ struct lttng_consumer_local_data { * to the session daemon (write-only). */ int channel_monitor_pipe; + LTTNG_OPTIONAL(lttng_uuid) sessiond_uuid; }; /* @@ -743,23 +745,19 @@ void consumer_stream_update_channel_attributes( struct lttng_consumer_stream *consumer_allocate_stream(uint64_t channel_key, uint64_t stream_key, - enum lttng_consumer_stream_state state, const char *channel_name, - uid_t uid, - gid_t gid, uint64_t relayd_id, uint64_t session_id, + struct lttng_trace_chunk *trace_chunk, int cpu, int *alloc_ret, enum consumer_channel_type type, - unsigned int monitor, - uint64_t trace_archive_id); + unsigned int monitor); struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key, uint64_t session_id, + const uint64_t *chunk_id, const char *pathname, const char *name, - uid_t uid, - gid_t gid, uint64_t relayd_id, enum lttng_event_output output, uint64_t tracefile_size, @@ -845,23 +843,32 @@ 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(struct lttng_consumer_channel *channel, - uint64_t key, const char *path, uint64_t relayd_id, - uint32_t metadata, uint64_t new_chunk_id, + uint64_t key, uint64_t relayd_id, uint32_t metadata, 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); + struct lttng_consumer_stream *stream); int lttng_consumer_rotate_ready_streams(struct lttng_consumer_channel *channel, 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_check_rotation_pending_local(uint64_t session_id, - uint64_t chunk_id); -int lttng_consumer_check_rotation_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); +enum lttcomm_return_code lttng_consumer_create_trace_chunk( + const uint64_t *relayd_id, uint64_t session_id, + uint64_t chunk_id, + time_t chunk_creation_timestamp, + const char *chunk_override_name, + const struct lttng_credentials *credentials, + struct lttng_directory_handle *chunk_directory_handle); +enum lttcomm_return_code lttng_consumer_close_trace_chunk( + const uint64_t *relayd_id, uint64_t session_id, + uint64_t chunk_id, time_t chunk_close_timestamp, + const enum lttng_trace_chunk_command_type *close_command, + char *path); +enum lttcomm_return_code lttng_consumer_trace_chunk_exists( + const uint64_t *relayd_id, uint64_t session_id, + uint64_t chunk_id); void lttng_consumer_cleanup_relayd(struct consumer_relayd_sock_pair *relayd); +enum lttcomm_return_code lttng_consumer_init_command( + struct lttng_consumer_local_data *ctx, + const lttng_uuid sessiond_uuid); #endif /* LIB_CONSUMER_H */