src.ctf.lttng-live: lttng_live_metadata_update: use std::vector as metadata buffer
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 6 Dec 2023 17:10:22 +0000 (17:10 +0000)
committerSimon Marchi <simon.marchi@efficios.com>
Wed, 17 Apr 2024 17:57:53 +0000 (13:57 -0400)
Use an std::vector to store the metadata contents in
lttng_live_metadata_update, instead of opening a memstream.  Modify
lttng_live_get_one_metadata_packet to append to a vector instead of
writing to a `FILE *`.  We still open a read-only memstream around the
vector's contents to pass a `FILE *` to
ctf_metadata_decoder_append_content.  Change that variable to be a
FileUP, so it's automatically closed on exit.

Change-Id: Ie7b57d25ea90fc82fb96bf19ff707edccdf46072
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/8412
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/12348
Tested-by: jenkins <jenkins@lttng.org>
src/plugins/ctf/lttng-live/lttng-live.hpp
src/plugins/ctf/lttng-live/metadata.cpp
src/plugins/ctf/lttng-live/viewer-connection.cpp

index 8016efc258e9052f50745d8feb654492ae978a42..87c80e533d999b2fd60c0a0c3a8a48f676ddf374 100644 (file)
@@ -407,7 +407,7 @@ int lttng_live_add_session(struct lttng_live_msg_iter *lttng_live_msg_iter, uint
  * written to the file.
  */
 enum lttng_live_get_one_metadata_status
-lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, size_t *reply_len);
+lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, std::vector<char>& buf);
 
 enum lttng_live_iterator_status
 lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
index db8ba37711f737a75c857b7aa0eed39aaf8c39c3..a826c253429ee1c6be5a023aa8cc8ba95232d42c 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include "compat/memstream.h"
+#include "cpp-common/bt2c/libc-up.hpp"
 
 #include "../common/src/metadata/tsdl/ctf-meta-configure-ir-trace.hpp"
 #include "../common/src/metadata/tsdl/decoder.hpp"
@@ -87,10 +88,9 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
 {
     struct lttng_live_session *session = trace->session;
     struct lttng_live_metadata *metadata = trace->metadata;
-    size_t size, len_read = 0;
-    char *metadata_buf = NULL;
+    std::vector<char> metadataBuf;
     bool keep_receiving;
-    FILE *fp = NULL;
+    bt2c::FileUP fp;
     enum ctf_metadata_decoder_status decoder_status;
     enum lttng_live_iterator_status status = LTTNG_LIVE_ITERATOR_STATUS_OK;
     enum lttng_live_get_one_metadata_status metadata_status;
@@ -120,26 +120,9 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
         goto end;
     }
 
-    /*
-     * Open a new write only file handle to populate the `metadata_buf`
-     * memory buffer so we can write in loop in it easily.
-     */
-    fp = bt_open_memstream(&metadata_buf, &size);
-    if (!fp) {
-        if (errno == EINTR && lttng_live_graph_is_canceled(session->lttng_live_msg_iter)) {
-            session->lttng_live_msg_iter->was_interrupted = true;
-            status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN;
-        } else {
-            BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC(metadata->logger, "Metadata open_memstream", ".");
-            status = LTTNG_LIVE_ITERATOR_STATUS_ERROR;
-        }
-        goto end;
-    }
-
     keep_receiving = true;
     /* Grab all available metadata. */
     while (keep_receiving) {
-        size_t reply_len = 0;
         /*
          * lttng_live_get_one_metadata_packet() asks the Relay Daemon
          * for new metadata. If new metadata is received, the function
@@ -152,11 +135,10 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
          * If we receive an _ERROR status, it means there was a
          * networking, allocating, or some other unrecoverable error.
          */
-        metadata_status = lttng_live_get_one_metadata_packet(trace, fp, &reply_len);
+        metadata_status = lttng_live_get_one_metadata_packet(trace, metadataBuf);
 
         switch (metadata_status) {
         case LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK:
-            len_read += reply_len;
             break;
         case LTTNG_LIVE_GET_ONE_METADATA_STATUS_END:
             keep_receiving = false;
@@ -186,14 +168,7 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
         }
     }
 
-    /* The memory buffer `metadata_buf` contains all the metadata. */
-    if (bt_close_memstream(&metadata_buf, &size, fp)) {
-        BT_CPPLOGW_ERRNO_SPEC(metadata->logger, "Metadata bt_close_memstream", ".");
-    }
-
-    fp = NULL;
-
-    if (len_read == 0) {
+    if (metadataBuf.empty()) {
         if (!trace->trace) {
             status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN;
             goto end;
@@ -208,7 +183,7 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
      * Open a new reading file handle on the `metadata_buf` and pass it to
      * the metadata decoder.
      */
-    fp = bt_fmemopen(metadata_buf, len_read, "rb");
+    fp.reset(bt_fmemopen(metadataBuf.data(), metadataBuf.size(), "rb"));
     if (!fp) {
         if (errno == EINTR && lttng_live_graph_is_canceled(session->lttng_live_msg_iter)) {
             session->lttng_live_msg_iter->was_interrupted = true;
@@ -226,7 +201,7 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
      * new metadata to our current trace class.
      */
     BT_CPPLOGD_SPEC(metadata->logger, "Appending new metadata to the ctf_trace class");
-    decoder_status = ctf_metadata_decoder_append_content(metadata->decoder.get(), fp);
+    decoder_status = ctf_metadata_decoder_append_content(metadata->decoder.get(), fp.get());
     switch (decoder_status) {
     case CTF_METADATA_DECODER_STATUS_OK:
         if (!trace->trace_class) {
@@ -267,15 +242,6 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
 error:
     status = LTTNG_LIVE_ITERATOR_STATUS_ERROR;
 end:
-    if (fp) {
-        int closeret;
-
-        closeret = fclose(fp);
-        if (closeret) {
-            BT_CPPLOGW_ERRNO_SPEC(metadata->logger, "Error on fclose", ".");
-        }
-    }
-    free(metadata_buf);
     return status;
 }
 
index a92a2eac5167a52b68376ebfda08509241878ded..35e9efb8ee45757ed36358cc9de8f66017b0be17 100644 (file)
@@ -1092,7 +1092,7 @@ end:
 }
 
 enum lttng_live_get_one_metadata_status
-lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, size_t *reply_len)
+lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, std::vector<char>& buf)
 {
     uint64_t len = 0;
     enum lttng_live_get_one_metadata_status status;
@@ -1101,7 +1101,6 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, siz
     struct lttng_viewer_get_metadata rq;
     struct lttng_viewer_metadata_packet rp;
     gchar *data = NULL;
-    ssize_t writelen;
     struct lttng_live_session *session = trace->session;
     struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter;
     struct lttng_live_metadata *metadata = trace->metadata;
@@ -1202,16 +1201,9 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, siz
     /*
      * Write the metadata to the file handle.
      */
-    writelen = fwrite(data, sizeof(uint8_t), len, fp);
-    if (writelen != len) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
-                                     "Writing in the metadata file stream");
-        status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_ERROR;
-        goto end;
-    }
+    buf.insert(buf.end(), data, data + len);
 
 empty_metadata_packet_retry:
-    *reply_len = len;
     status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK;
 
 end:
This page took 0.026517 seconds and 4 git commands to generate.