src.ctf.lttng-live: lttng_live_metadata_update: use std::vector as metadata buffer
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 26 Jul 2022 21:28:18 +0000 (17:28 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 23 Aug 2022 16:06:16 +0000 (12:06 -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>
src/plugins/ctf/lttng-live/lttng-live.hpp
src/plugins/ctf/lttng-live/metadata.cpp
src/plugins/ctf/lttng-live/viewer-connection.cpp

index 4d747d6e233772b2b28dce39168523e34806ae5d..2be5f2b7715f6e8b746c20df8a043ad286f5d666 100644 (file)
@@ -358,7 +358,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 82bcefa468fd2d7248cbffe291be37ecc4e27626..e9c861a8c2542458f6f42b9bc210dfc20734f5c0 100644 (file)
@@ -17,6 +17,8 @@
 #include "compat/memstream.h"
 #include <babeltrace2/babeltrace.h>
 
+#include "cpp-common/libc-up.hpp"
+
 #include "metadata.hpp"
 #include "../common/src/metadata/tsdl/decoder.hpp"
 #include "../common/src/metadata/tsdl/ctf-meta-configure-ir-trace.hpp"
@@ -97,10 +99,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;
+    bt2_common::FileUP fp;
     enum ctf_metadata_decoder_status decoder_status;
     enum lttng_live_iterator_status status = LTTNG_LIVE_ITERATOR_STATUS_OK;
     const bt2_common::LogCfg& logCfg = trace->logCfg;
@@ -131,26 +132,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_CLOGE_ERRNO_APPEND_CAUSE("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
@@ -163,11 +147,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;
@@ -195,14 +178,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_CLOGW_ERRNO("Metadata bt_close_memstream", ".");
-    }
-
-    fp = NULL;
-
-    if (len_read == 0) {
+    if (metadataBuf.empty()) {
         if (!trace->trace) {
             status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN;
             goto end;
@@ -217,7 +193,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;
@@ -234,7 +210,7 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra
      * new metadata to our current trace class.
      */
     BT_CLOGD("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) {
@@ -273,15 +249,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_CLOGW_ERRNO("Error on fclose", ".");
-        }
-    }
-    free(metadata_buf);
     return status;
 }
 
index f0d6ed6c8a78b0985d8fb0803fd6e4407e470459..c3d8f937e5787d5c4d06d6d80b5dfdcdb5204895 100644 (file)
@@ -1178,7 +1178,7 @@ end:
 
 BT_HIDDEN
 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;
@@ -1187,7 +1187,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;
@@ -1285,15 +1284,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_CLOGE_APPEND_CAUSE("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.028888 seconds and 5 git commands to generate.