ctf: add tracer version extraction function
[babeltrace.git] / src / plugins / ctf / fs-src / fs.c
index fb5fa1c545f92accd8c1e0c422bacc178107043b..e33107aea4d661e00d5d2432223024e933e3a6d3 100644 (file)
@@ -28,7 +28,7 @@
 #define BT_COMP_LOG_SELF_COMP self_comp
 #define BT_LOG_OUTPUT_LEVEL log_level
 #define BT_LOG_TAG "PLUGIN/SRC.CTF.FS"
-#include "plugins/comp-logging.h"
+#include "logging/comp-logging.h"
 
 #include "common/common.h"
 #include <babeltrace2/babeltrace.h>
 #include "../common/msg-iter/msg-iter.h"
 #include "query.h"
 
+struct tracer_info {
+       const char *name;
+       int64_t major;
+       int64_t minor;
+       int64_t patch;
+};
+
 static
 int msg_iter_data_set_current_ds_file(struct ctf_fs_msg_iter_data *msg_iter_data)
 {
@@ -496,9 +503,7 @@ error:
        ret = -1;
 
 end:
-       if (port_name) {
-               g_free(port_name);
-       }
+       g_free(port_name);
 
        port_data_destroy(port_data);
        return ret;
@@ -901,7 +906,7 @@ int create_ds_file_groups(struct ctf_fs_trace *ctf_fs_trace)
        while ((basename = g_dir_read_name(dir))) {
                struct ctf_fs_file *file;
 
-               if (!strcmp(basename, CTF_FS_METADATA_FILENAME)) {
+               if (strcmp(basename, CTF_FS_METADATA_FILENAME) == 0) {
                        /* Ignore the metadata stream. */
                        BT_COMP_LOGI("Ignoring metadata file `%s" G_DIR_SEPARATOR_S "%s`",
                                ctf_fs_trace->path->str, basename);
@@ -1685,7 +1690,7 @@ int merge_traces_with_same_uuid(struct ctf_fs_component *ctf_fs)
 
        /* Clear any NULL slot (traces that got merged in another one) in the array.  */
        for (i = 0; i < traces->len;) {
-               if (g_ptr_array_index(traces, i) == NULL) {
+               if (!g_ptr_array_index(traces, i)) {
                        g_ptr_array_remove_index_fast(traces, i);
                } else {
                        i++;
@@ -1698,6 +1703,83 @@ end:
        return ret;
 }
 
+/*
+ * Extract the tracer information necessary to compare versions.
+ * Returns 0 on success, and -1 if the extraction is not successful because the
+ * necessary fields are absents in the trace metadata.
+ */
+static
+int extract_tracer_info(struct ctf_fs_trace *trace,
+               struct tracer_info *current_tracer_info) __attribute__((unused));
+static
+int extract_tracer_info(struct ctf_fs_trace *trace,
+               struct tracer_info *current_tracer_info)
+{
+       int ret = 0;
+       struct ctf_trace_class_env_entry *entry;
+
+       /* Clear the current_tracer_info struct */
+       memset(current_tracer_info, 0, sizeof(*current_tracer_info));
+
+       /*
+        * To compare 2 tracer versions, at least the tracer name and it's
+        * major version are needed. If one of these is missing, consider it an
+        * extraction failure.
+        */
+       entry = ctf_trace_class_borrow_env_entry_by_name(
+               trace->metadata->tc, "tracer_name");
+       if (!entry || entry->type != CTF_TRACE_CLASS_ENV_ENTRY_TYPE_STR) {
+               goto missing_bare_minimum;
+       }
+
+       /* Set tracer name. */
+       current_tracer_info->name = entry->value.str->str;
+
+       entry = ctf_trace_class_borrow_env_entry_by_name(
+               trace->metadata->tc, "tracer_major");
+       if (!entry || entry->type != CTF_TRACE_CLASS_ENV_ENTRY_TYPE_INT) {
+               goto missing_bare_minimum;
+       }
+
+       /* Set major version number. */
+       current_tracer_info->major = entry->value.i;
+
+       entry = ctf_trace_class_borrow_env_entry_by_name(
+               trace->metadata->tc, "tracer_minor");
+       if (!entry || entry->type != CTF_TRACE_CLASS_ENV_ENTRY_TYPE_INT) {
+               goto end;
+       }
+
+       /* Set minor version number. */
+       current_tracer_info->minor = entry->value.i;
+
+       entry = ctf_trace_class_borrow_env_entry_by_name(
+               trace->metadata->tc, "tracer_patch");
+       if (!entry) {
+               /*
+                * If `tracer_patch` doesn't exist `tracer_patchlevel` might.
+                * For example, `lttng-modules` uses entry name
+                * `tracer_patchlevel`.
+                */
+               entry = ctf_trace_class_borrow_env_entry_by_name(
+                       trace->metadata->tc, "tracer_patchlevel");
+       }
+
+       if (!entry || entry->type != CTF_TRACE_CLASS_ENV_ENTRY_TYPE_INT) {
+               goto end;
+       }
+
+       /* Set patch version number. */
+       current_tracer_info->patch = entry->value.i;
+
+       goto end;
+
+missing_bare_minimum:
+       ret = -1;
+end:
+       return ret;
+}
+
 int ctf_fs_component_create_ctf_fs_traces(bt_self_component_source *self_comp,
                struct ctf_fs_component *ctf_fs,
                const bt_value *paths_value)
@@ -1705,12 +1787,12 @@ int ctf_fs_component_create_ctf_fs_traces(bt_self_component_source *self_comp,
        int ret = 0;
        uint64_t i;
 
-       for (i = 0; i < bt_value_array_get_size(paths_value); i++) {
+       for (i = 0; i < bt_value_array_get_length(paths_value); i++) {
                const bt_value *path_value = bt_value_array_borrow_element_by_index_const(paths_value, i);
-               const char *path = bt_value_string_get(path_value);
+               const char *input = bt_value_string_get(path_value);
 
                ret = ctf_fs_component_create_ctf_fs_traces_one_root(ctf_fs,
-                       path);
+                       input);
                if (ret) {
                        goto end;
                }
@@ -1828,8 +1910,8 @@ end:
  */
 
 static
-bool validate_paths_parameter(struct ctf_fs_component *ctf_fs,
-               const bt_value *paths)
+bool validate_inputs_parameter(struct ctf_fs_component *ctf_fs,
+               const bt_value *inputs)
 {
        bool ret;
        bt_value_type type;
@@ -1837,25 +1919,25 @@ bool validate_paths_parameter(struct ctf_fs_component *ctf_fs,
        bt_logging_level log_level = ctf_fs->log_level;
        bt_self_component *self_comp = ctf_fs->self_comp;
 
-       if (!paths) {
-               BT_COMP_LOGE("missing \"paths\" parameter");
+       if (!inputs) {
+               BT_COMP_LOGE("missing \"inputs\" parameter");
                goto error;
        }
 
-       type = bt_value_get_type(paths);
+       type = bt_value_get_type(inputs);
        if (type != BT_VALUE_TYPE_ARRAY) {
-               BT_COMP_LOGE("`paths` parameter: expecting array value: type=%s",
+               BT_COMP_LOGE("`inputs` parameter: expecting array value: type=%s",
                        bt_common_value_type_string(type));
                goto error;
        }
 
-       for (i = 0; i < bt_value_array_get_size(paths); i++) {
+       for (i = 0; i < bt_value_array_get_length(inputs); i++) {
                const bt_value *elem;
 
-               elem = bt_value_array_borrow_element_by_index_const(paths, i);
+               elem = bt_value_array_borrow_element_by_index_const(inputs, i);
                type = bt_value_get_type(elem);
                if (type != BT_VALUE_TYPE_STRING) {
-                       BT_COMP_LOGE("`paths` parameter: expecting string value: index=%" PRIu64 ", type=%s",
+                       BT_COMP_LOGE("`inputs` parameter: expecting string value: index=%" PRIu64 ", type=%s",
                                i, bt_common_value_type_string(type));
                        goto error;
                }
@@ -1872,15 +1954,15 @@ end:
 }
 
 bool read_src_fs_parameters(const bt_value *params,
-               const bt_value **paths, struct ctf_fs_component *ctf_fs) {
+               const bt_value **inputs, struct ctf_fs_component *ctf_fs) {
        bool ret;
        const bt_value *value;
        bt_logging_level log_level = ctf_fs->log_level;
        bt_self_component *self_comp = ctf_fs->self_comp;
 
-       /* paths parameter */
-       *paths = bt_value_map_borrow_entry_value_const(params, "paths");
-       if (!validate_paths_parameter(ctf_fs, *paths)) {
+       /* inputs parameter */
+       *inputs = bt_value_map_borrow_entry_value_const(params, "inputs");
+       if (!validate_inputs_parameter(ctf_fs, *inputs)) {
                goto error;
        }
 
@@ -1893,7 +1975,7 @@ bool read_src_fs_parameters(const bt_value *params,
                        goto error;
                }
                ctf_fs->metadata_config.clock_class_offset_s =
-                       bt_value_signed_integer_get(value);
+                       bt_value_integer_signed_get(value);
        }
 
        /* clock-class-offset-ns parameter */
@@ -1905,7 +1987,7 @@ bool read_src_fs_parameters(const bt_value *params,
                        goto error;
                }
                ctf_fs->metadata_config.clock_class_offset_ns =
-                       bt_value_signed_integer_get(value);
+                       bt_value_integer_signed_get(value);
        }
 
 
@@ -1926,7 +2008,7 @@ struct ctf_fs_component *ctf_fs_create(
 {
        struct ctf_fs_component *ctf_fs = NULL;
        guint i;
-       const bt_value *paths_value;
+       const bt_value *inputs_value;
        bt_self_component *self_comp =
                bt_self_component_source_as_self_component(self_comp_src);
 
@@ -1936,7 +2018,7 @@ struct ctf_fs_component *ctf_fs_create(
                goto error;
        }
 
-       if (!read_src_fs_parameters(params, &paths_value, ctf_fs)) {
+       if (!read_src_fs_parameters(params, &inputs_value, ctf_fs)) {
                goto error;
        }
 
@@ -1944,7 +2026,7 @@ struct ctf_fs_component *ctf_fs_create(
        ctf_fs->self_comp = self_comp;
        ctf_fs->self_comp_src = self_comp_src;
 
-       if (ctf_fs_component_create_ctf_fs_traces(self_comp_src, ctf_fs, paths_value)) {
+       if (ctf_fs_component_create_ctf_fs_traces(self_comp_src, ctf_fs, inputs_value)) {
                goto error;
        }
 
@@ -1991,23 +2073,28 @@ bt_component_class_init_method_status ctf_fs_init(
 BT_HIDDEN
 bt_component_class_query_method_status ctf_fs_query(
                bt_self_component_class_source *comp_class,
-               const bt_query_executor *query_exec,
+               bt_private_query_executor *priv_query_exec,
                const char *object, const bt_value *params,
-               bt_logging_level log_level,
+               __attribute__((unused)) void *method_data,
                const bt_value **result)
 {
        bt_component_class_query_method_status status =
                BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
+       bt_logging_level log_level = bt_query_executor_get_logging_level(
+               bt_private_query_executor_as_query_executor_const(
+                       priv_query_exec));
 
-       if (!strcmp(object, "metadata-info")) {
+       if (strcmp(object, "metadata-info") == 0) {
                status = metadata_info_query(comp_class, params, log_level,
                        result);
-       } else if (!strcmp(object, "trace-info")) {
+       } else if (strcmp(object, "babeltrace.trace-info") == 0) {
                status = trace_info_query(comp_class, params, log_level,
                        result);
+       } else if (!strcmp(object, "babeltrace.support-info")) {
+               status = support_info_query(comp_class, params, log_level, result);
        } else {
                BT_LOGE("Unknown query object `%s`", object);
-               status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_INVALID_OBJECT;
+               status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT;
                goto end;
        }
 end:
This page took 0.028928 seconds and 4 git commands to generate.