From 626cc4882d9afd80cfae4471b60dc4e882eb9bda Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Wed, 12 Jun 2019 15:58:20 -0400 Subject: [PATCH] ctf: add tracer version extraction function This commit adds a utility function to extract tracer version of a given trace. Because, it was discovered that some tracers may produce non-compliant CTF traces more-or-less frequently. To accommodate those external tools, we will add ad-hoc fixes for the affected version. We thus need a way to check the tracer versions of the traces. Signed-off-by: Francis Deslauriers Change-Id: I67e73a5928dfac0cebc1135552f5525af930ebfc Reviewed-on: https://review.lttng.org/c/babeltrace/+/1418 Tested-by: jenkins Reviewed-by: Philippe Proulx --- src/plugins/ctf/fs-src/fs.c | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/src/plugins/ctf/fs-src/fs.c b/src/plugins/ctf/fs-src/fs.c index 38878f18..e33107ae 100644 --- a/src/plugins/ctf/fs-src/fs.c +++ b/src/plugins/ctf/fs-src/fs.c @@ -46,6 +46,13 @@ #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) { @@ -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) -- 2.34.1