Size-based rotation
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 375324aec870bea400ce620b95fe8603ed1357cd..e88d7a2f77eb41534062fbe01dbe990d11f65855 100644 (file)
@@ -2953,7 +2953,8 @@ error:
  *
  * Called with session lock held.
  */
-int cmd_destroy_session(struct ltt_session *session, int wpipe)
+int cmd_destroy_session(struct ltt_session *session, int wpipe,
+               struct notification_thread_handle *notification_thread_handle)
 {
        int ret;
        struct ltt_ust_session *usess;
@@ -2975,6 +2976,11 @@ int cmd_destroy_session(struct ltt_session *session, int wpipe)
                sessiond_rotate_timer_stop(session);
        }
 
+       if (session->rotate_size) {
+               unsubscribe_session_consumed_size_rotation(session, notification_thread_handle);
+               session->rotate_size = 0;
+       }
+
        /*
         * The rename of the current chunk is performed at stop, but if we rotated
         * the session after the previous stop command, we need to rename the
@@ -4659,7 +4665,8 @@ end:
  * Return 0 on success or else an LTTNG_ERR code.
  */
 int cmd_rotation_set_schedule(struct ltt_session *session,
-               uint64_t timer_us, uint64_t size)
+               uint64_t timer_us, uint64_t size,
+               struct notification_thread_handle *notification_thread_handle)
 {
        int ret;
 
@@ -4683,6 +4690,14 @@ int cmd_rotation_set_schedule(struct ltt_session *session,
                goto end;
        }
 
+       if (size && size != -1ULL && session->rotate_size) {
+               ret = LTTNG_ERR_ROTATION_SIZE_SET;
+               goto end;
+       } else if (size == -1ULL && !session->rotate_size) {
+               ret = LTTNG_ERR_ROTATION_NO_SIZE_SET;
+               goto end;
+       }
+
        if (timer_us && !session->rotate_timer_period) {
                if (timer_us > UINT_MAX) {
                        ret = LTTNG_ERR_INVALID;
@@ -4707,6 +4722,27 @@ int cmd_rotation_set_schedule(struct ltt_session *session,
                session->rotate_timer_period = 0;
        }
 
+       if (size > 0) {
+               if (size == -1ULL) {
+                       ret = unsubscribe_session_consumed_size_rotation(session,
+                                       notification_thread_handle);
+                       if (ret) {
+                               ret = LTTNG_ERR_UNK;
+                               goto end;
+                       }
+                       session->rotate_size = 0;
+               } else {
+                       ret = subscribe_session_consumed_size_rotation(session,
+                                       size, notification_thread_handle);
+                       if (ret) {
+                               PERROR("Subscribe to session usage");
+                               ret = LTTNG_ERR_UNK;
+                               goto end;
+                       }
+                       session->rotate_size = size;
+               }
+       }
+
        ret = LTTNG_OK;
 
        goto end;
This page took 0.025086 seconds and 5 git commands to generate.