Build fix: relayd: mismatching function signatures
[lttng-tools.git] / src / bin / lttng-relayd / session.c
index 6c30821ff1348a405816af553a7b2951120c8a5c..7888d38f2fefd30f3ce423bbccaff0633c092fcb 100644 (file)
@@ -328,7 +328,7 @@ struct relay_session *session_create(const char *session_name,
 
        if (lttng_strncpy(session->session_name, session_name,
                        sizeof(session->session_name))) {
-               WARN("Session name exceeds maximal allowed length");
+               WARN("Session name exceeds maximal allowed length");
                goto error;
        }
        if (lttng_strncpy(session->hostname, hostname,
@@ -394,14 +394,14 @@ struct relay_session *session_create(const char *session_name,
                                        session->id_sessiond.value,
                                        *current_chunk_id);
                if (!session->current_trace_chunk) {
-                       char uuid_str[LTTNG_UUID_STR_LEN];
+                       char uuid_str[LTTNG_UUID_STR_LEN];
 
                        lttng_uuid_to_str(sessiond_uuid, uuid_str);
                        ERR("Could not find trace chunk: sessiond = {%s}, sessiond session id = %" PRIu64 ", trace chunk id = %" PRIu64,
                                        uuid_str, *id_sessiond,
                                        *current_chunk_id);
                        goto error;
-                }
+               }
 
                chunk_status = lttng_trace_chunk_get_session_output_directory_handle(
                                session->current_trace_chunk,
@@ -474,6 +474,89 @@ end:
        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 =
This page took 0.028703 seconds and 4 git commands to generate.