X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Frotation-thread.c;h=01a963c25d45c026119a2300d78780ac82772736;hp=d39aad80b413e888a9d6859a5be17473e7b11e0f;hb=753f4df1c2a5090c772aee207bafe7839d288b2a;hpb=cea6c68e33a159a83b52d0931d355051d89283a2 diff --git a/src/bin/lttng-sessiond/rotation-thread.c b/src/bin/lttng-sessiond/rotation-thread.c index d39aad80b..01a963c25 100644 --- a/src/bin/lttng-sessiond/rotation-thread.c +++ b/src/bin/lttng-sessiond/rotation-thread.c @@ -42,6 +42,7 @@ #include "cmd.h" #include "session.h" #include "sessiond-timer.h" +#include "notification-thread-commands.h" #include #include @@ -261,8 +262,11 @@ error: static void fini_thread_state(struct rotation_thread_state *state) { + int ret; + lttng_poll_clean(&state->events); - cds_lfht_destroy(channel_pending_rotate_ht, NULL); + ret = cds_lfht_destroy(channel_pending_rotate_ht, NULL); + assert(!ret); if (rotate_notification_channel) { lttng_notification_channel_destroy(rotate_notification_channel); } @@ -406,7 +410,23 @@ int handle_channel_rotation_pipe(int fd, uint32_t revents, goto end_unlock_session; } } else { + struct lttng_trace_archive_location *location; + session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + /* Ownership of location is transferred. */ + location = session_get_trace_archive_location(session); + ret = notification_thread_command_session_rotation_completed( + notification_thread_handle, + session->name, + session->uid, + session->gid, + session->current_archive_id, + location); + if (ret != LTTNG_OK) { + ERR("Failed to notify notification thread that rotation is complete for session %s", + session->name); + } + } DBG("Rotation completed for session %s", session->name); } @@ -433,12 +453,14 @@ int rotate_pending_relay_timer(struct ltt_session *session) DBG("[rotation-thread] Check rotate pending on session %" PRIu64, session->id); - ret = relay_rotate_pending(session, session->rotate_count - 1); + ret = relay_rotate_pending(session, session->current_archive_id - 1); if (ret < 0) { ERR("[rotation-thread] Check relay rotate pending"); goto end; } if (ret == 0) { + struct lttng_trace_archive_location *location; + DBG("[rotation-thread] Rotation completed on the relay for " "session %" PRIu64, session->id); /* @@ -447,6 +469,21 @@ int rotate_pending_relay_timer(struct ltt_session *session) */ session->rotate_pending_relay = false; session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + + session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + /* Ownership of location is transferred. */ + location = session_get_trace_archive_location(session); + ret = notification_thread_command_session_rotation_completed( + notification_thread_handle, + session->name, + session->uid, + session->gid, + session->current_archive_id, + location); + if (ret != LTTNG_OK) { + ERR("Failed to notify notification thread that rotation is complete for session %s", + session->name); + } } else if (ret == 1) { DBG("[rotation-thread] Rotation still pending on the relay for " "session %" PRIu64, session->id); @@ -654,7 +691,6 @@ int handle_condition( ret = cmd_rotate_session(session, NULL); if (ret == -LTTNG_ERR_ROTATION_PENDING) { DBG("Rotate already pending, subscribe to the next threshold value"); - ret = 0; } else if (ret != LTTNG_OK) { ERR("[rotation-thread] Failed to rotate on size notification with error: %s", lttng_strerror(ret));