#include "cmd.h"
#include "session.h"
#include "sessiond-timer.h"
+#include "notification-thread-commands.h"
#include <urcu.h>
#include <urcu/list.h>
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);
}
goto end_unlock_session;
}
session->rotate_pending = false;
- session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED;
session->last_chunk_start_ts = session->current_chunk_start_ts;
if (session->rotate_pending_relay) {
ret = sessiond_timer_rotate_pending_start(
ret = -1;
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);
}
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);
/*
* rotations can start now.
*/
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);
struct rotation_thread_state *state)
{
int ret;
- struct lttng_notification *notification;
+ bool notification_pending;
+ struct lttng_notification *notification = NULL;
enum lttng_notification_channel_status status;
const struct lttng_evaluation *notification_evaluation;
const struct lttng_condition *notification_condition;
+ status = lttng_notification_channel_has_pending_notification(
+ rotate_notification_channel, ¬ification_pending);
+ if (status != LTTNG_NOTIFICATION_CHANNEL_STATUS_OK) {
+ ERR("[rotation-thread ]Error occured while checking for pending notification");
+ ret = -1;
+ goto end;
+ }
+
+ if (!notification_pending) {
+ ret = 0;
+ goto end;
+ }
+
/* Receive the next notification. */
status = lttng_notification_channel_get_next_notification(
rotate_notification_channel,
end:
lttng_notification_destroy(notification);
- if (ret != 0) {
- goto end;
- }
-
-
return ret;
}
ret = handle_channel_rotation_pipe(fd,
revents, handle, &state);
if (ret) {
- ERR("[rotation-thread] Handle channel rotation pipe");
+ ERR("[rotation-thread] Failed to handle channel rotation pipe");
goto error;
}
} else if (fd == rotate_notification_channel->socket) {