/*
- * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 EfficiOS Inc.
* Copyright (C) 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
* SPDX-License-Identifier: GPL-2.0-only
#include "rotate.h"
#include "event.h"
#include "event-notifier-error-accounting.h"
-
+#include "ust-field-utils.h"
struct lttng_ht *ust_app_ht;
struct lttng_ht *ust_app_ht_by_sock;
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_release_object(sock, ua_ctx->obj);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app sock %d release ctx obj handle %d failed with ret %d",
- sock, ua_ctx->obj->handle, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app release ctx failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app release ctx failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app release ctx obj handle %d failed with ret %d: pid = %d, sock = %d",
+ ua_ctx->obj->handle, ret,
+ app->pid, app->sock);
+ }
}
free(ua_ctx->obj);
}
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_release_object(sock, ua_event->obj);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app sock %d release event obj failed with ret %d",
- sock, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app release event failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app release event failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app release event obj failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
+ }
}
free(ua_event->obj);
}
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_release_object(sock, ua_event_notifier_rule->obj);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Failed to release event notifier object: app = '%s' (ppid %d), ret = %d",
- app->name, (int) app->ppid, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app release event notifier failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app release event notifier failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app release event notifier failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
+ }
}
free(ua_event_notifier_rule->obj);
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_release_object(sock, stream->obj);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app sock %d release stream obj failed with ret %d",
- sock, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app release stream failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app release stream failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app release stream obj failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
+ }
}
lttng_fd_put(LTTNG_FD_APPS, 2);
free(stream->obj);
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_release_object(sock, ua_chan->obj);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app sock %d release channel obj failed with ret %d",
- sock, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app channel %s release failed. Application is dead: pid = %d, sock = %d",
+ ua_chan->name, app->pid,
+ app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app channel %s release failed. Communication time out: pid = %d, sock = %d",
+ ua_chan->name, app->pid,
+ app->sock);
+ } else {
+ ERR("UST app channel %s release failed with ret %d: pid = %d, sock = %d",
+ ua_chan->name, ret, app->pid,
+ app->sock);
+ }
}
lttng_fd_put(LTTNG_FD_APPS, 1);
free(ua_chan->obj);
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_release_handle(sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app sock %d release session handle failed with ret %d",
- sock, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app release session handle failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app release session handle failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app release session handle failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
+ }
}
+
/* Remove session from application UST object descriptor. */
iter.iter.node = &ua_sess->ust_objd_node.node;
ret = lttng_ht_del(app->ust_sessions_objd, &iter);
{
enum lttng_event_rule_generate_exclusions_status
generate_exclusion_status;
+ enum lttng_condition_status cond_status;
struct ust_app_event_notifier_rule *ua_event_notifier_rule;
struct lttng_condition *condition = NULL;
const struct lttng_event_rule *event_rule = NULL;
assert(lttng_condition_get_type(condition) ==
LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES);
- assert(LTTNG_CONDITION_STATUS_OK ==
- lttng_condition_event_rule_matches_get_rule(
- condition, &event_rule));
+ cond_status = lttng_condition_event_rule_matches_get_rule(
+ condition, &event_rule);
+ assert(cond_status == LTTNG_CONDITION_STATUS_OK);
assert(event_rule);
ua_event_notifier_rule->error_counter_index =
case LTTNG_EVENT_RULE_GENERATE_EXCLUSIONS_STATUS_NONE:
break;
default:
- /* Error occured. */
+ /* Error occurred. */
ERR("Failed to generate exclusions from trigger while allocating an event notifier rule");
goto error_put_trigger;
}
ua_chan->obj, &ua_ctx->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app create channel context failed for app (pid: %d) "
- "with ret %d", app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ ret = 0;
+ DBG3("UST app create channel context failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
ret = 0;
- DBG3("UST app add context failed. Application is dead.");
+ WARN("UST app create channel context failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app create channel context failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
goto error;
}
ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app set object filter failed: object = %p of app pid = %d, ret = %d",
- ust_object, app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ ret = 0;
+ DBG3("UST app set filter failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
ret = 0;
- DBG3("Failed to set UST app object filter. Application is dead.");
+ WARN("UST app set filter failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app set filter failed with ret %d: pid = %d, sock = %d, object = %p",
+ ret, app->pid, app->sock, ust_object);
}
goto error;
}
ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app set object capture failed: object = %p of app pid = %d, ret = %d",
- ust_object, app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = 0;
- DBG3("Failed to set UST app object capture. Application is dead.");
+ DBG3("UST app set capture failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ ret = 0;
+ DBG3("UST app set capture failed. Communication timeout: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app event set capture failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid,
+ app->sock);
}
goto error;
ret = lttng_ust_ctl_set_exclusion(app->sock, ust_exclusions, ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Failed to set UST app exclusions for object %p of app (pid: %d) "
- "with ret %d", ust_object, app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = 0;
- DBG3("Failed to set UST app object exclusions. Application is dead.");
+ DBG3("UST app event exclusion failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ ret = 0;
+ WARN("UST app event exclusion failed. Communication time out(pid: %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app event exclusions failed with ret %d: pid = %d, sock = %d, object = %p",
+ ret, app->pid, app->sock, ust_object);
}
goto error;
}
ret = lttng_ust_ctl_disable(app->sock, object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Failed to disable UST app object %p app (pid: %d) with ret %d",
- object, app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ ret = 0;
+ DBG3("UST app disable object failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
ret = 0;
- DBG3("Failed to disable UST app object. Application is dead.");
+ WARN("UST app disable object failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app disable object failed with ret %d: pid = %d, sock = %d, object = %p",
+ ret, app->pid, app->sock, object);
}
goto error;
}
- DBG2("UST app object %p disabled successfully for app (pid: %d)",
+ DBG2("UST app object %p disabled successfully for app: pid = %d",
object, app->pid);
error:
ret = lttng_ust_ctl_disable(app->sock, ua_chan->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app channel %s disable failed for app (pid: %d) "
- "and session handle %d with ret %d",
- ua_chan->name, app->pid, ua_sess->handle, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ ret = 0;
+ DBG3("UST app disable channel failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
ret = 0;
- DBG3("UST app disable channel failed. Application is dead.");
+ WARN("UST app disable channel failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app channel %s disable failed, session handle %d, with ret %d: pid = %d, sock = %d",
+ ua_chan->name, ua_sess->handle, ret,
+ app->pid, app->sock);
}
goto error;
}
- DBG2("UST app channel %s disabled successfully for app (pid: %d)",
+ DBG2("UST app channel %s disabled successfully for app: pid = %d",
ua_chan->name, app->pid);
error:
ret = lttng_ust_ctl_enable(app->sock, ua_chan->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app channel %s enable failed for app (pid: %d) "
- "and session handle %d with ret %d",
- ua_chan->name, app->pid, ua_sess->handle, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ ret = 0;
+ DBG3("UST app channel %s enable failed. Application is dead: pid = %d, sock = %d",
+ ua_chan->name, app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
ret = 0;
- DBG3("UST app enable channel failed. Application is dead.");
+ WARN("UST app channel %s enable failed. Communication time out: pid = %d, sock = %d",
+ ua_chan->name, app->pid, app->sock);
+ } else {
+ ERR("UST app channel %s enable failed, session handle %d, with ret %d: pid = %d, sock = %d",
+ ua_chan->name, ua_sess->handle, ret,
+ app->pid, app->sock);
}
goto error;
}
ua_chan->enabled = 1;
- DBG2("UST app channel %s enabled successfully for app (pid: %d)",
+ DBG2("UST app channel %s enabled successfully for app: pid = %d",
ua_chan->name, app->pid);
error:
ret = lttng_ust_ctl_enable(app->sock, ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app enable failed for object %p app (pid: %d) with ret %d",
- ust_object, app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = 0;
- DBG3("Failed to enable UST app object. Application is dead.");
+ DBG3("UST app enable object failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ ret = 0;
+ WARN("UST app enable object failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app enable object failed with ret %d: pid = %d, sock = %d, object = %p",
+ ret, app->pid, app->sock, ust_object);
}
goto error;
}
- DBG2("UST app object %p enabled successfully for app (pid: %d)",
+ DBG2("UST app object %p enabled successfully for app: pid = %d",
ust_object, app->pid);
error:
if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = -ENOTCONN; /* Caused by app exiting. */
goto error;
+ } else if (ret == -EAGAIN) {
+ /* Caused by timeout. */
+ WARN("Communication with application %d timed out on send_channel for channel \"%s\" of session \"%" PRIu64 "\".",
+ app->pid, ua_chan->name, ua_sess->tracing_id);
+ /* Treat this the same way as an application that is exiting. */
+ ret = -ENOTCONN;
+ goto error;
} else if (ret < 0) {
goto error;
}
cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) {
ret = ust_consumer_send_stream_to_ust(app, ua_chan, stream);
if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
- ret = -ENOTCONN; /* Caused by app exiting. */
+ ret = -ENOTCONN; /* Caused by app exiting. */
goto error;
+ } else if (ret == -EAGAIN) {
+ /* Caused by timeout. */
+ WARN("Communication with application %d timed out on send_stream for stream \"%s\" of channel \"%s\" of session \"%" PRIu64 "\".",
+ app->pid, stream->name, ua_chan->name,
+ ua_sess->tracing_id);
+ /*
+ * Treat this the same way as an application that is
+ * exiting.
+ */
+ ret = -ENOTCONN;
} else if (ret < 0) {
goto error;
}
&ua_event->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- abort();
- ERR("Error ustctl create event %s for app pid: %d with ret %d",
- ua_event->attr.name, app->pid, ret);
- } else {
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = 0;
- DBG3("UST app create event failed. Application is dead.");
+ DBG3("UST app create event failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ ret = 0;
+ WARN("UST app create event failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app create event '%s' failed with ret %d: pid = %d, sock = %d",
+ ua_event->attr.name, ret, app->pid,
+ app->sock);
}
goto error;
}
ua_event->handle = ua_event->obj->handle;
- DBG2("UST app event %s created successfully for pid:%d object: %p",
+ DBG2("UST app event %s created successfully for pid:%d object = %p",
ua_event->attr.name, app->pid, ua_event->obj);
health_code_update();
event_notifier->event.instrumentation = LTTNG_UST_ABI_TRACEPOINT;
ret = lttng_strncpy(event_notifier->event.name, pattern,
- LTTNG_UST_ABI_SYM_NAME_LEN - 1);
+ sizeof(event_notifier->event.name));
if (ret) {
ERR("Failed to copy event rule pattern to notifier: pattern = '%s' ",
pattern);
&ua_event_notifier_rule->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Error ustctl create event notifier: name = '%s', app = '%s' (ppid: %d), ret = %d",
- event_notifier.event.name, app->name,
- app->ppid, ret);
- } else {
- /*
- * This is normal behavior, an application can die
- * during the creation process. Don't report an error so
- * the execution can continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = 0;
- DBG3("UST app create event notifier failed (application is dead): app = '%s' (ppid = %d)",
- app->name, app->ppid);
+ DBG3("UST app create event notifier failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ ret = 0;
+ WARN("UST app create event notifier failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app create event notifier '%s' failed with ret %d: pid = %d, sock = %d",
+ event_notifier.event.name, ret, app->pid,
+ app->sock);
}
-
goto error;
}
ua_event_notifier_rule->handle = ua_event_notifier_rule->obj->handle;
- DBG2("UST app event notifier %s created successfully: app = '%s' (ppid: %d), object: %p",
- event_notifier.event.name, app->name, app->ppid,
+ DBG2("UST app event notifier %s created successfully: app = '%s': pid = %d), object = %p",
+ event_notifier.event.name, app->name, app->pid,
ua_event_notifier_rule->obj);
health_code_update();
switch (ua_sess->buffer_type) {
case LTTNG_BUFFER_PER_PID:
ret = snprintf(ua_sess->path, sizeof(ua_sess->path),
- DEFAULT_UST_TRACE_PID_PATH "/%s-%d-%s", app->name, app->pid,
- datetime);
+ DEFAULT_UST_TRACE_PID_PATH "/%s-%d-%s-%ld", app->name, app->pid,
+ datetime, ua_sess->id);
break;
case LTTNG_BUFFER_PER_UID:
ret = snprintf(ua_sess->path, sizeof(ua_sess->path),
switch (ua_sess->buffer_type) {
case LTTNG_BUFFER_PER_PID:
ret = snprintf(tmp_shm_path, sizeof(tmp_shm_path),
- "/" DEFAULT_UST_TRACE_PID_PATH "/%s-%d-%s",
- app->name, app->pid, datetime);
+ "/" DEFAULT_UST_TRACE_PID_PATH "/%s-%d-%s-%ld",
+ app->name, app->pid, datetime, ua_sess->id);
break;
case LTTNG_BUFFER_PER_UID:
ret = snprintf(tmp_shm_path, sizeof(tmp_shm_path),
ret = lttng_ust_ctl_create_session(app->sock);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Creating session for app pid %d with ret %d",
- app->pid, ret);
- } else {
- DBG("UST app creating session failed. Application is dead");
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally. This will get flagged ENOTCONN and the
- * caller will handle it.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG("UST app creating session failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
ret = 0;
+ } else if (ret == -EAGAIN) {
+ DBG("UST app creating session failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ ret = 0;
+ } else {
+ ERR("UST app creating session failed with ret %d: pid = %d, sock =%d",
+ ret, app->pid, app->sock);
}
delete_ust_app_session(-1, ua_sess, app);
if (ret != -ENOMEM) {
assert(reg_stream);
assert(stream);
- /* Reserve the amount of file descriptor we need. */
+ /* Duplicating a stream requires 2 new fds. Reserve them. */
ret = lttng_fd_get(LTTNG_FD_APPS, 2);
if (ret < 0) {
ERR("Exhausted number of available FD upon duplicate stream");
assert(buf_reg_chan);
assert(ua_chan);
- /* Need two fds for the channel. */
+ /* Duplicating a channel requires 1 new fd. Reserve it. */
ret = lttng_fd_get(LTTNG_FD_APPS, 1);
if (ret < 0) {
ERR("Exhausted number of available FD upon duplicate channel");
if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = -ENOTCONN; /* Caused by app exiting. */
goto error;
+ } else if (ret == -EAGAIN) {
+ /* Caused by timeout. */
+ WARN("Communication with application %d timed out on send_channel for channel \"%s\" of session \"%" PRIu64 "\".",
+ app->pid, ua_chan->name, ua_sess->tracing_id);
+ /* Treat this the same way as an application that is exiting. */
+ ret = -ENOTCONN;
+ goto error;
} else if (ret < 0) {
goto error;
}
/* Send all streams to application. */
pthread_mutex_lock(&buf_reg_chan->stream_list_lock);
cds_list_for_each_entry(reg_stream, &buf_reg_chan->streams, lnode) {
- struct ust_app_stream stream;
+ struct ust_app_stream stream = {};
ret = duplicate_stream_object(reg_stream, &stream);
if (ret < 0) {
ret = ust_consumer_send_stream_to_ust(app, ua_chan, &stream);
if (ret < 0) {
- (void) release_ust_app_stream(-1, &stream, app);
if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
ret = -ENOTCONN; /* Caused by app exiting. */
+ } else if (ret == -EAGAIN) {
+ /*
+ * Caused by timeout.
+ * Treat this the same way as an application
+ * that is exiting.
+ */
+ WARN("Communication with application %d timed out on send_stream for stream of channel \"%s\" of session \"%" PRIu64 "\".",
+ app->pid,
+ ua_chan->name,
+ ua_sess->tracing_id);
+ ret = -ENOTCONN;
}
+ (void) release_ust_app_stream(-1, &stream, app);
goto error_stream_unlock;
}
add_unique_ust_app_event(ua_chan, ua_event);
- DBG2("UST app create event completed: app = '%s' (ppid: %d)",
- app->name, app->ppid);
+ DBG2("UST app create event completed: app = '%s' pid = %d",
+ app->name, app->pid);
end:
return ret;
lttng_ht_add_unique_u64(app->token_to_event_notifier_rule_ht,
&ua_event_notifier_rule->node);
- DBG2("UST app create token event rule completed: app = '%s' (ppid: %d), token = %" PRIu64,
- app->name, app->ppid, lttng_trigger_get_tracer_token(trigger));
+ DBG2("UST app create token event rule completed: app = '%s', pid = %d), token = %" PRIu64,
+ app->name, app->pid, lttng_trigger_get_tracer_token(trigger));
goto end;
}
/*
- * Return ust app pointer or NULL if not found. RCU read side lock MUST be
+ * Check if a ust_app with a given pid is present. RCU read side lock MUST be
* acquired before calling this function.
*/
-struct ust_app *ust_app_find_by_pid(pid_t pid)
+bool ust_app_with_pid_exists(pid_t pid)
{
- struct ust_app *app = NULL;
struct lttng_ht_node_ulong *node;
struct lttng_ht_iter iter;
+ bool present = false;
lttng_ht_lookup(ust_app_ht, (void *)((unsigned long) pid), &iter);
node = lttng_ht_iter_get_node_ulong(&iter);
if (node == NULL) {
- DBG2("UST app no found with pid %d", pid);
- goto error;
+ DBG2("UST app not found with pid %d", pid);
+ goto end;
}
- DBG2("Found UST app by pid %d", pid);
-
- app = caa_container_of(node, struct ust_app, pid_n);
-
-error:
- return app;
+ present = true;
+end:
+ return present;
}
/*
*/
ret = lttng_fd_get(LTTNG_FD_APPS, 2);
if (ret) {
- ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s' (ppid: %d)",
- msg->name, (int) msg->ppid);
+ ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s', pid = %d",
+ msg->name, (int) msg->pid);
goto error;
}
event_notifier_event_source_pipe = lttng_pipe_open(FD_CLOEXEC);
if (!event_notifier_event_source_pipe) {
- PERROR("Failed to open application event source pipe: '%s' (ppid = %d)",
- msg->name, msg->ppid);
+ PERROR("Failed to open application event source pipe: '%s' (pid = %d)",
+ msg->name, msg->pid);
goto error;
}
rcu_read_lock();
/*
- * On a re-registration, we want to kick out the previous registration of
- * that pid
+ * Accept duplicate pid to accommodate the possibility of multiple
+ * lttng-ust per process. Both lttng-ust instance will register
+ * themselves and be unique in term of socket.
+ * All operations on pid should expects that multiple "app" be present
+ * with the same pid.
*/
- lttng_ht_add_replace_ulong(ust_app_ht, &app->pid_n);
+ lttng_ht_add_ulong(ust_app_ht, &app->pid_n);
/*
* The socket _should_ be unique until _we_ call close. So, a add_unique
lttng_ht_node_init_ulong(&app->notify_sock_n, app->notify_sock);
lttng_ht_add_unique_ulong(ust_app_ht_by_notify_sock, &app->notify_sock_n);
- DBG("App registered with pid:%d ppid:%d uid:%d gid:%d sock:%d name:%s "
- "notify_sock:%d (version %d.%d)", app->pid, app->ppid, app->uid,
+ DBG("App registered with pid:%d ppid:%d uid:%d gid:%d sock =%d name:%s "
+ "notify_sock =%d (version %d.%d)", app->pid, app->ppid, app->uid,
app->gid, app->sock, app->name, app->notify_sock, app->v_major,
app->v_minor);
ret = lttng_ust_ctl_tracer_version(app->sock, &app->version);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
- ERR("UST app %d version failed with ret %d", app->sock, ret);
+ if (ret == -LTTNG_UST_ERR_EXITING || ret == -EPIPE) {
+ DBG3("UST app version failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app version failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
} else {
- DBG3("UST app %d version failed. Application is dead", app->sock);
+ ERR("UST app version failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
}
event_pipe_write_fd, &event_notifier_group);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
- ERR("Failed to create application event notifier group: ret = %d, app socket fd = %d, event_pipe_write_fd = %d",
- ret, app->sock, event_pipe_write_fd);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ ret = 0;
+ DBG3("UST app create event notifier group failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ ret = 0;
+ WARN("UST app create event notifier group failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
} else {
- DBG("Failed to create application event notifier group (application is dead): app socket fd = %d",
- app->sock);
+ ERR("UST app create event notifier group failed with ret %d: pid = %d, sock = %d, event_pipe_write_fd: %d",
+ ret, app->pid, app->sock, event_pipe_write_fd);
}
-
goto error;
}
ret = lttng_pipe_write_close(app->event_notifier_group.event_pipe);
if (ret) {
- ERR("Failed to close write end of the application's event source pipe: app = '%s' (ppid = %d)",
- app->name, app->ppid);
+ ERR("Failed to close write end of the application's event source pipe: app = '%s' (pid = %d)",
+ app->name, app->pid);
goto error;
}
case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK:
break;
case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_UNSUPPORTED:
- DBG3("Failed to setup event notifier error accounting (application does not support notifier error accounting): app socket fd = %d, app name = '%s', app ppid = %d",
- app->sock, app->name, (int) app->ppid);
+ DBG3("Failed to setup event notifier error accounting (application does not support notifier error accounting): app socket fd = %d, app name = '%s', app pid = %d",
+ app->sock, app->name, (int) app->pid);
ret = 0;
goto error_accounting;
case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_APP_DEAD:
- DBG3("Failed to setup event notifier error accounting (application is dead): app socket fd = %d, app name = '%s', app ppid = %d",
- app->sock, app->name, (int) app->ppid);
+ DBG3("Failed to setup event notifier error accounting (application is dead): app socket fd = %d, app name = '%s', app pid = %d",
+ app->sock, app->name, (int) app->pid);
ret = 0;
goto error_accounting;
default:
iter.iter.node = <a->notify_sock_n.node;
(void) lttng_ht_del(ust_app_ht_by_notify_sock, &iter);
- /*
- * Ignore return value since the node might have been removed before by an
- * add replace during app registration because the PID can be reassigned by
- * the OS.
- */
iter.iter.node = <a->pid_n.node;
ret = lttng_ht_del(ust_app_ht, &iter);
- if (ret) {
- DBG3("Unregister app by PID %d failed. This can happen on pid reuse",
- lta->pid);
- }
+ assert(!ret);
/* Free memory */
call_rcu(<a->pid_n.head, delete_ust_app_rcu);
app->sock, ret);
} else {
DBG3("UST app tp list get failed. Application is dead");
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally. Continue normal execution.
- */
break;
}
free(tmp_event);
}
ret = lttng_ust_ctl_release_handle(app->sock, handle);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
- ERR("Error releasing app handle for app %d with ret %d", app->sock, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("Error releasing app handle. Application died: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("Error releasing app handle. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("Error releasing app handle with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
+ }
}
}
app->sock, ret);
} else {
DBG3("UST app tp list field failed. Application is dead");
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally. Reset list and count for next app.
- */
break;
}
free(tmp_event);
ret = lttng_ust_ctl_start_session(app->sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Error starting tracing for app pid: %d (ret: %d)",
- app->pid, ret);
- } else {
- DBG("UST app start session failed. Application is dead.");
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app start session failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ pthread_mutex_unlock(&ua_sess->lock);
+ goto end;
+ } else if (ret == -EAGAIN) {
+ WARN("UST app start session failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
pthread_mutex_unlock(&ua_sess->lock);
goto end;
+
+ } else {
+ ERR("UST app start session failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
goto error_unlock;
}
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_wait_quiescent(app->sock);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app wait quiescent failed for app pid %d ret %d",
- app->pid, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app wait quiescent failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app wait quiescent failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app wait quiescent failed with ret %d: pid %d, sock = %d",
+ ret, app->pid, app->sock);
+ }
}
end:
ret = lttng_ust_ctl_stop_session(app->sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("Error stopping tracing for app pid: %d (ret: %d)",
- app->pid, ret);
- } else {
- DBG("UST app stop session failed. Application is dead.");
- /*
- * This is normal behavior, an application can die during the
- * creation process. Don't report an error so the execution can
- * continue normally.
- */
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app stop session failed. Application is dead: pid = %d, sock = %d",
+ app->pid, app->sock);
+ goto end_unlock;
+ } else if (ret == -EAGAIN) {
+ WARN("UST app stop session failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
goto end_unlock;
+
+ } else {
+ ERR("UST app stop session failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
goto error_rcu_unlock;
}
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_wait_quiescent(app->sock);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app wait quiescent failed for app pid %d ret %d",
- app->pid, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app wait quiescent failed. Application is dead: pid= %d, sock = %d)",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app wait quiescent failed. Communication time out: pid= %d, sock = %d)",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app wait quiescent failed with ret %d: pid= %d, sock = %d)",
+ ret, app->pid, app->sock);
+ }
}
health_code_update();
pthread_mutex_lock(&app->sock_lock);
ret = lttng_ust_ctl_wait_quiescent(app->sock);
pthread_mutex_unlock(&app->sock_lock);
- if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app wait quiescent failed for app pid %d ret %d",
- app->pid, ret);
+ if (ret < 0) {
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app wait quiescent failed. Application is dead: pid= %d, sock = %d)",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app wait quiescent failed. Communication time out: pid= %d, sock = %d)",
+ app->pid, app->sock);
+ } else {
+ ERR("UST app wait quiescent failed with ret %d: pid= %d, sock = %d)",
+ ret, app->pid, app->sock);
+ }
}
end:
rcu_read_unlock();
ret = find_or_create_ust_app_session(usess, app, &ua_sess, NULL);
if (ret < 0) {
/* Tracer is probably gone or ENOMEM. */
- goto error;
+ if (ua_sess) {
+ destroy_app_session(app, ua_sess);
+ }
+ goto end;
}
assert(ua_sess);
pthread_mutex_lock(&ua_sess->lock);
if (ua_sess->deleted) {
- pthread_mutex_unlock(&ua_sess->lock);
- goto end;
+ goto deleted_session;
}
rcu_read_lock();
*/
ret = create_ust_app_metadata(ua_sess, app, usess->consumer);
if (ret < 0) {
- goto error_unlock;
+ ERR("Metadata creation failed for app sock %d for session id %" PRIu64,
+ app->sock, usess->id);
}
rcu_read_unlock();
-end:
- pthread_mutex_unlock(&ua_sess->lock);
- /* Everything went well at this point. */
- return;
-
-error_unlock:
- rcu_read_unlock();
+deleted_session:
pthread_mutex_unlock(&ua_sess->lock);
-error:
- if (ua_sess) {
- destroy_app_session(app, ua_sess);
- }
+end:
return;
}
*/
void ust_app_global_update_event_notifier_rules(struct ust_app *app)
{
- DBG2("UST application global event notifier rules update: app = '%s' (ppid: %d)",
- app->name, app->ppid);
+ DBG2("UST application global event notifier rules update: app = '%s', pid = %d)",
+ app->name, app->pid);
if (!app->compatible || !ust_app_supports_notifiers(app)) {
return;
}
if (app->event_notifier_group.object == NULL) {
- WARN("UST app global update of event notifiers for app skipped since communication handle is null: app = '%s' (ppid: %d)",
- app->name, app->ppid);
+ WARN("UST app global update of event notifiers for app skipped since communication handle is null: app = '%s' pid = %d)",
+ app->name, app->pid);
return;
}
return ua_chan;
}
+/*
+ * Fixup legacy context fields for comparison:
+ * - legacy array becomes array_nestable,
+ * - legacy struct becomes struct_nestable,
+ * - legacy variant becomes variant_nestable,
+ * legacy sequences are not emitted in LTTng-UST contexts.
+ */
+static int ust_app_fixup_legacy_context_fields(size_t *_nr_fields,
+ struct lttng_ust_ctl_field **_fields)
+{
+ struct lttng_ust_ctl_field *fields = *_fields, *new_fields = NULL;
+ size_t nr_fields = *_nr_fields, new_nr_fields = 0, i, j;
+ bool found = false;
+ int ret = 0;
+
+ for (i = 0; i < nr_fields; i++) {
+ const struct lttng_ust_ctl_field *field = &fields[i];
+
+ switch (field->type.atype) {
+ case lttng_ust_ctl_atype_sequence:
+ ERR("Unexpected legacy sequence context.");
+ ret = -EINVAL;
+ goto end;
+ case lttng_ust_ctl_atype_array:
+ switch (field->type.u.legacy.array.elem_type.atype) {
+ case lttng_ust_ctl_atype_integer:
+ break;
+ default:
+ ERR("Unexpected legacy array element type in context.");
+ ret = -EINVAL;
+ goto end;
+ }
+ found = true;
+ /* One field for array_nested, one field for elem type. */
+ new_nr_fields += 2;
+ break;
+
+ case lttng_ust_ctl_atype_struct: /* Fallthrough */
+ case lttng_ust_ctl_atype_variant:
+ found = true;
+ new_nr_fields++;
+ break;
+ default:
+ new_nr_fields++;
+ break;
+ }
+ }
+ if (!found) {
+ goto end;
+ }
+ new_fields = (struct lttng_ust_ctl_field *) zmalloc(sizeof(*new_fields) * new_nr_fields);
+ if (!new_fields) {
+ ret = -ENOMEM;
+ goto end;
+ }
+ for (i = 0, j = 0; i < nr_fields; i++, j++) {
+ const struct lttng_ust_ctl_field *field = &fields[i];
+ struct lttng_ust_ctl_field *new_field = &new_fields[j];
+
+ switch (field->type.atype) {
+ case lttng_ust_ctl_atype_array:
+ /* One field for array_nested, one field for elem type. */
+ strncpy(new_field->name, field->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
+ new_field->type.atype = lttng_ust_ctl_atype_array_nestable;
+ new_field->type.u.array_nestable.length = field->type.u.legacy.array.length;
+ new_field->type.u.array_nestable.alignment = 0;
+ new_field = &new_fields[++j]; /* elem type */
+ new_field->type.atype = field->type.u.legacy.array.elem_type.atype;
+ assert(new_field->type.atype == lttng_ust_ctl_atype_integer);
+ new_field->type.u.integer = field->type.u.legacy.array.elem_type.u.basic.integer;
+ break;
+ case lttng_ust_ctl_atype_struct:
+ strncpy(new_field->name, field->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
+ new_field->type.atype = lttng_ust_ctl_atype_struct_nestable;
+ new_field->type.u.struct_nestable.nr_fields = field->type.u.legacy._struct.nr_fields;
+ new_field->type.u.struct_nestable.alignment = 0;
+ break;
+ case lttng_ust_ctl_atype_variant:
+ strncpy(new_field->name, field->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
+ new_field->type.atype = lttng_ust_ctl_atype_variant_nestable;
+ new_field->type.u.variant_nestable.nr_choices = field->type.u.legacy.variant.nr_choices;
+ strncpy(new_field->type.u.variant_nestable.tag_name,
+ field->type.u.legacy.variant.tag_name,
+ LTTNG_UST_ABI_SYM_NAME_LEN - 1);
+ new_field->type.u.variant_nestable.alignment = 0;
+ break;
+ default:
+ *new_field = *field;
+ break;
+ }
+ }
+ free(fields);
+ *_fields = new_fields;
+ *_nr_fields = new_nr_fields;
+end:
+ return ret;
+}
+
/*
* Reply to a register channel notification from an application on the notify
* socket. The channel metadata is also created.
int ret, ret_code = 0;
uint32_t chan_id;
uint64_t chan_reg_key;
- enum lttng_ust_ctl_channel_header type;
+ enum lttng_ust_ctl_channel_header type = LTTNG_UST_CTL_CHANNEL_HEADER_UNKNOWN;
struct ust_app *app;
struct ust_app_channel *ua_chan;
struct ust_app_session *ua_sess;
if (!app) {
DBG("Application socket %d is being torn down. Abort event notify",
sock);
- ret = 0;
+ ret = -1;
goto error_rcu_unlock;
}
ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key);
assert(ust_reg_chan);
+ /* Channel id is set during the object creation. */
+ chan_id = ust_reg_chan->chan_id;
+
+ ret = ust_app_fixup_legacy_context_fields(&nr_fields, &fields);
+ if (ret < 0) {
+ ERR("Registering application channel due to legacy context fields fixup error: pid = %d, sock = %d",
+ app->pid, app->sock);
+ ret_code = -EINVAL;
+ goto reply;
+ }
if (!ust_reg_chan->register_done) {
/*
* TODO: eventually use the registry event count for
} else {
/* Get current already assigned values. */
type = ust_reg_chan->header_type;
+ /*
+ * Validate that the context fields match between
+ * registry and newcoming application.
+ */
+ if (!match_lttng_ust_ctl_field_array(ust_reg_chan->ctx_fields,
+ ust_reg_chan->nr_ctx_fields,
+ fields, nr_fields)) {
+ ERR("Registering application channel due to context field mismatch: pid = %d, sock = %d",
+ app->pid, app->sock);
+ ret_code = -EINVAL;
+ goto reply;
+ }
}
- /* Channel id is set during the object creation. */
- chan_id = ust_reg_chan->chan_id;
/* Append to metadata */
if (!ust_reg_chan->metadata_dumped) {
reply:
DBG3("UST app replying to register channel key %" PRIu64
- " with id %u, type: %d, ret: %d", chan_reg_key, chan_id, type,
+ " with id %u, type = %d, ret = %d", chan_reg_key, chan_id, type,
ret_code);
ret = lttng_ust_ctl_reply_register_channel(sock, chan_id, type, ret_code);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app reply channel failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app reply channel failed. Application died: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app reply channel failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
} else {
- DBG3("UST app reply channel failed. Application died");
+ ERR("UST app reply channel failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
goto error;
}
if (!app) {
DBG("Application socket %d is being torn down. Abort event notify",
sock);
- ret = 0;
+ ret = -1;
goto error_rcu_unlock;
}
*/
ret = lttng_ust_ctl_reply_register_event(sock, event_id, ret_code);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app reply event failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app reply event failed. Application died: pid = %d, sock = %d.",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app reply event failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
} else {
- DBG3("UST app reply event failed. Application died");
+ ERR("UST app reply event failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
/*
* No need to wipe the create event since the application socket will
DBG("Application socket %d is being torn down. Aborting enum registration",
sock);
free(entries);
+ ret = -1;
goto error_rcu_unlock;
}
*/
ret = lttng_ust_ctl_reply_register_enum(sock, enum_id, ret_code);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app reply enum failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app reply enum failed. Application died: pid = %d, sock = %d",
+ app->pid, app->sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app reply enum failed. Communication time out: pid = %d, sock = %d",
+ app->pid, app->sock);
} else {
- DBG3("UST app reply enum failed. Application died");
+ ERR("UST app reply enum failed with ret %d: pid = %d, sock = %d",
+ ret, app->pid, app->sock);
}
/*
* No need to wipe the create enum since the application socket will
ret = lttng_ust_ctl_recv_notify(sock, &cmd);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app recv notify failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app recv notify failed. Application died: sock = %d",
+ sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app recv notify failed. Communication time out: sock = %d",
+ sock);
} else {
- DBG3("UST app recv notify failed. Application died");
+ ERR("UST app recv notify failed with ret %d: sock = %d",
+ ret, sock);
}
goto error;
}
&loglevel_value, &sig, &nr_fields, &fields,
&model_emf_uri);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app recv event failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app recv event failed. Application died: sock = %d",
+ sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app recv event failed. Communication time out: sock = %d",
+ sock);
} else {
- DBG3("UST app recv event failed. Application died");
+ ERR("UST app recv event failed with ret %d: sock = %d",
+ ret, sock);
}
goto error;
}
ret = lttng_ust_ctl_recv_register_channel(sock, &sobjd, &cobjd, &nr_fields,
&fields);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app recv channel failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app recv channel failed. Application died: sock = %d",
+ sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app recv channel failed. Communication time out: sock = %d",
+ sock);
} else {
- DBG3("UST app recv channel failed. Application died");
+ ERR("UST app recv channel failed with ret %d: sock = %d)",
+ ret, sock);
}
goto error;
}
ret = lttng_ust_ctl_recv_register_enum(sock, &sobjd, name,
&entries, &nr_entries);
if (ret < 0) {
- if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app recv enum failed with ret %d", ret);
+ if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) {
+ DBG3("UST app recv enum failed. Application died: sock = %d",
+ sock);
+ } else if (ret == -EAGAIN) {
+ WARN("UST app recv enum failed. Communication time out: sock = %d",
+ sock);
} else {
- DBG3("UST app recv enum failed. Application died");
+ ERR("UST app recv enum failed with ret %d: sock = %d",
+ ret, sock);
}
goto error;
}