goto end;
}
+ lttng_trace_chunk_set_fd_tracker(chunk, the_fd_tracker);
status = lttng_trace_chunk_set_credentials_current_user(chunk);
if (status != LTTNG_TRACE_CHUNK_STATUS_OK) {
ret = -1;
goto end;
}
- lttng_trace_chunk_set_fd_tracker(chunk, the_fd_tracker);
- output_directory = NULL;
session->current_trace_chunk = chunk;
chunk = NULL;
end:
PERROR("Failed to allocate session");
goto error;
}
+
+ pthread_mutex_lock(&last_relay_session_id_lock);
+ session->id = ++last_relay_session_id;
+ pthread_mutex_unlock(&last_relay_session_id_lock);
+
+ lttng_ht_node_init_u64(&session->session_n, session->id);
+ urcu_ref_init(&session->ref);
+ CDS_INIT_LIST_HEAD(&session->recv_list);
+ pthread_mutex_init(&session->lock, NULL);
+ pthread_mutex_init(&session->recv_list_lock, NULL);
+
if (lttng_strncpy(session->session_name, session_name,
sizeof(session->session_name))) {
WARN("Session name exceeds maximal allowed length");
}
if (creation_time) {
LTTNG_OPTIONAL_SET(&session->creation_time, *creation_time);
+ } else {
+ LTTNG_OPTIONAL_SET(&session->creation_time, time(NULL));
+ if (session->creation_time.value == (time_t) -1) {
+ PERROR("Failed to sample session creation time");
+ goto error;
+ }
}
session->session_name_contains_creation_time =
session_name_contains_creation_time;
goto error;
}
- pthread_mutex_lock(&last_relay_session_id_lock);
- session->id = ++last_relay_session_id;
- pthread_mutex_unlock(&last_relay_session_id_lock);
-
session->major = major;
session->minor = minor;
- lttng_ht_node_init_u64(&session->session_n, session->id);
- urcu_ref_init(&session->ref);
- CDS_INIT_LIST_HEAD(&session->recv_list);
- pthread_mutex_init(&session->lock, NULL);
- pthread_mutex_init(&session->recv_list_lock, NULL);
session->live_timer = live_timer;
session->snapshot = snapshot;
return session;
}
+/*
+ * Check if any of the relay sessions originating from the same
+ * session daemon session have the 'ongoing_rotation' state set.
+ *
+ * The caller must hold the lock of session.
+ */
+bool session_has_ongoing_rotation(struct relay_session *session)
+{
+ bool ongoing_rotation = false;
+ struct lttng_ht_iter iter;
+ struct relay_session *iterated_session;
+
+ if (!session->id_sessiond.is_set) {
+ /*
+ * The peer that created this session is too old to
+ * support rotations; we can assume no rotations are ongoing.
+ */
+ goto end;
+ }
+
+ if (session->ongoing_rotation) {
+ ongoing_rotation = true;
+ goto end;
+ }
+
+ rcu_read_lock();
+ /*
+ * Sample the 'ongoing_rotation' status of all relay sessions that
+ * originate from the same session daemon session.
+ */
+ cds_lfht_for_each_entry(sessions_ht->ht, &iter.iter, iterated_session,
+ session_n.node) {
+ if (!session_get(iterated_session)) {
+ continue;
+ }
+
+ if (session == iterated_session) {
+ /* Skip this session. */
+ goto next_session_no_unlock;
+ }
+
+ pthread_mutex_lock(&iterated_session->lock);
+
+ if (!iterated_session->id_sessiond.is_set) {
+ /*
+ * Session belongs to a peer that doesn't support
+ * rotations.
+ */
+ goto next_session;
+ }
+
+ if (!lttng_uuid_is_equal(session->sessiond_uuid,
+ iterated_session->sessiond_uuid)) {
+ /* Sessions do not originate from the same sessiond. */
+ goto next_session;
+ }
+
+ if (LTTNG_OPTIONAL_GET(session->id_sessiond) !=
+ LTTNG_OPTIONAL_GET(iterated_session->id_sessiond)) {
+ /*
+ * Sessions do not originate from the same sessiond
+ * session.
+ */
+ goto next_session;
+ }
+
+ ongoing_rotation = iterated_session->ongoing_rotation;
+
+next_session:
+ pthread_mutex_unlock(&iterated_session->lock);
+next_session_no_unlock:
+ session_put(iterated_session);
+
+ if (ongoing_rotation) {
+ break;
+ }
+ }
+ rcu_read_unlock();
+
+end:
+ return ongoing_rotation;
+}
+
static void rcu_destroy_session(struct rcu_head *rcu_head)
{
struct relay_session *session =