[lttng-dev] [RFC babeltrace 1/2] fs-src: add argument for metadata src dir

Philippe Proulx eeppeliteloop at gmail.com
Mon Apr 30 18:36:08 EDT 2018


On Mon, Apr 30, 2018 at 5:31 PM, Alexander Aring <aring at 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.

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 <aring at 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 at lists.lttng.org
> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


More information about the lttng-dev mailing list