This patch adds an argument for the fs-src plugin to declare the directory to find the metadata file instead of placing it in every subdir of traces.
If parameter assign every subdirectory which does not have a subdirectory and at least some regular files will be assumed as a trace directory. The regular files will be assumed as ctf trace files. Signed-off-by: Alexander Aring <ar...@mojatatu.com> --- cli/babeltrace-cfg-cli-args.c | 10 +++++ plugins/ctf/fs-src/fs.c | 88 +++++++++++++++++++++++++++++++++++-------- plugins/ctf/fs-src/fs.h | 3 +- plugins/ctf/fs-src/metadata.c | 8 +++- plugins/ctf/fs-src/metadata.h | 1 + plugins/ctf/fs-src/query.c | 2 +- 6 files changed, 94 insertions(+), 18 deletions(-) diff --git a/cli/babeltrace-cfg-cli-args.c b/cli/babeltrace-cfg-cli-args.c index 8f01e64b..ab76852e 100644 --- a/cli/babeltrace-cfg-cli-args.c +++ b/cli/babeltrace-cfg-cli-args.c @@ -1306,6 +1306,7 @@ enum { OPT_CLOCK_GMT, OPT_CLOCK_OFFSET, OPT_CLOCK_OFFSET_NS, + OPT_METADATA_SRC, OPT_CLOCK_SECONDS, OPT_COLOR, OPT_COMPONENT, @@ -2789,6 +2790,7 @@ void print_convert_usage(FILE *fp) fprintf(fp, "\n"); fprintf(fp, " --clock-offset=SEC Set clock offset to SEC seconds\n"); fprintf(fp, " --clock-offset-ns=NS Set clock offset to NS ns\n"); + fprintf(fp, " --metadata-src=PATH Set a path to find the metadata\n"); fprintf(fp, "\n"); fprintf(fp, "Implicit `sink.text.pretty` component options:\n"); fprintf(fp, "\n"); @@ -2886,6 +2888,7 @@ struct poptOption convert_long_options[] = { { "clock-gmt", '\0', POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL }, { "clock-offset", '\0', POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET, NULL, NULL }, { "clock-offset-ns", '\0', POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET_NS, NULL, NULL }, + { "metadata-src", '\0', POPT_ARG_STRING, NULL, OPT_METADATA_SRC, NULL, NULL }, { "clock-seconds", '\0', POPT_ARG_NONE, NULL, OPT_CLOCK_SECONDS, NULL, NULL }, { "color", '\0', POPT_ARG_STRING, NULL, OPT_COLOR, NULL, NULL }, { "component", 'c', POPT_ARG_STRING, NULL, OPT_COMPONENT, NULL, NULL }, @@ -3942,6 +3945,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], case OPT_CLOCK_GMT: case OPT_CLOCK_OFFSET: case OPT_CLOCK_OFFSET_NS: + case OPT_METADATA_SRC: case OPT_CLOCK_SECONDS: case OPT_COLOR: case OPT_DEBUG: @@ -4104,6 +4108,12 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], &base_implicit_ctf_input_args, "clock-class-offset-ns", arg); break; + case OPT_METADATA_SRC: + base_implicit_ctf_input_args.exists = true; + append_implicit_component_param( + &base_implicit_ctf_input_args, + "metadata-src", arg); + break; case OPT_CLOCK_SECONDS: append_implicit_component_param( &implicit_text_args, "clock-seconds", "yes"); diff --git a/plugins/ctf/fs-src/fs.c b/plugins/ctf/fs-src/fs.c index 2dacf97d..7f98dda5 100644 --- a/plugins/ctf/fs-src/fs.c +++ b/plugins/ctf/fs-src/fs.c @@ -1039,26 +1039,70 @@ end: } BT_HIDDEN -int ctf_fs_find_traces(GList **trace_paths, const char *start_path) +int ctf_fs_find_traces(GList **trace_paths, const char *start_path, + const char *metadata_src) { int ret; GError *error = NULL; GDir *dir = NULL; const char *basename = NULL; + bool subdirs = false; + bool regfile = false; - /* Check if the starting path is a CTF trace itself */ - ret = path_is_ctf_trace(start_path); - if (ret < 0) { - goto end; - } + if (metadata_src) { + ret = path_is_ctf_trace(metadata_src); + if (ret < 0) { + goto end; + } - if (ret) { - /* - * Stop recursion: a CTF trace cannot contain another - * CTF trace. - */ - ret = add_trace_path(trace_paths, start_path); - goto end; + if (ret) { + dir = g_dir_open(start_path, 0, &error); + if (!dir) { + goto end; + } + + while ((basename = g_dir_read_name(dir))) { + GString *sub_path = g_string_new(NULL); + + if (!sub_path) { + ret = -1; + goto end; + } + + g_string_printf(sub_path, "%s" G_DIR_SEPARATOR_S "%s", start_path, basename); + if (g_file_test(sub_path->str, G_FILE_TEST_IS_DIR)) { + subdirs = true; + } + if (g_file_test(sub_path->str, G_FILE_TEST_IS_REGULAR)) { + regfile = true; + } + g_string_free(sub_path, TRUE); + } + + g_dir_close(dir); + dir = NULL; + + /* Look if dir has no subdirs but regfile(s) */ + if (!subdirs && regfile) { + ret = add_trace_path(trace_paths, start_path); + goto end; + } + } + } else { + /* Check if the starting path is a CTF trace itself */ + ret = path_is_ctf_trace(start_path); + if (ret < 0) { + goto end; + } + + if (ret) { + /* + * Stop recursion: a CTF trace cannot contain another + * CTF trace. + */ + ret = add_trace_path(trace_paths, start_path); + goto end; + } } /* Look for subdirectories */ @@ -1090,7 +1134,7 @@ int ctf_fs_find_traces(GList **trace_paths, const char *start_path) } g_string_printf(sub_path, "%s" G_DIR_SEPARATOR_S "%s", start_path, basename); - ret = ctf_fs_find_traces(trace_paths, sub_path->str); + ret = ctf_fs_find_traces(trace_paths, sub_path->str, metadata_src); g_string_free(sub_path, TRUE); if (ret) { goto end; @@ -1181,7 +1225,8 @@ int create_ctf_fs_traces(struct ctf_fs_component *ctf_fs, goto error; } - ret = ctf_fs_find_traces(&trace_paths, norm_path->str); + ret = ctf_fs_find_traces(&trace_paths, norm_path->str, + ctf_fs->metadata_config.metadata_src); if (ret) { goto error; } @@ -1287,6 +1332,19 @@ struct ctf_fs_component *ctf_fs_create(struct bt_private_component *priv_comp, value_ret = bt_value_string_get(value, &path_param); assert(value_ret == BT_VALUE_STATUS_OK); BT_PUT(value); + + value = bt_value_map_get(params, "metadata-src"); + if (value) { + if (!bt_value_is_string(value)) { + goto error; + } + + value_ret = bt_value_string_get(value, + &ctf_fs->metadata_config.metadata_src); + assert(value_ret == BT_VALUE_STATUS_OK); + BT_PUT(value); + } + value = bt_value_map_get(params, "clock-class-offset-s"); if (value) { if (!bt_value_is_integer(value)) { diff --git a/plugins/ctf/fs-src/fs.h b/plugins/ctf/fs-src/fs.h index bbac1bb4..f80aea74 100644 --- a/plugins/ctf/fs-src/fs.h +++ b/plugins/ctf/fs-src/fs.h @@ -154,7 +154,8 @@ BT_HIDDEN void ctf_fs_trace_destroy(struct ctf_fs_trace *trace); BT_HIDDEN -int ctf_fs_find_traces(GList **trace_paths, const char *start_path); +int ctf_fs_find_traces(GList **trace_paths, const char *start_path, + const char *metadata_src); BT_HIDDEN GList *ctf_fs_create_trace_names(GList *trace_paths, const char *base_path); diff --git a/plugins/ctf/fs-src/metadata.c b/plugins/ctf/fs-src/metadata.c index 231d946c..02cbd0cd 100644 --- a/plugins/ctf/fs-src/metadata.c +++ b/plugins/ctf/fs-src/metadata.c @@ -96,8 +96,14 @@ int ctf_fs_metadata_set_trace(struct ctf_fs_trace *ctf_fs_trace, .clock_class_offset_s = config ? config->clock_class_offset_s : 0, .clock_class_offset_ns = config ? config->clock_class_offset_ns : 0, }; + const char *metadata_src; - file = get_file(ctf_fs_trace->path->str); + if (config->metadata_src) + metadata_src = config->metadata_src; + else + metadata_src = ctf_fs_trace->path->str; + + file = get_file(metadata_src); if (!file) { BT_LOGE("Cannot create metadata file object"); ret = -1; diff --git a/plugins/ctf/fs-src/metadata.h b/plugins/ctf/fs-src/metadata.h index 496a5ca9..00d8de67 100644 --- a/plugins/ctf/fs-src/metadata.h +++ b/plugins/ctf/fs-src/metadata.h @@ -36,6 +36,7 @@ struct ctf_fs_metadata; struct ctf_fs_metadata_config { int64_t clock_class_offset_s; int64_t clock_class_offset_ns; + const char *metadata_src; }; BT_HIDDEN diff --git a/plugins/ctf/fs-src/query.c b/plugins/ctf/fs-src/query.c index 04bf8c5b..6f2aa5fe 100644 --- a/plugins/ctf/fs-src/query.c +++ b/plugins/ctf/fs-src/query.c @@ -500,7 +500,7 @@ struct bt_component_class_query_method_return trace_info_query( } assert(path); - ret = ctf_fs_find_traces(&trace_paths, normalized_path->str); + ret = ctf_fs_find_traces(&trace_paths, normalized_path->str, NULL); if (ret) { goto error; } -- 2.11.0 _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev