[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