From 5ad6219bf839bfdaeb0722beff95c0ff1460280c Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Tue, 12 Dec 2023 16:32:37 +0000 Subject: [PATCH] src.ctf.lttng-live: make queries report errors with exceptions Change-Id: Ibf633312304a6353842baa569860a2e1216785b0 Signed-off-by: Simon Marchi Reviewed-on: https://review.lttng.org/c/babeltrace/+/8478 Reviewed-by: Philippe Proulx Reviewed-on: https://review.lttng.org/c/babeltrace/+/12393 Tested-by: jenkins --- src/plugins/ctf/lttng-live/lttng-live.cpp | 97 ++++++------------- .../ctf/lttng-live/viewer-connection.cpp | 31 +++--- .../ctf/lttng-live/viewer-connection.hpp | 6 +- 3 files changed, 47 insertions(+), 87 deletions(-) diff --git a/src/plugins/ctf/lttng-live/lttng-live.cpp b/src/plugins/ctf/lttng-live/lttng-live.cpp index e1630677..cf677388 100644 --- a/src/plugins/ctf/lttng-live/lttng-live.cpp +++ b/src/plugins/ctf/lttng-live/lttng-live.cpp @@ -1683,11 +1683,9 @@ static struct bt_param_validation_map_value_entry_descr list_sessions_params[] = bt_param_validation_value_descr::makeString()}, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END}; -static bt_component_class_query_method_status -lttng_live_query_list_sessions(const bt2::ConstMapValue params, bt2::Value::Shared& result, - const bt2c::Logger& logger) +static bt2::Value::Shared lttng_live_query_list_sessions(const bt2::ConstMapValue params, + const bt2c::Logger& logger) { - bt_component_class_query_method_status status; const char *url; live_viewer_connection::UP viewer_connection; enum lttng_live_viewer_status viewer_status; @@ -1697,12 +1695,11 @@ lttng_live_query_list_sessions(const bt2::ConstMapValue params, bt2::Value::Shar validation_status = bt_param_validation_validate(params.libObjPtr(), list_sessions_params, &validate_error); if (validation_status == BT_PARAM_VALIDATION_STATUS_MEMORY_ERROR) { - status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR; - goto error; + throw bt2c::MemoryError {}; } else if (validation_status == BT_PARAM_VALIDATION_STATUS_VALIDATION_ERROR) { - status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "{}", validate_error); - goto error; + bt2c::GCharUP errorFreer {validate_error}; + + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, "{}", validate_error); } url = params[URL_PARAM]->asString().value(); @@ -1710,42 +1707,21 @@ lttng_live_query_list_sessions(const bt2::ConstMapValue params, bt2::Value::Shar viewer_status = live_viewer_connection_create(url, true, NULL, logger, viewer_connection); if (viewer_status != LTTNG_LIVE_VIEWER_STATUS_OK) { if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Failed to create viewer connection"); - status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, + "Failed to create viewer connection"); } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) { - status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN; + throw bt2c::TryAgain {}; } else { bt_common_abort(); } - goto error; } - status = live_viewer_connection_list_sessions(viewer_connection.get(), result); - if (status != BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Failed to list viewer sessions"); - goto error; - } - - goto end; - -error: - if (status >= 0) { - status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; - } - -end: - g_free(validate_error); - - return status; + return live_viewer_connection_list_sessions(viewer_connection.get()); } -static bt_component_class_query_method_status -lttng_live_query_support_info(const bt2::ConstMapValue params, bt2::Value::Shared& result, - const bt2c::Logger& logger) +static bt2::Value::Shared lttng_live_query_support_info(const bt2::ConstMapValue params, + const bt2c::Logger& logger) { - bt_component_class_query_method_status status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK; - bt2::OptionalBorrowedObject inputValue; - double weight = 0; struct bt_common_lttng_live_url_parts parts = {}; bt_common_lttng_live_url_parts_deleter partsDeleter {parts}; @@ -1754,29 +1730,29 @@ lttng_live_query_support_info(const bt2::ConstMapValue params, bt2::Value::Share const auto typeValue = params["type"]; if (!typeValue) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Missing expected `type` parameter."); - goto error; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, + "Missing expected `type` parameter."); } if (!typeValue->isString()) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "`type` parameter is not a string value."); - goto error; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, + "`type` parameter is not a string value."); } if (strcmp(typeValue->asString().value(), "string") != 0) { /* We don't handle file system paths */ - goto create_result; + return bt2::RealValue::create(); } - inputValue = params["input"]; + const auto inputValue = params["input"]; if (!inputValue) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Missing expected `input` parameter."); - goto error; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, + "Missing expected `input` parameter."); } if (!inputValue->isString()) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "`input` parameter is not a string value."); - goto error; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, + "`input` parameter is not a string value."); } parts = bt_common_parse_lttng_live_url(inputValue->asString().value(), NULL, 0); @@ -1785,22 +1761,10 @@ lttng_live_query_support_info(const bt2::ConstMapValue params, bt2::Value::Share * Looks pretty much like an LTTng live URL: we got the * session name part, which forms a complete URL. */ - weight = .75; + return bt2::RealValue::create(.75); } -create_result: - result = bt2::RealValue::create(weight); - goto end; - -error: - if (status >= 0) { - status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; - } - - BT_ASSERT(!result); - -end: - return status; + return bt2::RealValue::create(); } bt_component_class_query_method_status lttng_live_query(bt_self_component_class_source *comp_class, @@ -1810,7 +1774,6 @@ bt_component_class_query_method_status lttng_live_query(bt_self_component_class_ const bt_value **result) { try { - bt_component_class_query_method_status status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK; bt2c::Logger logger {bt2::SelfComponentClass {comp_class}, bt2::PrivateQueryExecutor {priv_query_exec}, "PLUGIN/SRC.CTF.LTTNG-LIVE/QUERY"}; @@ -1818,19 +1781,19 @@ bt_component_class_query_method_status lttng_live_query(bt_self_component_class_ bt2::Value::Shared resultObj; if (strcmp(object, "sessions") == 0) { - status = lttng_live_query_list_sessions(paramsObj, resultObj, logger); + resultObj = lttng_live_query_list_sessions(paramsObj, logger); } else if (strcmp(object, "babeltrace.support-info") == 0) { - status = lttng_live_query_support_info(paramsObj, resultObj, logger); + resultObj = lttng_live_query_support_info(paramsObj, logger); } else { BT_CPPLOGI_SPEC(logger, "Unknown query object `{}`", object); return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT; } - if (status == BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK) { - *result = resultObj.release().libObjPtr(); - } + *result = resultObj.release().libObjPtr(); - return status; + return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK; + } catch (const bt2c::TryAgain&) { + return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR; } catch (const std::bad_alloc&) { return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR; } catch (const bt2::Error&) { diff --git a/src/plugins/ctf/lttng-live/viewer-connection.cpp b/src/plugins/ctf/lttng-live/viewer-connection.cpp index ac63a9c5..0cc40b61 100644 --- a/src/plugins/ctf/lttng-live/viewer-connection.cpp +++ b/src/plugins/ctf/lttng-live/viewer-connection.cpp @@ -611,9 +611,8 @@ static int list_append_session(const bt2::ArrayValue results, const std::string& * } */ -bt_component_class_query_method_status -live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_connection, - bt2::Value::Shared& user_result) +bt2::Value::Shared +live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_connection) { enum lttng_live_viewer_status viewer_status; struct lttng_viewer_cmd cmd; @@ -630,19 +629,18 @@ live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_conne viewer_status = lttng_live_send(viewer_connection, &cmd, sizeof(cmd)); if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, - "Error sending list sessions command"); - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(viewer_connection->logger, bt2::Error, + "Error sending list sessions command"); } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) { - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN; + throw bt2c::TryAgain {}; } viewer_status = lttng_live_recv(viewer_connection, &list, sizeof(list)); if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error receiving session list"); - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(viewer_connection->logger, bt2::Error, + "Error receiving session list"); } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) { - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN; + throw bt2c::TryAgain {}; } sessions_count = be32toh(list.sessions_count); @@ -651,22 +649,21 @@ live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_conne viewer_status = lttng_live_recv(viewer_connection, &lsession, sizeof(lsession)); if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error receiving session:"); - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(viewer_connection->logger, bt2::Error, + "Error receiving session:"); } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) { - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN; + throw bt2c::TryAgain {}; } lsession.hostname[LTTNG_VIEWER_HOST_NAME_MAX - 1] = '\0'; lsession.session_name[LTTNG_VIEWER_NAME_MAX - 1] = '\0'; if (list_append_session(*result, viewer_connection->url, &lsession, viewer_connection)) { - BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error appending session"); - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR; + BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(viewer_connection->logger, bt2::Error, + "Error appending session"); } } - user_result = std::move(result); - return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK; + return result; } static enum lttng_live_viewer_status diff --git a/src/plugins/ctf/lttng-live/viewer-connection.hpp b/src/plugins/ctf/lttng-live/viewer-connection.hpp index 2e32273c..0f284581 100644 --- a/src/plugins/ctf/lttng-live/viewer-connection.hpp +++ b/src/plugins/ctf/lttng-live/viewer-connection.hpp @@ -15,6 +15,7 @@ #include #include "compat/socket.hpp" +#include "cpp-common/bt2/value.hpp" #include "cpp-common/bt2c/glib-up.hpp" #include "cpp-common/bt2c/logging.hpp" @@ -107,8 +108,7 @@ live_viewer_connection_create(const char *url, bool in_query, enum lttng_live_viewer_status lttng_live_create_viewer_session(struct lttng_live_msg_iter *lttng_live_msg_iter); -bt_component_class_query_method_status -live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_connection, - bt2::Value::Shared& user_result); +bt2::Value::Shared +live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_connection); #endif /* LTTNG_LIVE_VIEWER_CONNECTION_H */ -- 2.34.1