[lttng-dev] [RFC babeltrace 1/2] fs-src: add argument for metadata src dir
Alexander Aring
aring at mojatatu.com
Mon Apr 30 17:31:06 EDT 2018
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 <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
More information about the lttng-dev
mailing list