src.ctf.lttng-live: make queries output a bt2::Value
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 7 Dec 2023 16:12:49 +0000 (16:12 +0000)
committerSimon Marchi <simon.marchi@efficios.com>
Wed, 17 Apr 2024 17:57:53 +0000 (13:57 -0400)
Change-Id: If0baec1ca712e75e5873cc6c3e88cec18bb4f424
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/8477
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/12392
Tested-by: jenkins <jenkins@lttng.org>
src/plugins/ctf/lttng-live/lttng-live.cpp
src/plugins/ctf/lttng-live/viewer-connection.cpp
src/plugins/ctf/lttng-live/viewer-connection.hpp

index 9f62305ef2babfc543dad924fb8cba58796462b2..e16306779028cdbc17a9875df031fbb9850e1b42 100644 (file)
@@ -1684,7 +1684,7 @@ static struct bt_param_validation_map_value_entry_descr list_sessions_params[] =
     BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END};
 
 static bt_component_class_query_method_status
-lttng_live_query_list_sessions(const bt2::ConstMapValue params, const bt_value **result,
+lttng_live_query_list_sessions(const bt2::ConstMapValue params, bt2::Value::Shared& result,
                                const bt2c::Logger& logger)
 {
     bt_component_class_query_method_status status;
@@ -1729,8 +1729,6 @@ lttng_live_query_list_sessions(const bt2::ConstMapValue params, const bt_value *
     goto end;
 
 error:
-    BT_VALUE_PUT_REF_AND_RESET(*result);
-
     if (status >= 0) {
         status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
     }
@@ -1742,7 +1740,7 @@ end:
 }
 
 static bt_component_class_query_method_status
-lttng_live_query_support_info(const bt2::ConstMapValue params, const bt_value **result,
+lttng_live_query_support_info(const bt2::ConstMapValue params, bt2::Value::Shared& result,
                               const bt2c::Logger& logger)
 {
     bt_component_class_query_method_status status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
@@ -1754,7 +1752,6 @@ lttng_live_query_support_info(const bt2::ConstMapValue params, const bt_value **
     /* Used by the logging macros */
     __attribute__((unused)) bt_self_component *self_comp = NULL;
 
-    *result = NULL;
     const auto typeValue = params["type"];
     if (!typeValue) {
         BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Missing expected `type` parameter.");
@@ -1792,12 +1789,7 @@ lttng_live_query_support_info(const bt2::ConstMapValue params, const bt_value **
     }
 
 create_result:
-    *result = bt_value_real_create_init(weight);
-    if (!*result) {
-        status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
-        goto error;
-    }
-
+    result = bt2::RealValue::create(weight);
     goto end;
 
 error:
@@ -1805,7 +1797,7 @@ error:
         status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
     }
 
-    BT_ASSERT(!*result);
+    BT_ASSERT(!result);
 
 end:
     return status;
@@ -1823,18 +1815,21 @@ bt_component_class_query_method_status lttng_live_query(bt_self_component_class_
                              bt2::PrivateQueryExecutor {priv_query_exec},
                              "PLUGIN/SRC.CTF.LTTNG-LIVE/QUERY"};
         const bt2::ConstMapValue paramsObj(params);
+        bt2::Value::Shared resultObj;
 
         if (strcmp(object, "sessions") == 0) {
-            status = lttng_live_query_list_sessions(paramsObj, result, logger);
+            status = lttng_live_query_list_sessions(paramsObj, resultObj, logger);
         } else if (strcmp(object, "babeltrace.support-info") == 0) {
-            status = lttng_live_query_support_info(paramsObj, result, logger);
+            status = lttng_live_query_support_info(paramsObj, resultObj, logger);
         } else {
             BT_CPPLOGI_SPEC(logger, "Unknown query object `{}`", object);
-            status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT;
-            goto end;
+            return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT;
+        }
+
+        if (status == BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK) {
+            *result = resultObj.release().libObjPtr();
         }
 
-end:
         return status;
     } catch (const std::bad_alloc&) {
         return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
index 924e5fba24caf66fc0337b2d94bc251b04b9d4a8..ac63a9c5922cdb95c01e58c97409d97354215e07 100644 (file)
@@ -427,90 +427,83 @@ static void lttng_live_disconnect_viewer(struct live_viewer_connection *viewer_c
     }
 }
 
-static int list_update_session(bt_value *results, const struct lttng_viewer_session *session,
-                               bool *_found, struct live_viewer_connection *viewer_connection)
+static int list_update_session(const bt2::ArrayValue results,
+                               const struct lttng_viewer_session *session, bool *_found,
+                               struct live_viewer_connection *viewer_connection)
 {
-    int ret = 0;
-    uint64_t i, len;
-    bt_value *map = NULL;
-    bt_value *hostname = NULL;
-    bt_value *session_name = NULL;
-    bt_value *btval = NULL;
     bool found = false;
 
-    len = bt_value_array_get_length(results);
-    for (i = 0; i < len; i++) {
-        const char *hostname_str = NULL;
-        const char *session_name_str = NULL;
+    for (const auto value : results) {
+        const auto map = value.asMap();
+        const auto hostnameVal = map["target-hostname"];
 
-        map = bt_value_array_borrow_element_by_index(results, i);
-        hostname = bt_value_map_borrow_entry_value(map, "target-hostname");
-        if (!hostname) {
+        if (!hostnameVal) {
             BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
                                          "Error borrowing \"target-hostname\" entry.");
-            ret = -1;
-            goto end;
+            return -1;
         }
-        session_name = bt_value_map_borrow_entry_value(map, "session-name");
-        if (!session_name) {
+
+        const auto sessionNameVal = map["session-name"];
+
+        if (!sessionNameVal) {
             BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
                                          "Error borrowing \"session-name\" entry.");
-            ret = -1;
-            goto end;
+            return -1;
         }
-        hostname_str = bt_value_string_get(hostname);
-        session_name_str = bt_value_string_get(session_name);
+
+        const auto hostname_str = hostnameVal->asString().value();
+        const auto session_name_str = sessionNameVal->asString().value();
 
         if (strcmp(session->hostname, hostname_str) == 0 &&
             strcmp(session->session_name, session_name_str) == 0) {
-            int64_t val;
             uint32_t streams = be32toh(session->streams);
             uint32_t clients = be32toh(session->clients);
 
             found = true;
 
-            btval = bt_value_map_borrow_entry_value(map, "stream-count");
-            if (!btval) {
+            const auto streamCountVal = map["stream-count"];
+
+            if (!streamCountVal) {
                 BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
                                              "Error borrowing \"stream-count\" entry.");
-                ret = -1;
-                goto end;
+                return -1;
             }
-            val = bt_value_integer_unsigned_get(btval);
+
+            auto val = streamCountVal->asUnsignedInteger().value();
+
             /* sum */
             val += streams;
-            bt_value_integer_unsigned_set(btval, val);
+            streamCountVal->asUnsignedInteger().value(val);
 
-            btval = bt_value_map_borrow_entry_value(map, "client-count");
-            if (!btval) {
+            const auto clientCountVal = map["client-count"];
+
+            if (!clientCountVal) {
                 BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
                                              "Error borrowing \"client-count\" entry.");
-                ret = -1;
-                goto end;
+                return -1;
             }
-            val = bt_value_integer_unsigned_get(btval);
+
+            val = clientCountVal->asUnsignedInteger().value();
+
             /* max */
-            val = bt_max_t(int64_t, clients, val);
-            bt_value_integer_unsigned_set(btval, val);
+            val = std::max<uint64_t>(clients, val);
+            clientCountVal->asUnsignedInteger().value(val);
         }
 
         if (found) {
             break;
         }
     }
-end:
+
     *_found = found;
-    return ret;
+    return 0;
 }
 
-static int list_append_session(bt_value *results, const std::string& base_url,
+static int list_append_session(const bt2::ArrayValue results, const std::string& base_url,
                                const struct lttng_viewer_session *session,
                                struct live_viewer_connection *viewer_connection)
 {
     int ret = 0;
-    bt_value_map_insert_entry_status insert_status;
-    bt_value_array_append_element_status append_status;
-    bt_value *map = NULL;
     bool found = false;
 
     /*
@@ -519,59 +512,34 @@ static int list_append_session(bt_value *results, const std::string& base_url,
      */
     ret = list_update_session(results, session, &found, viewer_connection);
     if (ret || found) {
-        goto end;
+        return ret;
     }
 
-    map = bt_value_map_create();
-    if (!map) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error creating map value.");
-        ret = -1;
-        goto end;
-    }
+    const auto map = bt2::MapValue::create();
 
     if (base_url.empty()) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                     "Error: base_url length smaller than 1.");
-        ret = -1;
-        goto end;
+        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error: base_url empty.");
+        return -1;
     }
 
     /*
      * key = "url",
      * value = <string>,
      */
-    insert_status = bt_value_map_insert_string_entry(
-        map, "url",
-        fmt::format("{}/host/{}/{}", base_url, session->hostname, session->session_name).c_str());
-    if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error inserting \"url\" entry.");
-        ret = -1;
-        goto end;
-    }
+    map->insert("url",
+                fmt::format("{}/host/{}/{}", base_url, session->hostname, session->session_name));
 
     /*
      * key = "target-hostname",
      * value = <string>,
      */
-    insert_status = bt_value_map_insert_string_entry(map, "target-hostname", session->hostname);
-    if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                     "Error inserting \"target-hostname\" entry.");
-        ret = -1;
-        goto end;
-    }
+    map->insert("target-hostname", session->hostname);
 
     /*
      * key = "session-name",
      * value = <string>,
      */
-    insert_status = bt_value_map_insert_string_entry(map, "session-name", session->session_name);
-    if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                     "Error inserting \"session-name\" entry.");
-        ret = -1;
-        goto end;
-    }
+    map->insert("session-name", session->session_name);
 
     /*
      * key = "timer-us",
@@ -580,13 +548,7 @@ static int list_append_session(bt_value *results, const std::string& base_url,
     {
         uint32_t live_timer = be32toh(session->live_timer);
 
-        insert_status = bt_value_map_insert_unsigned_integer_entry(map, "timer-us", live_timer);
-        if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
-            BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                         "Error inserting \"timer-us\" entry.");
-            ret = -1;
-            goto end;
-        }
+        map->insert("timer-us", (uint64_t) live_timer);
     }
 
     /*
@@ -596,13 +558,7 @@ static int list_append_session(bt_value *results, const std::string& base_url,
     {
         uint32_t streams = be32toh(session->streams);
 
-        insert_status = bt_value_map_insert_unsigned_integer_entry(map, "stream-count", streams);
-        if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
-            BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                         "Error inserting \"stream-count\" entry.");
-            ret = -1;
-            goto end;
-        }
+        map->insert("stream-count", (uint64_t) streams);
     }
 
     /*
@@ -612,24 +568,11 @@ static int list_append_session(bt_value *results, const std::string& base_url,
     {
         uint32_t clients = be32toh(session->clients);
 
-        insert_status = bt_value_map_insert_unsigned_integer_entry(map, "client-count", clients);
-        if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
-            BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                         "Error inserting \"client-count\" entry.");
-            ret = -1;
-            goto end;
-        }
-    }
-
-    append_status = bt_value_array_append_element(results, map);
-    if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error appending map to results.");
-        ret = -1;
+        map->insert("client-count", (uint64_t) clients);
     }
 
-end:
-    BT_VALUE_PUT_REF_AND_RESET(map);
-    return ret;
+    results.append(*map);
+    return 0;
 }
 
 /*
@@ -670,21 +613,13 @@ end:
 
 bt_component_class_query_method_status
 live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_connection,
-                                     const bt_value **user_result)
+                                     bt2::Value::Shared& user_result)
 {
-    bt_component_class_query_method_status status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
-    bt_value *result = NULL;
     enum lttng_live_viewer_status viewer_status;
     struct lttng_viewer_cmd cmd;
     struct lttng_viewer_list_sessions list;
     uint32_t i, sessions_count;
-
-    result = bt_value_array_create();
-    if (!result) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error creating array");
-        status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
-        goto error;
-    }
+    auto result = bt2::ArrayValue::create();
 
     BT_CPPLOGD_SPEC(viewer_connection->logger, "Requesting list of sessions: cmd={}",
                     LTTNG_VIEWER_LIST_SESSIONS);
@@ -697,21 +632,17 @@ live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_conne
     if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) {
         BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
                                      "Error sending list sessions command");
-        status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
-        goto error;
+        return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
     } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) {
-        status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
-        goto error;
+        return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
     }
 
     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");
-        status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
-        goto error;
+        return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
     } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) {
-        status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
-        goto error;
+        return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
     }
 
     sessions_count = be32toh(list.sessions_count);
@@ -721,28 +652,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:");
-            status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
-            goto error;
+            return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
         } else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) {
-            status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
-            goto error;
+            return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
         }
 
         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)) {
+        if (list_append_session(*result, viewer_connection->url, &lsession, viewer_connection)) {
             BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error appending session");
-            status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
-            goto error;
+            return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
         }
     }
 
-    *user_result = result;
-    goto end;
-error:
-    BT_VALUE_PUT_REF_AND_RESET(result);
-end:
-    return status;
+    user_result = std::move(result);
+    return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
 }
 
 static enum lttng_live_viewer_status
index 9f564a39858eac9ab28146c2d80d7ed346cb38ad..2e32273c9e38a2f628e5c62b341ddf8036247ba6 100644 (file)
@@ -109,6 +109,6 @@ 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,
-                                     const bt_value **user_result);
+                                     bt2::Value::Shared& user_result);
 
 #endif /* LTTNG_LIVE_VIEWER_CONNECTION_H */
This page took 0.030956 seconds and 4 git commands to generate.