ret = consumer_push_metadata(socket, registry->metadata_key,
metadata_str, len, offset);
if (ret < 0) {
+ /*
+ * There is an acceptable race here between the registry metadata key
+ * assignment and the creation on the consumer. The session daemon can
+ * concurrently push metadata for this registry while being created on
+ * the consumer since the metadata key of the registry is assigned
+ * *before* it is setup to avoid the consumer to ask for metadata that
+ * could possibly be not found in the session daemon.
+ *
+ * The metadata will get pushed either by the session being stopped or
+ * the consumer requesting metadata if that race is triggered.
+ */
+ if (ret == -LTTCOMM_CONSUMERD_CHANNEL_FAIL) {
+ ret = 0;
+ }
+
+ /* Update back the actual metadata len sent since it failed here. */
+ pthread_mutex_lock(®istry->lock);
+ registry->metadata_len_sent -= len;
+ pthread_mutex_unlock(®istry->lock);
ret_val = ret;
goto error_push;
}
exclusion_alloc_size = sizeof(struct lttng_ust_event_exclusion) +
LTTNG_UST_SYM_NAME_LEN * uevent->exclusion->count;
ua_event->exclusion = zmalloc(exclusion_alloc_size);
- if (ua_event->exclusion) {
- memcpy(ua_event->exclusion, uevent->exclusion, exclusion_alloc_size);
+ if (ua_event->exclusion == NULL) {
+ PERROR("malloc");
+ } else {
+ memcpy(ua_event->exclusion, uevent->exclusion,
+ exclusion_alloc_size);
}
}
}
}
memcpy(tmp_event[count].field_name, uiter.field_name, LTTNG_UST_SYM_NAME_LEN);
- tmp_event[count].type = uiter.type;
+ /* Mapping between these enums matches 1 to 1. */
+ tmp_event[count].type = (enum lttng_event_field_type) uiter.type;
tmp_event[count].nowrite = uiter.nowrite;
memcpy(tmp_event[count].event.name, uiter.event_name, LTTNG_UST_SYM_NAME_LEN);
tmp_event[count].event.loglevel = uiter.loglevel;
- tmp_event[count].event.type = LTTNG_UST_TRACEPOINT;
+ tmp_event[count].event.type = LTTNG_EVENT_TRACEPOINT;
tmp_event[count].event.pid = app->pid;
tmp_event[count].event.enabled = -1;
count++;