X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fagent.c;h=77846b4f2251e7891d4f32b5ad196da4f4535f53;hb=48c77bf7ccc9a88c229432a6db4871940914bedb;hp=4a09c3ec68c0ce390ade66dab4e7f98e04058fcd;hpb=670a26e4165562ab2dc5a16b9941f942e4f30996;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/agent.c b/src/bin/lttng-sessiond/agent.c index 4a09c3ec6..77846b4f2 100644 --- a/src/bin/lttng-sessiond/agent.c +++ b/src/bin/lttng-sessiond/agent.c @@ -7,13 +7,14 @@ */ #define _LGPL_SOURCE -#include #include #include #include #include -#include +#include +#include +#include #include #include #include @@ -31,6 +32,12 @@ #define AGENT_RET_CODE_INDEX(code) (code - AGENT_RET_CODE_SUCCESS) +typedef enum lttng_event_rule_status (*event_rule_logging_get_name_pattern)( + const struct lttng_event_rule *rule, const char **pattern); +typedef enum lttng_event_rule_status (*event_rule_logging_get_log_level_rule)( + const struct lttng_event_rule *rule, + const struct lttng_log_level_rule **log_level_rule); + /* * Agent application context representation. */ @@ -89,8 +96,8 @@ static int ht_match_event_by_name(struct cds_lfht_node *node, struct agent_event *event; const struct agent_ht_key *key; - assert(node); - assert(_key); + LTTNG_ASSERT(node); + LTTNG_ASSERT(_key); event = caa_container_of(node, struct agent_event, node.node); key = _key; @@ -119,8 +126,8 @@ static int ht_match_event(struct cds_lfht_node *node, const struct agent_ht_key *key; int ll_match; - assert(node); - assert(_key); + LTTNG_ASSERT(node); + LTTNG_ASSERT(_key); event = caa_container_of(node, struct agent_event, node.node); key = _key; @@ -169,9 +176,9 @@ static void add_unique_agent_event(struct lttng_ht *ht, struct cds_lfht_node *node_ptr; struct agent_ht_key key; - assert(ht); - assert(ht->ht); - assert(event); + LTTNG_ASSERT(ht); + LTTNG_ASSERT(ht->ht); + LTTNG_ASSERT(event); key.name = event->name; key.loglevel_value = event->loglevel_value; @@ -181,7 +188,7 @@ static void add_unique_agent_event(struct lttng_ht *ht, node_ptr = cds_lfht_add_unique(ht->ht, ht->hash_fct(event->node.key, lttng_ht_seed), ht_match_event, &key, &event->node.node); - assert(node_ptr == &event->node.node); + LTTNG_ASSERT(node_ptr == &event->node.node); } /* @@ -223,7 +230,7 @@ static int send_header(struct lttcomm_sock *sock, uint64_t data_size, ssize_t size; struct lttcomm_agent_hdr msg; - assert(sock); + LTTNG_ASSERT(sock); memset(&msg, 0, sizeof(msg)); msg.data_size = htobe64(data_size); @@ -253,8 +260,8 @@ static int send_payload(struct lttcomm_sock *sock, const void *data, int ret; ssize_t len; - assert(sock); - assert(data); + LTTNG_ASSERT(sock); + LTTNG_ASSERT(data); len = sock->ops->sendmsg(sock, data, size, 0); if (len < size) { @@ -278,8 +285,8 @@ static int recv_reply(struct lttcomm_sock *sock, void *buf, size_t size) int ret; ssize_t len; - assert(sock); - assert(buf); + LTTNG_ASSERT(sock); + LTTNG_ASSERT(buf); len = sock->ops->recvmsg(sock, buf, size, 0); if (len < size) { @@ -309,9 +316,9 @@ static ssize_t list_events(struct agent_app *app, struct lttng_event **events) struct lttcomm_agent_list_reply *reply = NULL; struct lttcomm_agent_list_reply_hdr reply_hdr; - assert(app); - assert(app->sock); - assert(events); + LTTNG_ASSERT(app); + LTTNG_ASSERT(app->sock); + LTTNG_ASSERT(events); DBG2("Agent listing events for app pid: %d and socket %d", app->pid, app->sock->fd); @@ -399,9 +406,9 @@ static int enable_event(const struct agent_app *app, struct agent_event *event) struct lttcomm_agent_enable_event msg; struct lttcomm_agent_generic_reply reply; - assert(app); - assert(app->sock); - assert(event); + LTTNG_ASSERT(app); + LTTNG_ASSERT(app->sock); + LTTNG_ASSERT(event); DBG2("Agent enabling event %s for app pid: %d and socket %d", event->name, app->pid, app->sock->fd); @@ -512,10 +519,10 @@ static int app_context_op(const struct agent_app *app, struct lttcomm_agent_generic_reply reply; size_t app_ctx_provider_name_len, app_ctx_name_len, data_size; - assert(app); - assert(app->sock); - assert(ctx); - assert(cmd == AGENT_CMD_APP_CTX_ENABLE || + LTTNG_ASSERT(app); + LTTNG_ASSERT(app->sock); + LTTNG_ASSERT(ctx); + LTTNG_ASSERT(cmd == AGENT_CMD_APP_CTX_ENABLE || cmd == AGENT_CMD_APP_CTX_DISABLE); DBG2("Agent %s application %s:%s for app pid: %d and socket %d", @@ -595,9 +602,9 @@ static int disable_event(struct agent_app *app, struct agent_event *event) struct lttcomm_agent_disable_event msg; struct lttcomm_agent_generic_reply reply; - assert(app); - assert(app->sock); - assert(event); + LTTNG_ASSERT(app); + LTTNG_ASSERT(app->sock); + LTTNG_ASSERT(event); DBG2("Agent disabling event %s for app pid: %d and socket %d", event->name, app->pid, app->sock->fd); @@ -652,8 +659,8 @@ error: */ int agent_send_registration_done(struct agent_app *app) { - assert(app); - assert(app->sock); + LTTNG_ASSERT(app); + LTTNG_ASSERT(app->sock); DBG("Agent sending registration done to app socket %d", app->sock->fd); @@ -673,7 +680,7 @@ int agent_enable_event(struct agent_event *event, struct agent_app *app; struct lttng_ht_iter iter; - assert(event); + LTTNG_ASSERT(event); rcu_read_lock(); @@ -715,7 +722,7 @@ struct agent_app_ctx *create_app_ctx(const struct lttng_event_context *ctx) goto end; } - assert(ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT); + LTTNG_ASSERT(ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT); agent_ctx = zmalloc(sizeof(*ctx)); if (!agent_ctx) { goto end; @@ -744,7 +751,7 @@ int agent_enable_context(const struct lttng_event_context *ctx, struct agent_app *app; struct lttng_ht_iter iter; - assert(ctx); + LTTNG_ASSERT(ctx); if (ctx->ctx != LTTNG_EVENT_CONTEXT_APP_CONTEXT) { ret = LTTNG_ERR_INVALID; goto error; @@ -795,7 +802,7 @@ int agent_disable_event(struct agent_event *event, struct agent_app *app; struct lttng_ht_iter iter; - assert(event); + LTTNG_ASSERT(event); if (!AGENT_EVENT_IS_ENABLED(event)) { goto end; } @@ -826,7 +833,7 @@ int agent_disable_event(struct agent_event *event, } /* event->enabled_count is now 0. */ - assert(!AGENT_EVENT_IS_ENABLED(event)); + LTTNG_ASSERT(!AGENT_EVENT_IS_ENABLED(event)); error: rcu_read_unlock(); @@ -847,7 +854,7 @@ static int disable_context(struct agent_app_ctx *ctx, struct agent_app *app; struct lttng_ht_iter iter; - assert(ctx); + LTTNG_ASSERT(ctx); rcu_read_lock(); DBG2("Disabling agent application context %s:%s", @@ -883,7 +890,7 @@ int agent_list_events(struct lttng_event **events, struct lttng_event *tmp_events = NULL; struct lttng_ht_iter iter; - assert(events); + LTTNG_ASSERT(events); DBG2("Agent listing events for domain %d", domain); @@ -962,7 +969,7 @@ struct agent_app *agent_create_app(pid_t pid, enum lttng_domain_type domain, { struct agent_app *app; - assert(sock); + LTTNG_ASSERT(sock); app = zmalloc(sizeof(*app)); if (!app) { @@ -992,7 +999,7 @@ struct agent_app *agent_find_app_by_sock(int sock) struct lttng_ht_iter iter; struct agent_app *app; - assert(sock >= 0); + LTTNG_ASSERT(sock >= 0); lttng_ht_lookup(the_agent_apps_ht_by_sock, (void *) ((unsigned long) sock), &iter); @@ -1015,7 +1022,7 @@ error: */ void agent_add_app(struct agent_app *app) { - assert(app); + LTTNG_ASSERT(app); DBG3("Agent adding app sock: %d and pid: %d to ht", app->sock->fd, app->pid); lttng_ht_add_unique_ulong(the_agent_apps_ht_by_sock, &app->node); @@ -1031,13 +1038,13 @@ void agent_delete_app(struct agent_app *app) int ret; struct lttng_ht_iter iter; - assert(app); + LTTNG_ASSERT(app); DBG3("Agent deleting app pid: %d and sock: %d", app->pid, app->sock->fd); iter.iter.node = &app->node.node; ret = lttng_ht_del(the_agent_apps_ht_by_sock, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); } /* @@ -1047,7 +1054,7 @@ void agent_delete_app(struct agent_app *app) */ void agent_destroy_app(struct agent_app *app) { - assert(app); + LTTNG_ASSERT(app); if (app->sock) { app->sock->ops->close(app->sock); @@ -1066,7 +1073,7 @@ int agent_init(struct agent *agt) { int ret; - assert(agt); + LTTNG_ASSERT(agt); agt->events = lttng_ht_new(0, LTTNG_HT_TYPE_STRING); if (!agt->events) { @@ -1087,8 +1094,8 @@ error: */ void agent_add(struct agent *agt, struct lttng_ht *ht) { - assert(agt); - assert(ht); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(ht); DBG3("Agent adding from domain %d", agt->domain); @@ -1166,9 +1173,9 @@ error: */ void agent_add_event(struct agent_event *event, struct agent *agt) { - assert(event); - assert(agt); - assert(agt->events); + LTTNG_ASSERT(event); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(agt->events); DBG3("Agent adding event %s", event->name); add_unique_agent_event(agt->events, event); @@ -1183,10 +1190,10 @@ int agent_add_context(const struct lttng_event_context *ctx, struct agent *agt) int ret = LTTNG_OK; struct agent_app_ctx *agent_ctx = NULL; - assert(ctx); - assert(agt); - assert(agt->events); - assert(ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT); + LTTNG_ASSERT(ctx); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(agt->events); + LTTNG_ASSERT(ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT); agent_ctx = create_app_ctx(ctx); if (!agent_ctx) { @@ -1215,10 +1222,10 @@ void agent_find_events_by_name(const char *name, struct agent *agt, struct lttng_ht *ht; struct agent_ht_key key; - assert(name); - assert(agt); - assert(agt->events); - assert(iter); + LTTNG_ASSERT(name); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(agt->events); + LTTNG_ASSERT(iter); ht = agt->events; key.name = name; @@ -1249,35 +1256,58 @@ struct agent_event *agent_find_event_by_trigger( /* Unused when loglevel_type is 'ALL'. */ int loglevel_value = 0; enum lttng_loglevel_type loglevel_type; + event_rule_logging_get_name_pattern logging_get_name_pattern; + event_rule_logging_get_log_level_rule logging_get_log_level_rule; - assert(agt); - assert(agt->events); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(agt->events); condition = lttng_trigger_get_const_condition(trigger); - assert(lttng_condition_get_type(condition) == - LTTNG_CONDITION_TYPE_ON_EVENT); + LTTNG_ASSERT(lttng_condition_get_type(condition) == + LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES); - c_status = lttng_condition_on_event_get_rule(condition, &rule); - assert(c_status == LTTNG_CONDITION_STATUS_OK); + c_status = lttng_condition_event_rule_matches_get_rule( + condition, &rule); + LTTNG_ASSERT(c_status == LTTNG_CONDITION_STATUS_OK); - assert(lttng_event_rule_get_type(rule) == - LTTNG_EVENT_RULE_TYPE_TRACEPOINT); + switch (lttng_event_rule_get_type(rule)) { + case LTTNG_EVENT_RULE_TYPE_JUL_LOGGING: + logging_get_name_pattern = + lttng_event_rule_jul_logging_get_name_pattern; + logging_get_log_level_rule = + lttng_event_rule_jul_logging_get_log_level_rule; + break; + case LTTNG_EVENT_RULE_TYPE_LOG4J_LOGGING: + logging_get_name_pattern = + lttng_event_rule_log4j_logging_get_name_pattern; + logging_get_log_level_rule = + lttng_event_rule_log4j_logging_get_log_level_rule; + break; + case LTTNG_EVENT_RULE_TYPE_PYTHON_LOGGING: + logging_get_name_pattern = + lttng_event_rule_python_logging_get_name_pattern; + logging_get_log_level_rule = + lttng_event_rule_python_logging_get_log_level_rule; + break; + default: + abort(); + break; + } domain = lttng_event_rule_get_domain_type(rule); - assert(domain == LTTNG_DOMAIN_JUL || domain == LTTNG_DOMAIN_LOG4J || + LTTNG_ASSERT(domain == LTTNG_DOMAIN_JUL || domain == LTTNG_DOMAIN_LOG4J || domain == LTTNG_DOMAIN_PYTHON); - /* Get the event's pattern ('name' in the legacy terminology). */ - er_status = lttng_event_rule_tracepoint_get_pattern(rule, &name); - assert(er_status == LTTNG_EVENT_RULE_STATUS_OK); + /* Get the event's pattern name ('name' in the legacy terminology). */ + er_status = logging_get_name_pattern(rule, &name); + LTTNG_ASSERT(er_status == LTTNG_EVENT_RULE_STATUS_OK); /* Get the internal filter expression. */ filter_expression = lttng_event_rule_get_filter(rule); /* Map log_level_rule to loglevel value. */ - er_status = lttng_event_rule_tracepoint_get_log_level_rule( - rule, &log_level_rule); + er_status = logging_get_log_level_rule(rule, &log_level_rule); if (er_status == LTTNG_EVENT_RULE_STATUS_UNSET) { loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL; loglevel_value = 0; @@ -1328,9 +1358,9 @@ struct agent_event *agent_find_event(const char *name, struct lttng_ht *ht; struct agent_ht_key key; - assert(name); - assert(agt); - assert(agt->events); + LTTNG_ASSERT(name); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(agt->events); ht = agt->events; key.name = name; @@ -1360,7 +1390,7 @@ error: */ void agent_destroy_event(struct agent_event *event) { - assert(event); + LTTNG_ASSERT(event); free(event->filter); free(event->filter_expression); @@ -1386,7 +1416,7 @@ void agent_destroy(struct agent *agt) struct lttng_ht_iter iter; struct agent_app_ctx *ctx; - assert(agt); + LTTNG_ASSERT(agt); DBG3("Agent destroy"); @@ -1405,7 +1435,7 @@ void agent_destroy(struct agent *agt) (void) agent_disable_event(event, agt->domain); ret = lttng_ht_del(agt->events, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); call_rcu(&node->head, destroy_event_agent_rcu); } @@ -1435,7 +1465,7 @@ void agent_destroy_app_by_sock(int sock) { struct agent_app *app; - assert(sock >= 0); + LTTNG_ASSERT(sock >= 0); /* * Not finding an application is a very important error that should NEVER @@ -1444,7 +1474,7 @@ void agent_destroy_app_by_sock(int sock) */ rcu_read_lock(); app = agent_find_app_by_sock(sock); - assert(app); + LTTNG_ASSERT(app); /* RCU read side lock is assumed to be held by this function. */ agent_delete_app(app); @@ -1491,8 +1521,8 @@ void agent_update(const struct agent *agt, const struct agent_app *app) struct lttng_ht_iter iter; struct agent_app_ctx *ctx; - assert(agt); - assert(app); + LTTNG_ASSERT(agt); + LTTNG_ASSERT(app); DBG("Agent updating app: pid = %ld", (long) app->pid); @@ -1560,7 +1590,7 @@ void agent_by_event_notifier_domain_ht_destroy(void) const int ret = lttng_ht_del( the_trigger_agents_ht_by_domain, &iter); - assert(ret == 0); + LTTNG_ASSERT(ret == 0); agent_destroy(agent); } @@ -1576,7 +1606,7 @@ struct agent *agent_find_by_event_notifier_domain( struct lttng_ht_iter iter; const uint64_t key = (uint64_t) domain_type; - assert(the_trigger_agents_ht_by_domain); + LTTNG_ASSERT(the_trigger_agents_ht_by_domain); DBG3("Per-event notifier domain agent lookup for domain '%s'", lttng_domain_type_str(domain_type));