ctf: add weak ref to stream file in index entry
[babeltrace.git] / src / plugins / ctf / fs-src / fs.c
index 398708db8e0eef24cc5427efc929fef12d3c2337..9282f932e209a464efa68e6d077422d101fcc792 100644 (file)
 #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)
 {
@@ -690,36 +697,6 @@ void ds_file_group_insert_ds_index_entry_sorted(
        array_insert(ds_file_group->index->entries, entry, i);
 }
 
-/*
- * Create a new ds_file_info using the provided path, begin_ns and index, then
- * add it to ds_file_group's list of ds_file_infos.
- */
-
-static
-int ctf_fs_ds_file_group_add_ds_file_info(
-               struct ctf_fs_ds_file_group *ds_file_group,
-               const char *path, int64_t begin_ns)
-{
-       struct ctf_fs_ds_file_info *ds_file_info;
-       int ret = 0;
-
-       ds_file_info = ctf_fs_ds_file_info_create(path, begin_ns);
-       if (!ds_file_info) {
-               goto error;
-       }
-
-       ds_file_group_insert_ds_file_info_sorted(ds_file_group, ds_file_info);
-
-       ds_file_info = NULL;
-       goto end;
-
-error:
-       ctf_fs_ds_file_info_destroy(ds_file_info);
-       ret = -1;
-end:
-       return ret;
-}
-
 static
 int add_ds_file_to_ds_file_group(struct ctf_fs_trace *ctf_fs_trace,
                const char *path)
@@ -731,6 +708,7 @@ int add_ds_file_to_ds_file_group(struct ctf_fs_trace *ctf_fs_trace,
        int ret;
        size_t i;
        struct ctf_fs_ds_file *ds_file = NULL;
+       struct ctf_fs_ds_file_info *ds_file_info = NULL;
        struct ctf_fs_ds_index *index = NULL;
        struct bt_msg_iter *msg_iter = NULL;
        struct ctf_stream_class *sc = NULL;
@@ -778,7 +756,12 @@ int add_ds_file_to_ds_file_group(struct ctf_fs_trace *ctf_fs_trace,
                }
        }
 
-       index = ctf_fs_ds_file_build_index(ds_file);
+       ds_file_info = ctf_fs_ds_file_info_create(path, begin_ns);
+       if (!ds_file_info) {
+               goto error;
+       }
+
+       index = ctf_fs_ds_file_build_index(ds_file, ds_file_info);
        if (!index) {
                BT_COMP_LOGW("Failed to index CTF stream file \'%s\'",
                        ds_file->file->path->str);
@@ -810,11 +793,7 @@ int add_ds_file_to_ds_file_group(struct ctf_fs_trace *ctf_fs_trace,
                        goto error;
                }
 
-               ret = ctf_fs_ds_file_group_add_ds_file_info(ds_file_group,
-                       path, begin_ns);
-               if (ret) {
-                       goto error;
-               }
+               ds_file_group_insert_ds_file_info_sorted(ds_file_group, ds_file_info);
 
                add_group = true;
                goto end;
@@ -849,11 +828,7 @@ int add_ds_file_to_ds_file_group(struct ctf_fs_trace *ctf_fs_trace,
                add_group = true;
        }
 
-       ret = ctf_fs_ds_file_group_add_ds_file_info(ds_file_group, path,
-               begin_ns);
-       if (ret) {
-               goto error;
-       }
+       ds_file_group_insert_ds_file_info_sorted(ds_file_group, ds_file_info);
 
        goto end;
 
@@ -1696,6 +1671,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,7 +1755,7 @@ 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 *input = bt_value_string_get(path_value);
 
@@ -1847,7 +1899,7 @@ bool validate_inputs_parameter(struct ctf_fs_component *ctf_fs,
                goto error;
        }
 
-       for (i = 0; i < bt_value_array_get_size(inputs); 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(inputs, i);
@@ -1989,13 +2041,16 @@ 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,
This page took 0.026943 seconds and 4 git commands to generate.