Add support for shorten session uuid
authorDavid Goulet <david.goulet@polymtl.ca>
Wed, 4 May 2011 16:26:03 +0000 (12:26 -0400)
committerDavid Goulet <david.goulet@polymtl.ca>
Wed, 4 May 2011 16:28:52 +0000 (12:28 -0400)
Session are now identified by name.short_uuid where short_uuid is the
first 8 bytes of the 36 bytes uuid.

Also, fix the bug where you could'nt pass two command to the session
daemon from liblttngctl. The connect and disconnect is added to the
ask_sessiond function. So, on every command, a connect and close is
done.

Signed-off-by: David Goulet <david.goulet@polymtl.ca>
liblttngctl/liblttngctl.c
ltt-sessiond/main.c
lttng/lttng.c

index 76bdf5ffde2ff29b43940f3226f51fc8d5a10329..adff646e175b50d1847c8ee6d4e6f9a5b68e2276 100644 (file)
@@ -111,6 +111,11 @@ static int ask_sessiond(enum lttcomm_command_type lct, void **buf)
        size_t size;
        void *data = NULL;
 
+       ret = lttng_connect_sessiond();
+       if (ret < 0) {
+               goto end;
+       }
+
        lsm.cmd_type = lct;
 
        /* Send command to session daemon */
@@ -148,7 +153,7 @@ static int ask_sessiond(enum lttcomm_command_type lct, void **buf)
        ret = size;
 
 end:
-       /* Reset lsm data struct */
+       lttng_disconnect_sessiond();
        memset(&lsm, 0, sizeof(lsm));
        return ret;
 }
index 2fd6222999faeaae1833e4acb8e53f0c79d2e1c1..241a1cffd32533ee56f11299e7748b043b4a7da1 100644 (file)
@@ -242,6 +242,7 @@ static int connect_app(pid_t pid)
        lta = find_app_by_pid(pid);
        if (lta == NULL) {
                /* App not found */
+               DBG("Application pid %d not found", pid);
                return -1;
        }
 
@@ -645,6 +646,7 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm)
        return ret;
 
 end:
+       DBG("Return code to client %d", ret);
        /* Notify client of error */
        llm.ret_code = ret;
        llm.size_payload = 0;
index a5569c9af3186e7b9683ee871b32dbb73beee96e..3c3747de1f002a971ab64794f4a6f8ffe68a8036 100644 (file)
@@ -37,6 +37,7 @@
 
 /* Variables */
 static char *progname;
+static char short_uuid[9];
 
 /* Prototypes */
 static int process_client_opt(void);
@@ -44,7 +45,9 @@ static int process_opt_list_apps(void);
 static int process_opt_list_sessions(void);
 static int process_opt_list_traces(void);
 static int process_opt_create_session(void);
+static int process_opt_session_uuid(void);
 static void sighandler(int sig);
+static void shorten_uuid(char *in, char *out);
 static int set_signal_handler(void);
 static int validate_options(void);
 static char *get_cmdline_by_pid(pid_t pid);
@@ -61,12 +64,6 @@ static int process_client_opt(void)
        int ret;
        uuid_t uuid;
 
-       /* Connect to the session daemon */
-       ret = lttng_connect_sessiond();
-       if (ret < 0) {
-               goto end;
-       }
-
        if (opt_list_apps) {
                ret = process_opt_list_apps();
                if (ret < 0) {
@@ -104,8 +101,12 @@ static int process_client_opt(void)
        }
 
        if (opt_session_uuid != NULL) {
-               DBG("Set session uuid to %s", opt_session_uuid);
-               lttng_set_current_session_uuid(opt_session_uuid);
+               DBG("Set session uuid to %s", short_uuid);
+               ret = process_opt_session_uuid();
+               if (ret < 0) {
+                       ERR("Session UUID %s not found", opt_session_uuid);
+                       goto error;
+               }
        }
 
        if (opt_trace_kernel) {
@@ -146,6 +147,41 @@ static int process_client_opt(void)
 end:
        ERR("%s", lttng_get_readable_code(ret));
        return ret;
+
+error:
+       return ret;
+}
+
+/*
+ *  process_opt_session_uuid
+ *
+ *  Set current session uuid to the current flow of
+ *  command(s) using the already shorten uuid.
+ */
+static int process_opt_session_uuid(void)
+{
+       int ret, count, i;
+       struct lttng_session *sessions;
+
+       count = lttng_list_sessions(&sessions);
+       if (count < 0) {
+               ret = count;
+               goto error;
+       }
+
+       for (i = 0; i < count; i++) {
+               if (strncmp(sessions[i].uuid, short_uuid, 8) == 0) {
+                       lttng_set_current_session_uuid(sessions[i].uuid);
+                       break;
+               }
+       }
+
+       free(sessions);
+
+       return 0;
+
+error:
+       return ret;
 }
 
 /*
@@ -215,6 +251,38 @@ error:
        return ret;
 }
 
+/*
+ *  extract_short_uuid
+ *
+ *  Extract shorten uuid and copy it to out.
+ *  Shorten uuid format : '<name>.<short_uuid>'
+ */
+static int extract_short_uuid(char *in, char *out)
+{
+       char *tok;
+
+       tok = strchr(in, '.');
+       if (strlen(tok+1) == 8) {
+               memcpy(out, tok+1, 8);
+               out[9] = '\0';
+               return 0;
+       }
+
+       return -1;
+}
+
+/*
+ * shorten_uuid
+ *
+ * Small function to shorten the 37 bytes long uuid_t
+ * string representation to 8 characters.
+ */
+static void shorten_uuid(char *in, char *out)
+{
+       memcpy(out, in, 8);
+       out[8] = '\0';
+}
+
 /*
  *  process_opt_list_sessions
  *
@@ -224,21 +292,24 @@ error:
 static int process_opt_list_sessions(void)
 {
        int ret, count, i;
+       char tmp_short_uuid[9];
        struct lttng_session *sess;
 
        count = lttng_list_sessions(&sess);
+       DBG("Session count %d", count);
        if (count < 0) {
                ret = count;
                goto error;
        }
 
-       MSG("Available sessions [Name (uuid)]:");
+       MSG("Available sessions (UUIDs):");
        for (i = 0; i < count; i++) {
-               MSG("\tName: %s (uuid: %s)", sess[i].name, sess[i].uuid);
+               shorten_uuid(sess[i].uuid, tmp_short_uuid);
+               MSG("    %d) %s.%s", i+1, sess[i].name, tmp_short_uuid);
        }
 
        free(sess);
-       MSG("\nTo select a session, use --session UUID.");
+       MSG("\nTo select a session, use -s, --session UUID.");
 
        return 0;
 
@@ -326,6 +397,8 @@ end:
  */
 static int validate_options(void)
 {
+       int ret;
+
        /* Conflicting command */
        if (opt_start_trace && opt_stop_trace) {
                ERR("Can't use --start and --stop together.");
@@ -342,6 +415,14 @@ static int validate_options(void)
                goto error;
        }
 
+       if (opt_session_uuid != NULL) {
+               ret = extract_short_uuid(opt_session_uuid, short_uuid);
+               if (ret < 0) {
+                       ERR("Session UUID not valid. Must be <name>.<short_uuid>");
+                       goto error;
+               }
+       }
+
        return 0;
 
 error:
@@ -498,15 +579,13 @@ static void sighandler(int sig)
 
        return;
 }
+
 /*
  * clean_exit
  */
 void clean_exit(int code)
 {
        DBG("Clean exit");
-       if (lttng_disconnect_sessiond() < 0) {
-               ERR("Session daemon disconnect failed.");
-       }
        exit(code);
 }
 
This page took 0.032824 seconds and 5 git commands to generate.