Observed issue
==============
test_output_path_relayd[lttng-tools-2.13-lttng-tools-2.10-uid] from
the lttng-ivc fails on path validation for the resulting trace.
Here lttng-sessiond is 2.13 and lttng-relayd is 2.10
Traces are generated and the following hierarchy is found in the
lttng-relayd trace folder.
lttng_home
└── lttng-traces
* └── ust
└── joraj-alpa
├── auto-
20210113-165054
│ └── ust
│ └── uid
Note the extra "ust" (*) in the hierarchy.
The tests expects:
lttng_home
└── lttng-traces
└── joraj-alpa
├── auto-
20210113-165054
│ └── ust
│ └── uid
Cause
=====
Introduced by:
5da88b0f58d7f838068037ea449ddfb25d3e85ad [1]
relayd_add_stream now suffixes the domain_name to the pathname.
This is only necessary for cases where the corresponding
lttng-relayd version is greater than 2.10. In other cases, modification
of pathname is not necessary.
Solution
========
Perform domain suffixing only for relayd > 2.10.
Known drawbacks
=========
None.
References
==========
[1] https://github.com/lttng/lttng-tools/commit/
5da88b0f58d7f838068037ea449ddfb25d3e85ad
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Iaca4667074aaf7f4f20b50ddb4778fbc02156b5a
int ret;
struct lttcomm_relayd_status_stream reply;
char pathname[RELAYD_COMM_LTTNG_PATH_MAX];
int ret;
struct lttcomm_relayd_status_stream reply;
char pathname[RELAYD_COMM_LTTNG_PATH_MAX];
/* Code flow error. Safety net. */
assert(rsock);
/* Code flow error. Safety net. */
assert(rsock);
DBG("Relayd adding stream for channel name %s", channel_name);
DBG("Relayd adding stream for channel name %s", channel_name);
- if (_pathname[0] == '\0') {
- separator = "";
- } else {
- separator = "/";
- }
- ret = snprintf(pathname, RELAYD_COMM_LTTNG_PATH_MAX, "%s%s%s",
- domain_name, separator, _pathname);
- if (ret <= 0 || ret >= RELAYD_COMM_LTTNG_PATH_MAX) {
- ERR("stream path too long.");
- ret = -1;
- goto error;
- }
-
/* Compat with relayd 2.1 */
if (rsock->minor == 1) {
/* For 2.1 */
/* Compat with relayd 2.1 */
if (rsock->minor == 1) {
/* For 2.1 */
- ret = relayd_add_stream_2_1(rsock, channel_name, pathname);
+ ret = relayd_add_stream_2_1(rsock, channel_name, _pathname);
} else if (rsock->minor > 1 && rsock->minor < 11) {
/* From 2.2 to 2.10 */
} else if (rsock->minor > 1 && rsock->minor < 11) {
/* From 2.2 to 2.10 */
- ret = relayd_add_stream_2_2(rsock, channel_name, pathname,
+ ret = relayd_add_stream_2_2(rsock, channel_name, _pathname,
tracefile_size, tracefile_count);
} else {
tracefile_size, tracefile_count);
} else {
enum lttng_trace_chunk_status chunk_status;
uint64_t chunk_id;
enum lttng_trace_chunk_status chunk_status;
uint64_t chunk_id;
+ if (_pathname[0] == '\0') {
+ separator = "";
+ } else {
+ separator = "/";
+ }
+
+ ret = snprintf(pathname, RELAYD_COMM_LTTNG_PATH_MAX, "%s%s%s",
+ domain_name, separator, _pathname);
+ if (ret <= 0 || ret >= RELAYD_COMM_LTTNG_PATH_MAX) {
+ ERR("Failed to format stream path: %s",
+ ret <= 0 ? "formatting error" :
+ "path exceeds maximal allowed length");
+ ret = -1;
+ goto error;
+ }
+
chunk_status = lttng_trace_chunk_get_id(trace_chunk,
&chunk_id);
assert(chunk_status == LTTNG_TRACE_CHUNK_STATUS_OK);
chunk_status = lttng_trace_chunk_get_id(trace_chunk,
&chunk_id);
assert(chunk_status == LTTNG_TRACE_CHUNK_STATUS_OK);