sessiond: rename syscall.h so it does not conflict with system
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 924ac92316bf0c9add8a79e15b7087aa421a6c44..a1eb961ee544331f961202ee2b69d36ffbe87868 100644 (file)
@@ -47,7 +47,7 @@
 #include "kernel-consumer.h"
 #include "lttng-sessiond.h"
 #include "utils.h"
-#include "syscall.h"
+#include "lttng-syscall.h"
 #include "agent.h"
 #include "buffer-registry.h"
 #include "notification-thread.h"
@@ -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
@@ -3665,10 +3671,12 @@ static
 int clear_metadata_file(int fd)
 {
        int ret;
+       off_t lseek_ret;
 
-       ret = lseek(fd, 0, SEEK_SET);
-       if (ret < 0) {
+       lseek_ret = lseek(fd, 0, SEEK_SET);
+       if (lseek_ret < 0) {
                PERROR("lseek");
+               ret = -1;
                goto end;
        }
 
@@ -4377,7 +4385,7 @@ int cmd_rotate_session(struct ltt_session *session,
        int ret;
        size_t strf_ret;
        struct tm *timeinfo;
-       char datetime[16];
+       char datetime[21];
        time_t now;
        bool ust_active = false;
 
@@ -4400,7 +4408,7 @@ int cmd_rotate_session(struct ltt_session *session,
        if (session->consumer->type == CONSUMER_DST_NET &&
                        (session->consumer->relay_major_version == 2 &&
                        session->consumer->relay_minor_version < 11)) {
-               ret = -LTTNG_ERR_ROTATION_NOT_AVAILABLE;
+               ret = -LTTNG_ERR_ROTATION_NOT_AVAILABLE_RELAY;
                goto end;
        }
 
@@ -4479,7 +4487,7 @@ int cmd_rotate_session(struct ltt_session *session,
                ret = -LTTNG_ERR_UNK;
                goto end;
        }
-       strf_ret = strftime(datetime, sizeof(datetime), "%Y%m%d-%H%M%S",
+       strf_ret = strftime(datetime, sizeof(datetime), "%Y%m%dT%H%M%S%z",
                        timeinfo);
        if (!strf_ret) {
                ERR("Failed to format local time timestamp in rotate session command");
@@ -4558,9 +4566,12 @@ int cmd_rotate_session(struct ltt_session *session,
                ret = domain_mkdir(session->ust_session->consumer, session,
                                session->ust_session->uid,
                                session->ust_session->gid);
+               if (ret) {
+                       ret = -LTTNG_ERR_CREATE_DIR_FAIL;
+                       goto end;
+               }
                ret = ust_app_rotate_session(session, &ust_active);
                if (ret != LTTNG_OK) {
-                       ret = -LTTNG_ERR_CREATE_DIR_FAIL;
                        goto end;
                }
                /*
@@ -4626,16 +4637,59 @@ int cmd_rotate_get_info(struct ltt_session *session,
                                rotation_id, session->name);
                break;
        case LTTNG_ROTATION_STATE_COMPLETED:
-               ret = lttng_strncpy(info_return->path,
+       {
+               char *current_tracing_path_reply;
+               size_t current_tracing_path_reply_len;
+
+               switch (session_get_consumer_destination_type(session)) {
+               case CONSUMER_DST_LOCAL:
+                       current_tracing_path_reply =
+                                       info_return->location.local.absolute_path;
+                       current_tracing_path_reply_len =
+                                       sizeof(info_return->location.local.absolute_path);
+                       info_return->location_type =
+                                       (int8_t) LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL;
+                       break;
+               case CONSUMER_DST_NET:
+                       current_tracing_path_reply =
+                                       info_return->location.relay.relative_path;
+                       current_tracing_path_reply_len =
+                                       sizeof(info_return->location.relay.relative_path);
+                       /* Currently the only supported relay protocol. */
+                       info_return->location.relay.protocol =
+                                       (int8_t) LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP;
+
+                       ret = lttng_strncpy(info_return->location.relay.host,
+                                       session_get_net_consumer_hostname(session),
+                                       sizeof(info_return->location.relay.host));
+                       if (ret) {
+                               ERR("Failed to host name to rotate_get_info reply");
+                               info_return->status = LTTNG_ROTATION_STATUS_ERROR;
+                               ret = -LTTNG_ERR_UNK;
+                               goto end;
+                       }
+
+                       session_get_net_consumer_ports(session,
+                                       &info_return->location.relay.ports.control,
+                                       &info_return->location.relay.ports.data);
+                       info_return->location_type =
+                                       (int8_t) LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY;
+                       break;
+               default:
+                       abort();
+               }
+               ret = lttng_strncpy(current_tracing_path_reply,
                                session->rotation_chunk.current_rotate_path,
-                               sizeof(info_return->path));
+                               current_tracing_path_reply_len);
                if (ret) {
-                       ERR("Failed to copy active tracing path to rotate_get_info reply");
+                       ERR("Failed to copy current tracing path to rotate_get_info reply");
                        info_return->status = LTTNG_ROTATION_STATUS_ERROR;
                        ret = -LTTNG_ERR_UNK;
                        goto end;
                }
+
                break;
+       }
        case LTTNG_ROTATION_STATE_ERROR:
                DBG("Reporting that an error occurred during rotation %" PRIu64 " of session %s",
                                rotation_id, session->name);
@@ -4659,7 +4713,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 +4738,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 +4770,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.027352 seconds and 4 git commands to generate.