.input_args = stats_client_input_args,
};
-static struct event *stats_event_get_merged(struct event *event)
-{
- struct event *res = event;
- struct event *p;
- unsigned int cat_count, field_count;
- bool use_original = TRUE;
-
- for (p = event->parent;
- p != NULL && !p->id_sent_to_stats &&
- timeval_cmp(&p->tv_created_ioloop, &res->tv_created_ioloop) == 0;
- p = p->parent) {
- // Merge all parents with the same timestamp into result.
- if (!event_has_all_categories(res, p) ||
- !event_has_all_fields(res, p)) {
- if (use_original) {
- res = event_dup(event);
- use_original = FALSE;
- }
- event_copy_categories(res, p);
- event_copy_fields(res, p);
- }
- }
-
- for (; p != NULL && !p->id_sent_to_stats; p = p->parent) {
- // Now skip parents with empty fields and categories.
- (void)event_get_fields(p, &field_count);
- (void)event_get_categories(p, &cat_count);
- if (field_count > 0 || cat_count > 0)
- break;
- }
-
- if (res->parent != p) {
- /* p is NULL or
- p sent to stats or
- p is the first parent that has different timestamp from event
- and have fields and/or categories
- use p as parent,
- because we do not want parent without fields and categoris */
- if (use_original)
- res = event_dup(event);
- event_unref(&res->parent);
- res->parent = p;
- if (res->parent != NULL)
- event_ref(res->parent);
- }
- return res;
-}
-
static void
stats_event_write(struct event *event, const struct failure_context *ctx,
string_t *str, bool begin)
{
- struct event *merged_event = begin? event: stats_event_get_merged(event);
- struct event *parent_event = merged_event->parent;
+ struct event *merged_event;
+ struct event *parent_event;
+
+ merged_event = begin ? event_ref(event) : event_minimize(event);
+ parent_event = merged_event->parent;
if (parent_event != NULL) {
if (!parent_event->id_sent_to_stats)
ctx->type);
event_export(merged_event, str);
str_append_c(str, '\n');
- if (merged_event != event)
- event_unref(&merged_event);
+ event_unref(&merged_event);
}
static void