Mi: mi backend + mi for command version
[lttng-tools.git] / src / bin / lttng / commands / snapshot.c
index be28511b33f65c5a5cc39710b7c755432aacb6a7..564651e09c50480c22f45952e02833627f11364e 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <common/utils.h>
 #include <lttng/snapshot.h>
 
 #include "../command.h"
@@ -49,6 +50,7 @@ enum {
        OPT_HELP = 1,
        OPT_LIST_OPTIONS,
        OPT_MAX_SIZE,
+       OPT_LIST_COMMANDS,
 };
 
 static struct poptOption snapshot_opts[] = {
@@ -58,8 +60,9 @@ static struct poptOption snapshot_opts[] = {
        {"ctrl-url",     'C', POPT_ARG_STRING, &opt_ctrl_url, 0, 0, 0},
        {"data-url",     'D', POPT_ARG_STRING, &opt_data_url, 0, 0, 0},
        {"name",         'n', POPT_ARG_STRING, &opt_output_name, 0, 0, 0},
-       {"max-size",     'm', POPT_ARG_DOUBLE, 0, OPT_MAX_SIZE, 0, 0},
+       {"max-size",     'm', POPT_ARG_STRING, 0, OPT_MAX_SIZE, 0, 0},
        {"list-options",   0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL},
+       {"list-commands",  0, POPT_ARG_NONE, NULL, OPT_LIST_COMMANDS},
        {0, 0, 0, 0, 0, 0, 0}
 };
 
@@ -76,13 +79,13 @@ static struct cmd_struct actions[] = {
  */
 static void usage(FILE *ofp)
 {
-       fprintf(ofp, "usage: lttng snapshot [ACTION]\n");
+       fprintf(ofp, "usage: lttng snapshot [OPTION] ACTION\n");
        fprintf(ofp, "\n");
        fprintf(ofp, "Actions:\n");
        fprintf(ofp, "   add-output [-m <SIZE>] [-s <NAME>] [-n <NAME>] <URL> | -C <URL> -D <URL>\n");
        fprintf(ofp, "      Setup and add an snapshot output for a session.\n");
        fprintf(ofp, "\n");
-       fprintf(ofp, "   del-output ID [-s <NAME>]\n");
+       fprintf(ofp, "   del-output ID | NAME [-s <NAME>]\n");
        fprintf(ofp, "      Delete an output for a session using the ID.\n");
        fprintf(ofp, "\n");
        fprintf(ofp, "   list-output [-s <NAME>]\n");
@@ -91,15 +94,16 @@ static void usage(FILE *ofp)
        fprintf(ofp, "   record [-m <SIZE>] [-s <NAME>] [-n <NAME>] [<URL> | -C <URL> -D <URL>]\n");
        fprintf(ofp, "      Snapshot a session's buffer(s) for all domains. If an URL is\n");
        fprintf(ofp, "      specified, it is used instead of a previously added output.\n");
-       fprintf(ofp, "      The snapshot is saved in the session directory in snapshot/ with\n");
-       fprintf(ofp, "      the top directory being NAME or the default: snapshot-ID/\n");
+       fprintf(ofp, "      Specifying only a name or/a size will override the current output value.\n");
+       fprintf(ofp, "      For instance, you can record a snapshot with a custom maximum size\n");
+       fprintf(ofp, "      or with a different name.\n");
        fprintf(ofp, "\n");
        fprintf(ofp, "Options:\n");
        fprintf(ofp, "  -h, --help           Show this help\n");
        fprintf(ofp, "      --list-options   Simple listing of options\n");
        fprintf(ofp, "  -s, --session NAME   Apply to session name\n");
        fprintf(ofp, "  -n, --name NAME      Name of the output or snapshot\n");
-       fprintf(ofp, "  -m, --max-size SIZE  Maximum bytes size of the snapshot\n");
+       fprintf(ofp, "  -m, --max-size SIZE  Maximum bytes size of the snapshot {+k,+M,+G}\n");
        fprintf(ofp, "  -C, --ctrl-url URL   Set control path URL. (Must use -D also)\n");
        fprintf(ofp, "  -D, --data-url URL   Set data path URL. (Must use -C also)\n");
        fprintf(ofp, "\n");
@@ -191,10 +195,11 @@ static int list_output(void)
        MSG("Snapshot output list for session %s", current_session_name);
 
        while ((s_iter = lttng_snapshot_output_list_get_next(list)) != NULL) {
-               MSG("%s[%" PRIu32 "] %s: %s", indent4,
+               MSG("%s[%" PRIu32 "] %s: %s (max-size: %" PRId64 ")", indent4,
                                lttng_snapshot_output_get_id(s_iter),
                                lttng_snapshot_output_get_name(s_iter),
-                               lttng_snapshot_output_get_ctrl_url(s_iter));
+                               lttng_snapshot_output_get_ctrl_url(s_iter),
+                               lttng_snapshot_output_get_maxsize(s_iter));
                output_seen = 1;
        }
 
@@ -211,7 +216,7 @@ error:
 /*
  * Delete output by ID.
  */
-static int del_output(uint32_t id)
+static int del_output(uint32_t id, const char *name)
 {
        int ret;
        struct lttng_snapshot_output *output = NULL;
@@ -222,7 +227,14 @@ static int del_output(uint32_t id)
                goto error;
        }
 
-       ret = lttng_snapshot_output_set_id(id, output);
+       if (name) {
+               ret = lttng_snapshot_output_set_name(name, output);
+       } else if (id != UINT32_MAX) {
+               ret = lttng_snapshot_output_set_id(id, output);
+       } else {
+               ret = CMD_ERROR;
+               goto error;
+       }
        if (ret < 0) {
                ret = CMD_FATAL;
                goto error;
@@ -233,8 +245,13 @@ static int del_output(uint32_t id)
                goto error;
        }
 
-       MSG("Snapshot output id %" PRIu32 " successfully deleted for session %s",
-                       id, current_session_name);
+       if (id != UINT32_MAX) {
+               MSG("Snapshot output id %" PRIu32 " successfully deleted for session %s",
+                               id, current_session_name);
+       } else {
+               MSG("Snapshot output %s successfully deleted for session %s",
+                               name, current_session_name);
+       }
 
 error:
        lttng_snapshot_output_destroy(output);
@@ -248,6 +265,8 @@ static int add_output(const char *url)
 {
        int ret;
        struct lttng_snapshot_output *output = NULL;
+       char name[NAME_MAX];
+       const char *n_ptr;
 
        if (!url && (!opt_data_url || !opt_ctrl_url)) {
                ret = CMD_ERROR;
@@ -266,11 +285,21 @@ static int add_output(const char *url)
                goto error;
        }
 
+       n_ptr = lttng_snapshot_output_get_name(output);
+       if (*n_ptr == '\0') {
+               int pret;
+               pret = snprintf(name, sizeof(name), DEFAULT_SNAPSHOT_NAME "-%" PRIu32,
+                               lttng_snapshot_output_get_id(output));
+               if (pret < 0) {
+                       PERROR("snprintf add output name");
+               }
+               n_ptr = name;
+       }
+
        MSG("Snapshot output successfully added for session %s",
                        current_session_name);
        MSG("  [%" PRIu32 "] %s: %s (max-size: %" PRId64 ")",
-                       lttng_snapshot_output_get_id(output),
-                       lttng_snapshot_output_get_name(output),
+                       lttng_snapshot_output_get_id(output), n_ptr,
                        lttng_snapshot_output_get_ctrl_url(output),
                        lttng_snapshot_output_get_maxsize(output));
 error:
@@ -297,6 +326,8 @@ end:
 static int cmd_del_output(int argc, const char **argv)
 {
        int ret = CMD_SUCCESS;
+       char *name;
+       long id;
 
        if (argc < 2) {
                usage(stderr);
@@ -304,7 +335,17 @@ static int cmd_del_output(int argc, const char **argv)
                goto end;
        }
 
-       ret = del_output(atoi(argv[1]));
+       errno = 0;
+       id = strtol(argv[1], &name, 10);
+       if (id == 0 && errno == 0) {
+               ret = del_output(UINT32_MAX, name);
+       } else if (errno == 0 && *name == '\0') {
+               ret = del_output(id, NULL);
+       } else {
+               ERR("Argument %s not recognized", argv[1]);
+               ret = -1;
+               goto end;
+       }
 
 end:
        return ret;
@@ -331,6 +372,11 @@ static int record(const char *url)
 
        ret = lttng_snapshot_record(current_session_name, output, 0);
        if (ret < 0) {
+               if (ret == -LTTNG_ERR_MAX_SIZE_INVALID) {
+                       ERR("The minimum size of a snapshot is computed by multiplying "
+                                       "the total amount of streams with the largest subbuffer "
+                                       "in the session.");
+               }
                goto error;
        }
 
@@ -406,6 +452,13 @@ int cmd_snapshot(int argc, const char **argv)
        pc = poptGetContext(NULL, argc, argv, snapshot_opts, 0);
        poptReadDefaultConfig(pc, 0);
 
+       /* TODO: mi support */
+       if (lttng_opt_mi) {
+               ret = -LTTNG_ERR_MI_NOT_IMPLEMENTED;
+               ERR("mi option not supported");
+               goto end;
+       }
+
        while ((opt = poptGetNextOpt(pc)) != -1) {
                switch (opt) {
                case OPT_HELP:
@@ -414,27 +467,20 @@ int cmd_snapshot(int argc, const char **argv)
                case OPT_LIST_OPTIONS:
                        list_cmd_options(stdout, snapshot_opts);
                        goto end;
+               case OPT_LIST_COMMANDS:
+                       list_commands(actions, stdout);
+                       goto end;
                case OPT_MAX_SIZE:
                {
-                       long long int val;
-                       char *endptr;
+                       uint64_t val;
                        const char *opt = poptGetOptArg(pc);
 
-                       /* Documented by the man page of strtoll(3). */
-                       errno = 0;
-                       val = strtoll(opt, &endptr, 10);
-                       if ((errno == ERANGE && (val == LLONG_MAX || val == LONG_MIN))
-                                       || (errno != 0 && val == 0)) {
+                       if (utils_parse_size_suffix((char *) opt, &val) < 0) {
                                ERR("Unable to handle max-size value %s", opt);
                                ret = CMD_ERROR;
                                goto end;
                        }
 
-                       if (endptr == opt) {
-                               ERR("No digits were found in %s", opt);
-                               ret = CMD_ERROR;
-                               goto end;
-                       }
                        opt_max_size = val;
 
                        break;
@@ -459,10 +505,17 @@ int cmd_snapshot(int argc, const char **argv)
 
        ret = handle_command(poptGetArgs(pc));
        if (ret < 0) {
-               if (ret == -LTTNG_ERR_EPERM) {
+               switch (-ret) {
+               case LTTNG_ERR_EPERM:
                        ERR("The session needs to be set in no output mode (--no-output)");
+                       break;
+               case LTTNG_ERR_SNAPSHOT_NODATA:
+                       WARN("%s", lttng_strerror(ret));
+                       break;
+               default:
+                       ERR("%s", lttng_strerror(ret));
+                       break;
                }
-               ERR("%s", lttng_strerror(ret));
                goto end;
        }
 
This page took 0.027476 seconds and 4 git commands to generate.