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

Reply via email to