Fix: don't spawn relayd if URL is provided
[lttng-tools.git] / src / bin / lttng / commands / create.c
index 72702d5a54743a1d91a652ebb6707ff428f156bd..e02b141420c075a1c0e687befade8192eb0d4721 100644 (file)
@@ -17,6 +17,7 @@
 
 #define _GNU_SOURCE
 #include <assert.h>
+#include <ctype.h>
 #include <popt.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -33,6 +34,7 @@
 #include <common/sessiond-comm/sessiond-comm.h>
 #include <common/uri.h>
 #include <common/utils.h>
+#include <lttng/snapshot.h>
 
 static char *opt_output_path;
 static char *opt_session_name;
@@ -41,11 +43,14 @@ static char *opt_ctrl_url;
 static char *opt_data_url;
 static int opt_no_consumer;
 static int opt_no_output;
+static int opt_snapshot;
+static unsigned int opt_live_timer;
 static int opt_disable_consumer;
 
 enum {
        OPT_HELP = 1,
        OPT_LIST_OPTIONS,
+       OPT_LIVE_TIMER,
 };
 
 static struct poptOption long_options[] = {
@@ -59,6 +64,8 @@ static struct poptOption long_options[] = {
        {"no-output",       0, POPT_ARG_VAL, &opt_no_output, 1, 0, 0},
        {"no-consumer",     0, POPT_ARG_VAL, &opt_no_consumer, 1, 0, 0},
        {"disable-consumer", 0, POPT_ARG_VAL, &opt_disable_consumer, 1, 0, 0},
+       {"snapshot",        0, POPT_ARG_VAL, &opt_snapshot, 1, 0, 0},
+       {"live",            0, POPT_ARG_INT | POPT_ARGFLAG_OPTIONAL, 0, OPT_LIVE_TIMER, 0, 0},
        {0, 0, 0, 0, 0, 0, 0}
 };
 
@@ -67,7 +74,7 @@ static struct poptOption long_options[] = {
  * why this declaration exists and used ONLY in for this command.
  */
 extern int _lttng_create_session_ext(const char *name, const char *url,
-               const char *datetime);
+               const char *datetime, int live_timer);
 
 /*
  * usage
@@ -82,7 +89,20 @@ static void usage(FILE *ofp)
        fprintf(ofp, "  -h, --help           Show this help\n");
        fprintf(ofp, "      --list-options   Simple listing of options\n");
        fprintf(ofp, "  -o, --output PATH    Specify output path for traces\n");
-       fprintf(ofp, "      --no-output      Traces will not be outputed\n");
+       fprintf(ofp, "      --no-output      Traces will not be outputted\n");
+       fprintf(ofp, "      --snapshot       Set the session in snapshot mode.\n");
+       fprintf(ofp, "                       Created in no-output mode and uses the URL,\n");
+       fprintf(ofp, "                       if one, as the default snapshot output.\n");
+       fprintf(ofp, "                       Every channel will be set in overwrite mode\n");
+       fprintf(ofp, "                       and with mmap output (splice not supported).\n");
+       fprintf(ofp, "      --live [USEC]    Set the session in live-reading mode.\n");
+       fprintf(ofp, "                       The delay parameter in micro-seconds is the\n");
+       fprintf(ofp, "                       maximum time the user can wait for the data\n");
+       fprintf(ofp, "                       to be flushed. Can be set with a network\n");
+       fprintf(ofp, "                       URL (-U or -C/-D) and must have a relayd listening.\n");
+       fprintf(ofp, "                       By default, %u is used for the timer and the\n",
+                                                                                       DEFAULT_LTTNG_LIVE_TIMER);
+       fprintf(ofp, "                       network URL is set to net://127.0.0.1.\n");
        fprintf(ofp, "\n");
        fprintf(ofp, "Extended Options:\n");
        fprintf(ofp, "\n");
@@ -170,6 +190,46 @@ error:
        return ret;
 }
 
+static int add_snapshot_output(const char *session_name, const char *ctrl_url,
+               const char *data_url)
+{
+       int ret;
+       struct lttng_snapshot_output *output = NULL;
+
+       assert(session_name);
+
+       output = lttng_snapshot_output_create();
+       if (!output) {
+               ret = CMD_FATAL;
+               goto error_create;
+       }
+
+       if (ctrl_url) {
+               ret = lttng_snapshot_output_set_ctrl_url(ctrl_url, output);
+               if (ret < 0) {
+                       goto error;
+               }
+       }
+
+       if (data_url) {
+               ret = lttng_snapshot_output_set_data_url(data_url, output);
+               if (ret < 0) {
+                       goto error;
+               }
+       }
+
+       /* This call, if successful, populates the id of the output object. */
+       ret = lttng_snapshot_add_output(session_name, output);
+       if (ret < 0) {
+               goto error;
+       }
+
+error:
+       lttng_snapshot_output_destroy(output);
+error_create:
+       return ret;
+}
+
 /*
  *  Create a tracing session.
  *  If no name is specified, a default name is generated.
@@ -231,6 +291,12 @@ static int create_session(void)
                }
        }
 
+       if ((!opt_ctrl_url && opt_data_url) || (opt_ctrl_url && !opt_data_url)) {
+               ERR("You need both control and data URL.");
+               ret = CMD_ERROR;
+               goto error;
+       }
+
        if (opt_output_path != NULL) {
                traces_path = utils_expand_path(opt_output_path);
                if (traces_path == NULL) {
@@ -251,6 +317,12 @@ static int create_session(void)
        } else if (opt_url) { /* Handling URL (-U opt) */
                url = opt_url;
                print_str_url = url;
+       } else if (opt_data_url && opt_ctrl_url) {
+               /*
+                * With both control and data, we'll be setting the consumer URL after
+                * session creation thus use no URL.
+                */
+               url = NULL;
        } else if (!opt_no_output) {
                /* Auto output path */
                alloc_path = utils_get_home_dir();
@@ -272,21 +344,57 @@ static int create_session(void)
                }
 
                url = alloc_url;
-               if (!opt_data_url && !opt_ctrl_url) {
-                       print_str_url = alloc_url + strlen("file://");
-               }
+               print_str_url = alloc_url + strlen("file://");
        } else {
-               /* No output means --no-output. */
+               /* No output means --no-output or --snapshot mode. */
                url = NULL;
        }
 
-       if ((!opt_ctrl_url && opt_data_url) || (opt_ctrl_url && !opt_data_url)) {
-               ERR("You need both control and data URL.");
+       /* Use default live URL if NO url is/are found. */
+       if ((opt_live_timer && !opt_url) && (opt_live_timer && !opt_data_url)) {
+               ret = asprintf(&alloc_url, "net://127.0.0.1");
+               if (ret < 0) {
+                       PERROR("asprintf default live URL");
+                       ret = CMD_FATAL;
+                       goto error;
+               }
+               url = alloc_url;
+               print_str_url = url;
+       }
+
+       if (opt_snapshot && opt_live_timer) {
+               ERR("Snapshot and live modes are mutually exclusive.");
                ret = CMD_ERROR;
                goto error;
        }
 
-       ret = _lttng_create_session_ext(session_name, url, datetime);
+       if (opt_snapshot) {
+               /* No output by default. */
+               const char *snapshot_url = NULL;
+
+               if (opt_url) {
+                       snapshot_url = url;
+               } else if (!opt_data_url && !opt_ctrl_url) {
+                       /* This is the session path that we need to use as output. */
+                       snapshot_url = url;
+               }
+               ret = lttng_create_session_snapshot(session_name, snapshot_url);
+       } else if (opt_live_timer) {
+               const char *pathname;
+
+               if (opt_relayd_path) {
+                       pathname = opt_relayd_path;
+               } else {
+                       pathname = INSTALL_BIN_PATH "/lttng-relayd";
+               }
+               if (!opt_url && !opt_data_url && !check_relayd() &&
+                               spawn_relayd(pathname, 0) < 0) {
+                       goto error;
+               }
+               ret = lttng_create_session_live(session_name, url, opt_live_timer);
+       } else {
+               ret = _lttng_create_session_ext(session_name, url, datetime, -1);
+       }
        if (ret < 0) {
                /* Don't set ret so lttng can interpret the sessiond error. */
                switch (-ret) {
@@ -300,8 +408,13 @@ static int create_session(void)
        }
 
        if (opt_ctrl_url && opt_data_url) {
-               /* Setting up control URI (-C or/and -D opt) */
-               ret = set_consumer_url(session_name, opt_ctrl_url, opt_data_url);
+               if (opt_snapshot) {
+                       ret = add_snapshot_output(session_name, opt_ctrl_url,
+                                       opt_data_url);
+               } else {
+                       /* Setting up control URI (-C or/and -D opt) */
+                       ret = set_consumer_url(session_name, opt_ctrl_url, opt_data_url);
+               }
                if (ret < 0) {
                        /* Destroy created session because the URL are not valid. */
                        lttng_destroy_session(session_name);
@@ -310,8 +423,18 @@ static int create_session(void)
        }
 
        MSG("Session %s created.", session_name);
-       if (print_str_url) {
+       if (print_str_url && !opt_snapshot) {
                MSG("Traces will be written in %s", print_str_url);
+
+               if (opt_live_timer) {
+                       MSG("Live timer set to %u usec", opt_live_timer);
+               }
+       } else if (opt_snapshot) {
+               if (print_str_url) {
+                       MSG("Default snapshot output set to: %s", print_str_url);
+               }
+               MSG("Snapshot mode set. Every channel enabled for that session will "
+                               "be set in overwrite mode and mmap output.");
        }
 
        /* Init lttng session config */
@@ -342,6 +465,7 @@ error:
 int cmd_create(int argc, const char **argv)
 {
        int opt, ret = CMD_SUCCESS;
+       char *opt_arg = NULL;
        static poptContext pc;
 
        pc = poptGetContext(NULL, argc, argv, long_options, 0);
@@ -355,6 +479,35 @@ int cmd_create(int argc, const char **argv)
                case OPT_LIST_OPTIONS:
                        list_cmd_options(stdout, long_options);
                        goto end;
+               case OPT_LIVE_TIMER:
+               {
+                       unsigned long v;
+
+                       errno = 0;
+                       opt_arg = poptGetOptArg(pc);
+                       if (!opt_arg) {
+                               /* Set up default values. */
+                               opt_live_timer = (uint32_t) DEFAULT_LTTNG_LIVE_TIMER;
+                               DBG("Session live timer interval set to default value %d",
+                                               opt_live_timer);
+                               break;
+                       }
+
+                       v = strtoul(opt_arg, NULL, 0);
+                       if (errno != 0 || !isdigit(opt_arg[0])) {
+                               ERR("Wrong value in --live parameter: %s", opt_arg);
+                               ret = CMD_ERROR;
+                               goto end;
+                       }
+                       if (v != (uint32_t) v) {
+                               ERR("32-bit overflow in --live parameter: %s", opt_arg);
+                               ret = CMD_ERROR;
+                               goto end;
+                       }
+                       opt_live_timer = (uint32_t) v;
+                       DBG("Session live timer interval set to %d", opt_live_timer);
+                       break;
+               }
                default:
                        usage(stderr);
                        ret = CMD_UNDEFINED;
This page took 0.026469 seconds and 4 git commands to generate.