X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fadd_trigger.c;h=d460c0ffbda494a31aedd1b1832f498587254c00;hp=17e06445b49ca9f8d6b9a935beecd77c38ca05a8;hb=bbadb5e0b423348492c56ef7d8430087d9d9349d;hpb=e45dd625d3e802d8e6e2ec3de180c73546e8f9fe diff --git a/src/bin/lttng/commands/add_trigger.c b/src/bin/lttng/commands/add_trigger.c index 17e06445b..d460c0ffb 100644 --- a/src/bin/lttng/commands/add_trigger.c +++ b/src/bin/lttng/commands/add_trigger.c @@ -40,9 +40,8 @@ enum { OPT_CONDITION, OPT_ACTION, OPT_ID, - OPT_FIRE_ONCE_AFTER, - OPT_FIRE_EVERY, OPT_USER_ID, + OPT_RATE_POLICY, OPT_ALL, OPT_FILTER, @@ -1335,13 +1334,84 @@ error: end: return cond; } + +static struct lttng_rate_policy *parse_rate_policy(const char *policy_str) +{ + int num_token; + char **tokens = NULL; + struct lttng_rate_policy *policy = NULL; + enum lttng_rate_policy_type policy_type; + unsigned long long value; + char *policy_type_str; + char *policy_value_str; + + assert(policy_str); + + /* + * rate policy fields are separated by ':'. + */ + tokens = strutils_split(policy_str, ':', 1); + num_token = strutils_array_of_strings_len(tokens); + + /* + * Early sanity check that the number of parameter is exactly 2. + * i.e : type:value + */ + if (num_token != 2) { + ERR("Rate policy format is invalid."); + goto end; + } + + policy_type_str = tokens[0]; + policy_value_str = tokens[1]; + + /* Parse the type. */ + if (strcmp(policy_type_str, "once-after") == 0) { + policy_type = LTTNG_RATE_POLICY_TYPE_ONCE_AFTER_N; + } else if (strcmp(policy_type_str, "every") == 0) { + policy_type = LTTNG_RATE_POLICY_TYPE_EVERY_N; + } else { + ERR("Rate policy type `%s` unknown.", policy_type_str); + goto end; + } + + /* Parse the value. */ + if (utils_parse_unsigned_long_long(policy_value_str, &value) != 0) { + ERR("Failed to parse rate policy value `%s` as an integer.", + policy_value_str); + goto end; + } + + if (value == 0) { + ERR("Rate policy value `%s` must be > 0.", policy_value_str); + goto end; + } + + switch (policy_type) { + case LTTNG_RATE_POLICY_TYPE_EVERY_N: + policy = lttng_rate_policy_every_n_create(value); + break; + case LTTNG_RATE_POLICY_TYPE_ONCE_AFTER_N: + policy = lttng_rate_policy_once_after_n_create(value); + break; + default: + abort(); + } + + if (policy == NULL) { + ERR("Failed to create rate policy `%s`.", policy_str); + } + +end: + strutils_free_null_terminated_array_of_strings(tokens); + return policy; +} + static const struct argpar_opt_descr notify_action_opt_descrs[] = { - { OPT_FIRE_ONCE_AFTER, '\0', "fire-once-after", true }, - { OPT_FIRE_EVERY, '\0', "fire-every", true }, + { OPT_RATE_POLICY, '\0', "rate-policy", true }, ARGPAR_OPT_DESCR_SENTINEL }; - static struct lttng_action *handle_action_notify(int *argc, const char ***argv) { @@ -1349,9 +1419,7 @@ struct lttng_action *handle_action_notify(int *argc, const char ***argv) struct argpar_state *state = NULL; struct argpar_item *item = NULL; char *error = NULL; - char *fire_once_after_str = NULL; - char *fire_every_str = NULL; - struct lttng_firing_policy *policy = NULL; + struct lttng_rate_policy *policy = NULL; state = argpar_state_create(*argc, *argv, notify_action_opt_descrs); if (!state) { @@ -1381,27 +1449,14 @@ struct lttng_action *handle_action_notify(int *argc, const char ***argv) (const struct argpar_item_opt *) item; switch (item_opt->descr->id) { - case OPT_FIRE_ONCE_AFTER: - { - if (!assign_string(&fire_once_after_str, - item_opt->arg, - "--fire-once-after")) { - goto error; - } - - break; - } - case OPT_FIRE_EVERY: + case OPT_RATE_POLICY: { - if (!assign_string(&fire_every_str, - item_opt->arg, - "--fire-every")) { + policy = parse_rate_policy(item_opt->arg); + if (!policy) { goto error; } - break; } - default: abort(); } @@ -1424,55 +1479,6 @@ struct lttng_action *handle_action_notify(int *argc, const char ***argv) *argc -= argpar_state_get_ingested_orig_args(state); *argv += argpar_state_get_ingested_orig_args(state); - if (fire_once_after_str && fire_every_str) { - ERR("--fire-once and --fire-every are mutually exclusive."); - goto error; - } - - if (fire_once_after_str) { - unsigned long long threshold; - - if (utils_parse_unsigned_long_long( - fire_once_after_str, &threshold) != 0) { - ERR("Failed to parse `%s` as an integer.", - fire_once_after_str); - goto error; - } - - if (threshold == 0) { - ERR("Once after N policy threshold cannot be `0`."); - goto error; - } - - policy = lttng_firing_policy_once_after_n_create(threshold); - if (!policy) { - ERR("Failed to create policy once after `%s`.", - fire_once_after_str); - goto error; - } - } - - if (fire_every_str) { - unsigned long long interval; - if (utils_parse_unsigned_long_long(fire_every_str, &interval) != - 0) { - ERR("Failed to parse `%s` as an integer.", - fire_every_str); - goto error; - } - if (interval == 0) { - ERR("Every N policy interval cannot be `0`."); - goto error; - } - - policy = lttng_firing_policy_every_n_create(interval); - if (!policy) { - ERR("Failed to create policy every `%s`.", - fire_every_str); - goto error; - } - } - action = lttng_action_notify_create(); if (!action) { ERR("Failed to create notify action"); @@ -1481,9 +1487,9 @@ struct lttng_action *handle_action_notify(int *argc, const char ***argv) if (policy) { enum lttng_action_status status; - status = lttng_action_notify_set_firing_policy(action, policy); + status = lttng_action_notify_set_rate_policy(action, policy); if (status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to set firing policy"); + ERR("Failed to set rate policy"); goto error; } } @@ -1495,9 +1501,7 @@ error: action = NULL; free(error); end: - free(fire_once_after_str); - free(fire_every_str); - lttng_firing_policy_destroy(policy); + lttng_rate_policy_destroy(policy); argpar_state_destroy(state); argpar_item_destroy(item); return action; @@ -1505,7 +1509,7 @@ end: /* * Generic handler for a kind of action that takes a session name and an - * optional firing policy. + * optional rate policy. */ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, @@ -1513,31 +1517,28 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, struct lttng_action *(*create_action_cb)(void), enum lttng_action_status (*set_session_name_cb)( struct lttng_action *, const char *), - enum lttng_action_status (*set_firing_policy_cb)( + enum lttng_action_status (*set_rate_policy_cb)( struct lttng_action *, - const struct lttng_firing_policy *), + const struct lttng_rate_policy *), const char *action_name) { struct lttng_action *action = NULL; struct argpar_state *state = NULL; struct argpar_item *item = NULL; const char *session_name_arg = NULL; - char *fire_once_after_str = NULL; - char *fire_every_str = NULL; char *error = NULL; enum lttng_action_status action_status; - struct lttng_firing_policy *policy = NULL; + struct lttng_rate_policy *policy = NULL; assert(set_session_name_cb); - assert(set_firing_policy_cb); + assert(set_rate_policy_cb); - const struct argpar_opt_descr firing_policy_opt_descrs[] = { - { OPT_FIRE_ONCE_AFTER, '\0', "fire-once-after", true }, - { OPT_FIRE_EVERY, '\0', "fire-every", true }, + const struct argpar_opt_descr rate_policy_opt_descrs[] = { + { OPT_RATE_POLICY, '\0', "rate-policy", true }, ARGPAR_OPT_DESCR_SENTINEL }; - state = argpar_state_create(*argc, *argv, firing_policy_opt_descrs); + state = argpar_state_create(*argc, *argv, rate_policy_opt_descrs); if (!state) { ERR("Failed to allocate an argpar state."); goto error; @@ -1565,27 +1566,14 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, (const struct argpar_item_opt *) item; switch (item_opt->descr->id) { - case OPT_FIRE_ONCE_AFTER: - { - if (!assign_string(&fire_once_after_str, - item_opt->arg, - "--fire-once-after")) { - goto error; - } - - break; - } - case OPT_FIRE_EVERY: + case OPT_RATE_POLICY: { - if (!assign_string(&fire_every_str, - item_opt->arg, - "--fire-every")) { + policy = parse_rate_policy(item_opt->arg); + if (!policy) { goto error; } - break; } - default: abort(); } @@ -1613,55 +1601,6 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, goto error; } - if (fire_once_after_str && fire_every_str) { - ERR("--fire-once and --fire-every are mutually exclusive."); - goto error; - } - - if (fire_once_after_str) { - unsigned long long threshold; - - if (utils_parse_unsigned_long_long( - fire_once_after_str, &threshold) != 0) { - ERR("Failed to parse `%s` as an integer.", - fire_once_after_str); - goto error; - } - - if (threshold == 0) { - ERR("Once after N policy threshold cannot be `0`."); - goto error; - } - - policy = lttng_firing_policy_once_after_n_create(threshold); - if (!policy) { - ERR("Failed to create policy once after `%s`.", - fire_once_after_str); - goto error; - } - } - - if (fire_every_str) { - unsigned long long interval; - if (utils_parse_unsigned_long_long(fire_every_str, &interval) != - 0) { - ERR("Failed to parse `%s` as an integer.", - fire_every_str); - goto error; - } - if (interval == 0) { - ERR("Every N policy interval cannot be `0`."); - goto error; - } - - policy = lttng_firing_policy_every_n_create(interval); - if (!policy) { - ERR("Failed to create policy every `%s`.", - fire_every_str); - goto error; - } - } - action = create_action_cb(); if (!action) { ERR("Failed to allocate %s session action.", action_name); @@ -1676,9 +1615,9 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, } if (policy) { - action_status = set_firing_policy_cb(action, policy); + action_status = set_rate_policy_cb(action, policy); if (action_status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to set firing policy"); + ERR("Failed to set rate policy"); goto error; } } @@ -1690,7 +1629,7 @@ error: action = NULL; argpar_item_destroy(item); end: - lttng_firing_policy_destroy(policy); + lttng_rate_policy_destroy(policy); free(error); argpar_state_destroy(state); return action; @@ -1703,7 +1642,7 @@ struct lttng_action *handle_action_start_session(int *argc, return handle_action_simple_session_with_policy(argc, argv, lttng_action_start_session_create, lttng_action_start_session_set_session_name, - lttng_action_start_session_set_firing_policy, "start"); + lttng_action_start_session_set_rate_policy, "start"); } static @@ -1713,7 +1652,7 @@ struct lttng_action *handle_action_stop_session(int *argc, return handle_action_simple_session_with_policy(argc, argv, lttng_action_stop_session_create, lttng_action_stop_session_set_session_name, - lttng_action_stop_session_set_firing_policy, "stop"); + lttng_action_stop_session_set_rate_policy, "stop"); } static @@ -1723,7 +1662,7 @@ struct lttng_action *handle_action_rotate_session(int *argc, return handle_action_simple_session_with_policy(argc, argv, lttng_action_rotate_session_create, lttng_action_rotate_session_set_session_name, - lttng_action_rotate_session_set_firing_policy, + lttng_action_rotate_session_set_rate_policy, "rotate"); } @@ -1734,8 +1673,7 @@ static const struct argpar_opt_descr snapshot_action_opt_descrs[] = { { OPT_DATA_URL, '\0', "data-url", true }, { OPT_URL, '\0', "url", true }, { OPT_PATH, '\0', "path", true }, - { OPT_FIRE_ONCE_AFTER, '\0', "fire-once-after", true }, - { OPT_FIRE_EVERY, '\0', "fire-every", true }, + { OPT_RATE_POLICY, '\0', "rate-policy", true }, ARGPAR_OPT_DESCR_SENTINEL }; @@ -1754,11 +1692,9 @@ struct lttng_action *handle_action_snapshot_session(int *argc, char *url_arg = NULL; char *path_arg = NULL; char *error = NULL; - char *fire_once_after_str = NULL; - char *fire_every_str = NULL; enum lttng_action_status action_status; struct lttng_snapshot_output *snapshot_output = NULL; - struct lttng_firing_policy *policy = NULL; + struct lttng_rate_policy *policy = NULL; int ret; unsigned int locations_specified = 0; @@ -1826,27 +1762,14 @@ struct lttng_action *handle_action_snapshot_session(int *argc, } break; - case OPT_FIRE_ONCE_AFTER: - { - if (!assign_string(&fire_once_after_str, - item_opt->arg, - "--fire-once-after")) { - goto error; - } - - break; - } - case OPT_FIRE_EVERY: + case OPT_RATE_POLICY: { - if (!assign_string(&fire_every_str, - item_opt->arg, - "--fire-every")) { + policy = parse_rate_policy(item_opt->arg); + if (!policy) { goto error; } - break; } - default: abort(); } @@ -1910,56 +1833,6 @@ struct lttng_action *handle_action_snapshot_session(int *argc, } } - /* Any firing policy ? */ - if (fire_once_after_str && fire_every_str) { - ERR("--fire-once and --fire-every are mutually exclusive."); - goto error; - } - - if (fire_once_after_str) { - unsigned long long threshold; - - if (utils_parse_unsigned_long_long( - fire_once_after_str, &threshold) != 0) { - ERR("Failed to parse `%s` as an integer.", - fire_once_after_str); - goto error; - } - - if (threshold == 0) { - ERR("Once after N policy threshold cannot be `0`."); - goto error; - } - - policy = lttng_firing_policy_once_after_n_create(threshold); - if (!policy) { - ERR("Failed to create policy once after `%s`.", - fire_once_after_str); - goto error; - } - } - - if (fire_every_str) { - unsigned long long interval; - if (utils_parse_unsigned_long_long(fire_every_str, &interval) != - 0) { - ERR("Failed to parse `%s` as an integer.", - fire_every_str); - goto error; - } - if (interval == 0) { - ERR("Every N policy interval cannot be `0`."); - goto error; - } - - policy = lttng_firing_policy_every_n_create(interval); - if (!policy) { - ERR("Failed to create policy every `%s`.", - fire_every_str); - goto error; - } - } - action = lttng_action_snapshot_session_create(); if (!action) { ERR("Failed to allocate snapshot session action."); @@ -2083,10 +1956,10 @@ struct lttng_action *handle_action_snapshot_session(int *argc, if (policy) { enum lttng_action_status status; - status = lttng_action_snapshot_session_set_firing_policy( + status = lttng_action_snapshot_session_set_rate_policy( action, policy); if (status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to set firing policy"); + ERR("Failed to set rate policy"); goto error; } } @@ -2105,7 +1978,7 @@ end: free(data_url_arg); free(snapshot_output); free(max_size_arg); - lttng_firing_policy_destroy(policy); + lttng_rate_policy_destroy(policy); argpar_state_destroy(state); argpar_item_destroy(item); return action;