X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fclient.cpp;h=43a8b793e9ed366d5be2631feca34cc8f190ddef;hb=HEAD;hp=0680e14fd581eb28817baf0e077659845bded1bf;hpb=0038180de36c422cfaeade1145fa9fbc9436b8ad;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/client.cpp b/src/bin/lttng-sessiond/client.cpp index 0680e14fd..43a8b793e 100644 --- a/src/bin/lttng-sessiond/client.cpp +++ b/src/bin/lttng-sessiond/client.cpp @@ -30,6 +30,7 @@ #include "utils.hpp" #include +#include #include #include #include @@ -40,6 +41,7 @@ #include #include +#include #include #include #include @@ -1031,6 +1033,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int *sock, int *sock_ case LTTCOMM_SESSIOND_COMMAND_CLEAR_SESSION: case LTTCOMM_SESSIOND_COMMAND_LIST_TRIGGERS: case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY: + case LTTCOMM_SESSIOND_COMMAND_KERNEL_TRACER_STATUS: need_domain = false; break; default: @@ -1114,6 +1117,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int *sock, int *sock_ case LTTCOMM_SESSIOND_COMMAND_UNREGISTER_TRIGGER: case LTTCOMM_SESSIOND_COMMAND_LIST_TRIGGERS: case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY: + case LTTCOMM_SESSIOND_COMMAND_KERNEL_TRACER_STATUS: need_tracing_session = false; break; default: @@ -1925,6 +1929,25 @@ skip_domain: cmd_ctx->session, cmd_ctx->lsm.domain.type, cmd_ctx->lsm.u.reg.path, cdata); break; } + case LTTCOMM_SESSIOND_COMMAND_KERNEL_TRACER_STATUS: + { + uint32_t u_status; + enum lttng_kernel_tracer_status status; + + ret = cmd_kernel_tracer_status(&status); + if (ret != LTTNG_OK) { + goto error; + } + + u_status = (uint32_t) status; + ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &u_status, 4); + if (ret < 0) { + goto error; + } + + ret = LTTNG_OK; + break; + } case LTTCOMM_SESSIOND_COMMAND_DATA_PENDING: { int pending_ret; @@ -1946,12 +1969,12 @@ skip_domain: * ret will be set to LTTNG_OK at the end of * this function. */ - } else if (pending_ret < 0) { + } else if (pending_ret <= LTTNG_OK || pending_ret >= LTTNG_ERR_NR) { ret = LTTNG_ERR_UNK; - goto setup_error; + goto error; } else { ret = pending_ret; - goto setup_error; + goto error; } pending_ret_byte = (uint8_t) pending_ret; @@ -2214,10 +2237,8 @@ skip_domain: cmd_ctx->lsm.u.rotation_set_schedule.type; value = cmd_ctx->lsm.u.rotation_set_schedule.value; - ret = cmd_rotation_set_schedule(cmd_ctx->session, - set_schedule, - schedule_type, - value); + ret = cmd_rotation_set_schedule( + cmd_ctx->session, set_schedule, schedule_type, value); if (ret != LTTNG_OK) { goto error; } @@ -2584,24 +2605,36 @@ static void *thread_manage_clients(void *data) * informations for the client. The command context struct contains * everything this function may needs. */ - ret = process_client_msg(&cmd_ctx, &sock, &sock_error); - rcu_thread_offline(); - if (ret < 0) { - if (sock >= 0) { - ret = close(sock); - if (ret) { - PERROR("close"); + try { + ret = process_client_msg(&cmd_ctx, &sock, &sock_error); + rcu_thread_offline(); + if (ret < 0) { + if (sock >= 0) { + ret = close(sock); + if (ret) { + PERROR("close"); + } } + sock = -1; + /* + * TODO: Inform client somehow of the fatal error. At + * this point, ret < 0 means that a zmalloc failed + * (ENOMEM). Error detected but still accept + * command, unless a socket error has been + * detected. + */ + continue; } - sock = -1; - /* - * TODO: Inform client somehow of the fatal error. At - * this point, ret < 0 means that a zmalloc failed - * (ENOMEM). Error detected but still accept - * command, unless a socket error has been - * detected. - */ - continue; + } catch (const std::bad_alloc& ex) { + WARN_FMT("Failed to allocate memory while handling client request: {}", + ex.what()); + ret = LTTNG_ERR_NOMEM; + } catch (const lttng::ctl::error& ex) { + WARN_FMT("Client request failed: {}", ex.what()); + ret = ex.code(); + } catch (const std::exception& ex) { + WARN_FMT("Client request failed: {}", ex.what()); + ret = LTTNG_ERR_UNK; } if (ret < LTTNG_OK || ret >= LTTNG_ERR_NR) {