ctf: add tracer version extraction function
[babeltrace.git] / src / plugins / ctf / fs-src / fs.c
index 57384014f628be5ec8aec76ec54208d048b81b92..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)
 {
@@ -1683,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++;
@@ -1696,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)
@@ -1703,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;
                }
@@ -1826,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;
@@ -1835,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;
                }
@@ -1870,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;
        }
 
@@ -1924,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);
 
@@ -1934,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;
        }
 
@@ -1942,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;
        }
 
@@ -1989,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") == 0) {
                status = metadata_info_query(comp_class, params, log_level,
                        result);
-       } else if (strcmp(object, "trace-info") == 0) {
+       } 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.028288 seconds and 4 git commands to generate.