From eb240553d4d24fd770d47a8e66ac3ac3bd5fe602 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Thu, 11 Jul 2013 16:57:53 -0400 Subject: [PATCH] Support del-output with an output name Signed-off-by: David Goulet --- src/bin/lttng-sessiond/cmd.c | 15 +++++++++----- src/bin/lttng-sessiond/snapshot.c | 26 +++++++++++++++++++++++ src/bin/lttng-sessiond/snapshot.h | 2 ++ src/bin/lttng/commands/snapshot.c | 34 ++++++++++++++++++++++++++----- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 850bac508..b2faa41b1 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -2279,14 +2279,11 @@ int cmd_snapshot_del_output(struct ltt_session *session, struct lttng_snapshot_output *output) { int ret; - struct snapshot_output *sout; + struct snapshot_output *sout = NULL; assert(session); assert(output); - DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id, - session->name); - rcu_read_lock(); /* @@ -2298,7 +2295,15 @@ int cmd_snapshot_del_output(struct ltt_session *session, goto error; } - sout = snapshot_find_output_by_id(output->id, &session->snapshot); + if (output->id) { + DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id, + session->name); + sout = snapshot_find_output_by_id(output->id, &session->snapshot); + } else if (*output->name != '\0') { + DBG("Cmd snapshot del output name %s for session %s", output->name, + session->name); + sout = snapshot_find_output_by_name(output->name, &session->snapshot); + } if (!sout) { ret = LTTNG_ERR_INVALID; goto error; diff --git a/src/bin/lttng-sessiond/snapshot.c b/src/bin/lttng-sessiond/snapshot.c index d2fc8ca69..4c23ee424 100644 --- a/src/bin/lttng-sessiond/snapshot.c +++ b/src/bin/lttng-sessiond/snapshot.c @@ -222,6 +222,32 @@ void snapshot_output_destroy(struct snapshot_output *obj) free(obj); } +/* + * RCU read side lock MUST be acquired before calling this since the returned + * pointer is in a RCU hash table. + * + * Return the reference on success or else NULL. + */ +struct snapshot_output *snapshot_find_output_by_name(const char *name, + struct snapshot *snapshot) +{ + struct lttng_ht_iter iter; + struct snapshot_output *output = NULL; + + assert(snapshot); + assert(name); + + cds_lfht_for_each_entry(snapshot->output_ht->ht, &iter.iter, output, + node.node) { + if (!strncmp(output->name, name, strlen(name))) { + return output; + } + } + + /* Not found */ + return NULL; +} + /* * RCU read side lock MUST be acquired before calling this since the returned * pointer is in a RCU hash table. diff --git a/src/bin/lttng-sessiond/snapshot.h b/src/bin/lttng-sessiond/snapshot.h index 44d2ae7f5..a505128a6 100644 --- a/src/bin/lttng-sessiond/snapshot.h +++ b/src/bin/lttng-sessiond/snapshot.h @@ -75,5 +75,7 @@ int snapshot_output_init_with_uri(uint64_t max_size, const char *name, struct snapshot *snapshot); struct snapshot_output *snapshot_find_output_by_id(uint32_t id, struct snapshot *snapshot); +struct snapshot_output *snapshot_find_output_by_name(const char *name, + struct snapshot *snapshot); #endif /* SNAPSHOT_H */ diff --git a/src/bin/lttng/commands/snapshot.c b/src/bin/lttng/commands/snapshot.c index be28511b3..f58d9516b 100644 --- a/src/bin/lttng/commands/snapshot.c +++ b/src/bin/lttng/commands/snapshot.c @@ -211,7 +211,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 +222,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 +240,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); @@ -297,6 +309,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 +318,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; -- 2.34.1