#include <urcu/list.h>
#include <common/hashtable/hashtable.h>
+#include <common/dynamic-array.h>
#include <lttng/rotation.h>
#include <lttng/location.h>
+#include <lttng/lttng-error.h>
#include "snapshot.h"
#include "trace-kernel.h"
struct ltt_ust_session;
+typedef void (*ltt_session_destroy_notifier)(const struct ltt_session *session,
+ void *user_data);
+
/*
* Tracing session list
*
*/
struct ltt_session {
char name[NAME_MAX];
+ bool has_auto_generated_name;
char hostname[HOST_NAME_MAX]; /* Local hostname. */
+ time_t creation_time;
struct ltt_kernel_session *kernel_session;
struct ltt_ust_session *ust_session;
struct urcu_ref ref;
* copied into those sessions.
*/
struct consumer_output *consumer;
-
+ /*
+ * Indicates whether or not the user has specified an output directory
+ * or if it was configured using the default configuration.
+ */
+ bool has_user_specified_directory;
/* Did at least ONE start command has been triggered?. */
unsigned int has_been_started:1;
/*
* creation defaults.
*/
unsigned int snapshot_mode;
+ /*
+ * A session that has channels that don't use 'mmap' output can't be
+ * used to capture snapshots. This is set to true whenever a
+ * 'splice' kernel channel is enabled.
+ */
+ bool has_non_mmap_channel;
/*
* Timer set when the session is created for live reading.
*/
* Node in ltt_sessions_ht_by_id.
*/
struct lttng_ht_node_u64 node;
- /*
- * The current archive id corresponds to the number of session rotations
- * that have occurred for this session. The archive id
- * is used to tag the "generation" of a stream. This tag allows the
- * consumer and relay daemons to track when a given stream was created
- * during the lifetime of a session.
- *
- * For instance, if a stream is created after a session rotation was
- * launched, the consumer and relay daemons must not check its position
- * to determine if that specific session rotation was completed. It is
- * implicitly "completed" since the stream appeared _after_ the session
- * rotation was initiated.
- */
- uint64_t current_archive_id;
- /*
- * Rotation is considered pending between the time it is launched up
- * until the moment when the data has been writen at the destination
- * and the trace archive has been renamed.
- *
- * When tracing locally, only 'rotation_pending_local' is used since
- * no remote checks are needed. However, when tracing to a relay daemon,
- * a second check is needed to ensure that the data has been
- * commited at the remote destination.
- */
- bool rotation_pending_local;
- bool rotation_pending_relay;
- /* Current state of a rotation. */
- enum lttng_rotation_state rotation_state;
- struct {
- /*
- * When the rotation is in progress, the temporary path name is
- * stored here. When the rotation is complete, the final path name
- * is here and can be queried with the rotate_pending call.
- */
- char current_rotate_path[LTTNG_PATH_MAX];
- /*
- * The path where the consumer is currently writing after the first
- * session rotation.
- */
- char active_tracing_path[LTTNG_PATH_MAX];
- } rotation_chunk;
- /*
- * The timestamp of the beginning of the previous chunk. For the
- * first chunk, this is the "lttng start" timestamp. For the
- * subsequent ones, this copies the current_chunk_start_ts value when
- * a new rotation starts. This value is used to set the name of a
- * complete chunk directory, ex: "last_chunk_start_ts-now()".
- */
- time_t last_chunk_start_ts;
- /*
- * This is the timestamp when a new chunk starts. When a new rotation
- * starts, we copy this value to last_chunk_start_ts and replace it
- * with the current timestamp.
- */
- time_t current_chunk_start_ts;
/*
* Timer to check periodically if a relay and/or consumer has completed
* the last rotation.
*/
struct lttng_condition *rotate_condition;
struct lttng_trigger *rotate_trigger;
+ LTTNG_OPTIONAL(uint64_t) most_recent_chunk_id;
+ struct lttng_trace_chunk *current_trace_chunk;
+ struct lttng_trace_chunk *chunk_being_archived;
+ /* Current state of a rotation. */
+ enum lttng_rotation_state rotation_state;
+ char *last_archived_chunk_name;
+ LTTNG_OPTIONAL(uint64_t) last_archived_chunk_id;
+ struct lttng_dynamic_array destroy_notifiers;
};
/* Prototypes */
-int session_create(char *name, uid_t uid, gid_t gid);
-
+enum lttng_error_code session_create(const char *name, uid_t uid, gid_t gid,
+ struct ltt_session **out_session);
void session_lock(struct ltt_session *session);
void session_lock_list(void);
int session_trylock_list(void);
void session_unlock_list(void);
void session_destroy(struct ltt_session *session);
+int session_add_destroy_notifier(struct ltt_session *session,
+ ltt_session_destroy_notifier notifier, void *user_data);
bool session_get(struct ltt_session *session);
void session_put(struct ltt_session *session);
const struct ltt_session *session,
uint16_t *control_port, uint16_t *data_port);
struct lttng_trace_archive_location *session_get_trace_archive_location(
- struct ltt_session *session);
+ const struct ltt_session *session);
struct ltt_session *session_find_by_name(const char *name);
struct ltt_session *session_find_by_id(uint64_t id);
int session_reset_rotation_state(struct ltt_session *session,
enum lttng_rotation_state result);
+/* Create a new trace chunk object from the session's configuration. */
+struct lttng_trace_chunk *session_create_new_trace_chunk(
+ const struct ltt_session *session,
+ const struct consumer_output *consumer_output_override,
+ const char *session_base_path_override,
+ const char *chunk_name_override);
+
+/*
+ * Set `new_trace_chunk` as the session's current trace chunk. A reference
+ * to `new_trace_chunk` is acquired by the session. The chunk is created
+ * on remote peers (consumer and relay daemons).
+ *
+ * A reference to the session's current trace chunk is returned through
+ * `current_session_trace_chunk` on success.
+ */
+int session_set_trace_chunk(struct ltt_session *session,
+ struct lttng_trace_chunk *new_trace_chunk,
+ struct lttng_trace_chunk **current_session_trace_chunk);
+
+/*
+ * Close a chunk on the remote peers of a session. Has no effect on the
+ * ltt_session itself.
+ */
+int session_close_trace_chunk(const struct ltt_session *session,
+ struct lttng_trace_chunk *trace_chunk,
+ const enum lttng_trace_chunk_command_type *close_command);
+
+bool session_output_supports_trace_chunks(const struct ltt_session *session);
+
#endif /* _LTT_SESSION_H */