On Mon, Apr 30, 2018 at 6:36 PM, Philippe Proulx <eeppelitel...@gmail.com> wrote: > On Mon, Apr 30, 2018 at 5:31 PM, Alexander Aring <ar...@mojatatu.com> wrote: >> >> 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. > > Although I really appreciate the contribution effort, before even > reading this patch, let me indicate that a CTF trace located on the file > system is a directory containing the data stream and metadata stream > files. Knowing this, this patch implements a hack to circumvent this, > but I'm personally not willing to have this upstream as, in my opinion, > it is the user's responsibility to have valid CTF traces to open. > > Your custom scenario asks for a custom solution on your side: copying > the metadata file to each trace's directory seems appropriate here.
Just had a thought: you can also create symbolic links in each trace's directory to your common metadata file. Phil > > Also, do your CTF traces have UUIDs? If they do, they should all be > different, but having the same metadata file makes them all the same. > This is not valid either. > > Phil > >> >> 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 _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev