Skip to content

Commit

Permalink
flt.lttng-utils.debug-info: add all SC and EC to output trace class ASAP
Browse files Browse the repository at this point in the history
The fact that we are copying metadata only when encountering the data
associated to it leads to variations in the output of a
`sink.text.details` component when changing message batch size. It is
not wrong it's simply annoying.

So to improve that, this commit makes `flt.lttng-utils.debug-info`
components copy all the metadata of the input trace class as soon as it
encounters it.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Change-Id: I7a58e3ed4659ee73f5b0f94da5427ac8b06d5178
Reviewed-on: https://review.lttng.org/c/babeltrace/+/2132
Tested-by: jenkins <jenkins@lttng.org>
  • Loading branch information
frdeso committed Oct 23, 2019
1 parent 8839434 commit db5d746
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 41 deletions.
89 changes: 52 additions & 37 deletions src/plugins/lttng-utils/debug-info/trace-ir-mapping.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,35 +46,43 @@ static
bt_trace_class *create_new_mapped_trace_class(struct trace_ir_maps *ir_maps,
const bt_trace_class *in_trace_class)
{
struct trace_ir_metadata_maps *metadata_maps;
int ret;
bt_trace_class *out_trace_class;

BT_COMP_LOGD("Creating new mapped trace class: in-tc-addr=%p", in_trace_class);

BT_ASSERT(ir_maps);
BT_ASSERT(in_trace_class);

metadata_maps = borrow_metadata_maps_from_input_trace_class(ir_maps,
in_trace_class);

BT_ASSERT(!metadata_maps->output_trace_class);

/* Create the ouput trace class. */
out_trace_class = bt_trace_class_create(ir_maps->self_comp);
if (!out_trace_class) {
metadata_maps->output_trace_class =
bt_trace_class_create(ir_maps->self_comp);
if (!metadata_maps->output_trace_class) {
BT_COMP_LOGE_STR("Error create output trace class");
goto end;
}

/* If not, create a new one and add it to the mapping. */
ret = copy_trace_class_content(in_trace_class, out_trace_class,
ir_maps->log_level, ir_maps->self_comp);
/* Copy the content over and add to the mapping. */
ret = copy_trace_class_content(ir_maps, in_trace_class,
metadata_maps->output_trace_class, ir_maps->log_level,
ir_maps->self_comp);
if (ret) {
BT_COMP_LOGE_STR("Error copy content to output trace class");
out_trace_class = NULL;
BT_TRACE_CLASS_PUT_REF_AND_RESET(metadata_maps->output_trace_class);
metadata_maps->output_trace_class = NULL;
goto end;
}

BT_COMP_LOGD("Created new mapped trace class: in-tc-addr=%p, out-tc-addr=%p",
in_trace_class, out_trace_class);
in_trace_class, metadata_maps->output_trace_class);

end:
return out_trace_class;
return metadata_maps->output_trace_class;
}

static
Expand Down Expand Up @@ -123,19 +131,24 @@ bt_trace *create_new_mapped_trace(struct trace_ir_maps *ir_maps,
return out_trace;
}

static
bt_stream_class *borrow_mapped_stream_class(struct trace_ir_metadata_maps *md_maps,
BT_HIDDEN
bt_stream_class *trace_ir_mapping_borrow_mapped_stream_class(
struct trace_ir_maps *ir_maps,
const bt_stream_class *in_stream_class)
{
BT_ASSERT_DBG(md_maps);
BT_ASSERT_DBG(ir_maps);
BT_ASSERT_DBG(in_stream_class);

struct trace_ir_metadata_maps *md_maps =
borrow_metadata_maps_from_input_stream_class(ir_maps,
in_stream_class);
return g_hash_table_lookup(md_maps->stream_class_map,
(gpointer) in_stream_class);
}

static
bt_stream_class *create_new_mapped_stream_class(struct trace_ir_maps *ir_maps,
BT_HIDDEN
bt_stream_class *trace_ir_mapping_create_new_mapped_stream_class(
struct trace_ir_maps *ir_maps,
const bt_stream_class *in_stream_class)
{
struct trace_ir_metadata_maps *md_maps;
Expand All @@ -147,12 +160,13 @@ bt_stream_class *create_new_mapped_stream_class(struct trace_ir_maps *ir_maps,

BT_ASSERT(ir_maps);
BT_ASSERT(in_stream_class);
BT_ASSERT(!trace_ir_mapping_borrow_mapped_stream_class(ir_maps,
in_stream_class));

md_maps = borrow_metadata_maps_from_input_stream_class(ir_maps,
in_stream_class);

BT_ASSERT(md_maps);
BT_ASSERT(!borrow_mapped_stream_class(md_maps, in_stream_class));

/* Create the output stream class. */
out_stream_class = bt_stream_class_create_with_id(
Expand All @@ -163,6 +177,10 @@ bt_stream_class *create_new_mapped_stream_class(struct trace_ir_maps *ir_maps,
goto end;
}

/* Add it to the mapping. */
g_hash_table_insert(md_maps->stream_class_map,
(gpointer) in_stream_class, out_stream_class);

/* Copy the content over to the output stream class. */
ret = copy_stream_class_content(ir_maps, in_stream_class,
out_stream_class);
Expand All @@ -172,10 +190,6 @@ bt_stream_class *create_new_mapped_stream_class(struct trace_ir_maps *ir_maps,
goto end;
}

/* Add it to the mapping. */
g_hash_table_insert(md_maps->stream_class_map,
(gpointer) in_stream_class, out_stream_class);

BT_COMP_LOGD("Created new mapped stream class: in-sc-addr=%p, out-sc-addr=%p",
in_stream_class, out_stream_class);

Expand All @@ -198,7 +212,6 @@ bt_stream *trace_ir_mapping_create_new_mapped_stream(
struct trace_ir_maps *ir_maps, const bt_stream *in_stream)
{
struct trace_ir_data_maps *d_maps;
struct trace_ir_metadata_maps *md_maps;
const bt_stream_class *in_stream_class;
const bt_trace *in_trace;
bt_stream_class *out_stream_class;
Expand All @@ -223,12 +236,13 @@ bt_stream *trace_ir_mapping_create_new_mapped_stream(
BT_ASSERT(!borrow_mapped_stream(d_maps, in_stream));

in_stream_class = bt_stream_borrow_class_const(in_stream);
md_maps = borrow_metadata_maps_from_input_stream_class(ir_maps, in_stream_class);
out_stream_class = borrow_mapped_stream_class(md_maps, in_stream_class);
out_stream_class = trace_ir_mapping_borrow_mapped_stream_class(ir_maps,
in_stream_class);

if (!out_stream_class) {
/* Create the output stream class for this input stream class. */
out_stream_class = create_new_mapped_stream_class(ir_maps,
in_stream_class);
out_stream_class = trace_ir_mapping_create_new_mapped_stream_class(
ir_maps, in_stream_class);
if (!out_stream_class) {
goto end;
}
Expand All @@ -243,14 +257,14 @@ bt_stream *trace_ir_mapping_create_new_mapped_stream(
goto end;
}

/* Copy the content over to the output stream. */
copy_stream_content(in_stream, out_stream, ir_maps->log_level,
ir_maps->self_comp);

/* Add it to the mapping. */
g_hash_table_insert(d_maps->stream_map, (gpointer) in_stream,
out_stream);

/* Copy the content over to the output stream. */
copy_stream_content(in_stream, out_stream, ir_maps->log_level,
ir_maps->self_comp);

BT_COMP_LOGD("Created new mapped stream: in-s-addr=%p, out-s-addr=%p",
in_stream, out_stream);

Expand Down Expand Up @@ -308,7 +322,8 @@ bt_event_class *trace_ir_mapping_create_new_mapped_event_class(
BT_ASSERT(!borrow_mapped_event_class(md_maps, in_event_class));

/* Get the right output stream class to add the new event class to it. */
out_stream_class = borrow_mapped_stream_class(md_maps, in_stream_class);
out_stream_class = trace_ir_mapping_borrow_mapped_stream_class(
ir_maps, in_stream_class);
BT_ASSERT(out_stream_class);

/* Create an output event class. */
Expand All @@ -319,6 +334,10 @@ bt_event_class *trace_ir_mapping_create_new_mapped_event_class(
goto end;
}

/* Add it to the mapping. */
g_hash_table_insert(md_maps->event_class_map,
(gpointer) in_event_class, out_event_class);

/* Copy the content over to the output event class. */
ret = copy_event_class_content(ir_maps, in_event_class,
out_event_class);
Expand All @@ -328,10 +347,6 @@ bt_event_class *trace_ir_mapping_create_new_mapped_event_class(
goto end;
}

/* Add it to the mapping. */
g_hash_table_insert(md_maps->event_class_map,
(gpointer) in_event_class, out_event_class);

BT_COMP_LOGD("Created new mapped event class: in-ec-addr=%p, out-ec-addr=%p",
in_event_class, out_event_class);

Expand Down Expand Up @@ -398,14 +413,14 @@ bt_packet *trace_ir_mapping_create_new_mapped_packet(
goto end;
}

/* Copy the content over to the output packet. */
copy_packet_content(in_packet, out_packet, ir_maps->log_level,
ir_maps->self_comp);

/* Add it to the mapping. */
g_hash_table_insert(d_maps->packet_map,
(gpointer) in_packet, out_packet);

/* Copy the content over to the output packet. */
copy_packet_content(in_packet, out_packet, ir_maps->log_level,
ir_maps->self_comp);

BT_COMP_LOGD("Created new mapped packet: in-p-addr=%p, out-p-addr=%p",
in_packet, out_packet);

Expand Down
10 changes: 10 additions & 0 deletions src/plugins/lttng-utils/debug-info/trace-ir-mapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,16 @@ struct trace_ir_metadata_maps *trace_ir_metadata_maps_create(
BT_HIDDEN
void trace_ir_metadata_maps_destroy(struct trace_ir_metadata_maps *md_maps);

BT_HIDDEN
bt_stream_class *trace_ir_mapping_create_new_mapped_stream_class(
struct trace_ir_maps *ir_maps,
const bt_stream_class *in_stream_class);

BT_HIDDEN
bt_stream_class *trace_ir_mapping_borrow_mapped_stream_class(
struct trace_ir_maps *ir_maps,
const bt_stream_class *in_stream_class);

BT_HIDDEN
bt_stream *trace_ir_mapping_create_new_mapped_stream(
struct trace_ir_maps *ir_maps,
Expand Down
48 changes: 45 additions & 3 deletions src/plugins/lttng-utils/debug-info/trace-ir-metadata-copy.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,11 @@
#include "utils.h"

BT_HIDDEN
int copy_trace_class_content(const bt_trace_class *in_trace_class,
bt_trace_class *out_trace_class, bt_logging_level log_level,
bt_self_component *self_comp)
int copy_trace_class_content(struct trace_ir_maps *ir_maps,
const bt_trace_class *in_trace_class, bt_trace_class *out_trace_class,
bt_logging_level log_level, bt_self_component *self_comp)
{
uint64_t sc_number, sc_idx;
BT_COMP_LOGD("Copying content of trace class: in-tc-addr=%p, out-tc-addr=%p",
in_trace_class, out_trace_class);

Expand All @@ -56,6 +57,27 @@ int copy_trace_class_content(const bt_trace_class *in_trace_class,
/* Use the same stream class ids as in the origin trace class. */
bt_trace_class_set_assigns_automatic_stream_class_id(out_trace_class,
BT_FALSE);

/* Copy stream classes contained in the trace class. */
sc_number = bt_trace_class_get_stream_class_count(in_trace_class);
for (sc_idx = 0; sc_idx < sc_number; sc_idx++) {
bt_stream_class *out_stream_class;
const bt_stream_class *in_stream_class =
bt_trace_class_borrow_stream_class_by_index_const(
in_trace_class, sc_idx);

out_stream_class = trace_ir_mapping_borrow_mapped_stream_class(
ir_maps, in_stream_class);
if (!out_stream_class) {
/*
* We don't need the new stream_class yet. We simply
* want to create it and keep it in the map.
*/
(void) trace_ir_mapping_create_new_mapped_stream_class(
ir_maps, in_stream_class);
}
}

BT_COMP_LOGD("Copied content of trace class: in-tc-addr=%p, out-tc-addr=%p",
in_trace_class, out_trace_class);
return 0;
Expand Down Expand Up @@ -192,6 +214,7 @@ int copy_stream_class_content(struct trace_ir_maps *ir_maps,
const bt_field_class *in_packet_context_fc, *in_common_context_fc;
bt_field_class *out_packet_context_fc, *out_common_context_fc;
const char *in_name;
uint64_t ec_number, ec_idx;
bt_logging_level log_level = ir_maps->log_level;
bt_self_component *self_comp = ir_maps->self_comp;
int ret = 0;
Expand Down Expand Up @@ -324,6 +347,25 @@ int copy_stream_class_content(struct trace_ir_maps *ir_maps,
}
}

/* Copy event classes contained in the stream class. */
ec_number = bt_stream_class_get_event_class_count(in_stream_class);
for (ec_idx = 0; ec_idx < ec_number; ec_idx++) {
bt_event_class *out_event_class;
const bt_event_class *in_event_class =
bt_stream_class_borrow_event_class_by_id_const(
in_stream_class, ec_idx);
out_event_class = trace_ir_mapping_borrow_mapped_event_class(
ir_maps, in_event_class);
if (!out_event_class) {
/*
* We don't need the new event_class yet. We simply
* want to create it and keep it in the map.
*/
(void) trace_ir_mapping_create_new_mapped_event_class(
ir_maps, in_event_class);
}
}

BT_COMP_LOGD("Copied content of stream class: in-sc-addr=%p, out-sc-addr=%p",
in_stream_class, out_stream_class);
error:
Expand Down
3 changes: 2 additions & 1 deletion src/plugins/lttng-utils/debug-info/trace-ir-metadata-copy.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
#include "trace-ir-mapping.h"

BT_HIDDEN
int copy_trace_class_content(const bt_trace_class *in_trace_class,
int copy_trace_class_content(struct trace_ir_maps *trace_ir_maps,
const bt_trace_class *in_trace_class,
bt_trace_class *out_trace_class,
bt_logging_level log_level,
bt_self_component *self_comp);
Expand Down

0 comments on commit db5d746

Please sign in to comment.