projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: sessiond: leak of trace chunk on destruction error
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
cmd.c
diff --git
a/src/bin/lttng-sessiond/cmd.c
b/src/bin/lttng-sessiond/cmd.c
index c17be934af50f6a589b7e1feef51fddbd70dbcea..71c0789b3421c5ff4ef9bfc0fa8de354b9104f61 100644
(file)
--- a/
src/bin/lttng-sessiond/cmd.c
+++ b/
src/bin/lttng-sessiond/cmd.c
@@
-73,6
+73,11
@@
struct cmd_destroy_session_reply_context {
int reply_sock_fd;
bool implicit_rotation_on_destroy;
struct cmd_destroy_session_reply_context {
int reply_sock_fd;
bool implicit_rotation_on_destroy;
+ /*
+ * Indicates whether or not an error occurred while launching the
+ * destruction of a session.
+ */
+ enum lttng_error_code destruction_status;
};
static enum lttng_error_code wait_on_path(void *path);
};
static enum lttng_error_code wait_on_path(void *path);
@@
-107,7
+112,7
@@
static uint64_t relayd_net_seq_idx;
static int validate_ust_event_name(const char *);
static int cmd_enable_event_internal(struct ltt_session *session,
static int validate_ust_event_name(const char *);
static int cmd_enable_event_internal(struct ltt_session *session,
- struct lttng_domain *domain,
+
const
struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
@@
-1482,27
+1487,29
@@
error:
* The wpipe arguments is used as a notifier for the kernel thread.
*/
int cmd_enable_channel(struct ltt_session *session,
* The wpipe arguments is used as a notifier for the kernel thread.
*/
int cmd_enable_channel(struct ltt_session *session,
-
struct lttng_domain *domain, struct lttng_channel *
attr, int wpipe)
+
const struct lttng_domain *domain, const struct lttng_channel *_
attr, int wpipe)
{
int ret;
struct ltt_ust_session *usess = session->ust_session;
struct lttng_ht *chan_ht;
size_t len;
{
int ret;
struct ltt_ust_session *usess = session->ust_session;
struct lttng_ht *chan_ht;
size_t len;
+ struct lttng_channel attr;
assert(session);
assert(session);
- assert(attr);
+ assert(
_
attr);
assert(domain);
assert(domain);
- len = lttng_strnlen(attr->name, sizeof(attr->name));
+ attr = *_attr;
+ len = lttng_strnlen(attr.name, sizeof(attr.name));
/* Validate channel name */
/* Validate channel name */
- if (attr
->
name[0] == '.' ||
- memchr(attr
->
name, '/', len) != NULL) {
+ if (attr
.
name[0] == '.' ||
+ memchr(attr
.
name, '/', len) != NULL) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto end;
}
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto end;
}
- DBG("Enabling channel %s for session %s", attr
->
name, session->name);
+ DBG("Enabling channel %s for session %s", attr
.
name, session->name);
rcu_read_lock();
rcu_read_lock();
@@
-1521,8
+1528,8
@@
int cmd_enable_channel(struct ltt_session *session,
* beacons for inactive streams.
*/
if (session->live_timer > 0) {
* beacons for inactive streams.
*/
if (session->live_timer > 0) {
- attr
->
attr.live_timer_interval = session->live_timer;
- attr
->
attr.switch_timer_interval = 0;
+ attr
.
attr.live_timer_interval = session->live_timer;
+ attr
.
attr.switch_timer_interval = 0;
}
/* Check for feature support */
}
/* Check for feature support */
@@
-1534,8
+1541,8
@@
int cmd_enable_channel(struct ltt_session *session,
WARN("Kernel tracer does not support buffer monitoring. "
"Setting the monitor interval timer to 0 "
"(disabled) for channel '%s' of session '%s'",
WARN("Kernel tracer does not support buffer monitoring. "
"Setting the monitor interval timer to 0 "
"(disabled) for channel '%s' of session '%s'",
- attr
->
name, session->name);
- lttng_channel_set_monitor_timer_interval(attr, 0);
+ attr
.
name, session->name);
+ lttng_channel_set_monitor_timer_interval(
&
attr, 0);
}
break;
}
}
break;
}
@@
-1560,16
+1567,16
@@
int cmd_enable_channel(struct ltt_session *session,
{
struct ltt_kernel_channel *kchan;
{
struct ltt_kernel_channel *kchan;
- kchan = trace_kernel_get_channel_by_name(attr
->
name,
+ kchan = trace_kernel_get_channel_by_name(attr
.
name,
session->kernel_session);
if (kchan == NULL) {
if (session->snapshot.nb_output > 0 ||
session->snapshot_mode) {
/* Enforce mmap output for snapshot sessions. */
session->kernel_session);
if (kchan == NULL) {
if (session->snapshot.nb_output > 0 ||
session->snapshot_mode) {
/* Enforce mmap output for snapshot sessions. */
- attr
->
attr.output = LTTNG_EVENT_MMAP;
+ attr
.
attr.output = LTTNG_EVENT_MMAP;
}
}
- ret = channel_kernel_create(session->kernel_session, attr, wpipe);
- if (attr
->
name[0] != '\0') {
+ ret = channel_kernel_create(session->kernel_session,
&
attr, wpipe);
+ if (attr
.
name[0] != '\0') {
session->kernel_session->has_non_default_channel = 1;
}
} else {
session->kernel_session->has_non_default_channel = 1;
}
} else {
@@
-1599,19
+1606,19
@@
int cmd_enable_channel(struct ltt_session *session,
* adhered to.
*/
if (domain->type == LTTNG_DOMAIN_JUL) {
* adhered to.
*/
if (domain->type == LTTNG_DOMAIN_JUL) {
- if (strncmp(attr
->
name, DEFAULT_JUL_CHANNEL_NAME,
+ if (strncmp(attr
.
name, DEFAULT_JUL_CHANNEL_NAME,
LTTNG_SYMBOL_NAME_LEN)) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto error;
}
} else if (domain->type == LTTNG_DOMAIN_LOG4J) {
LTTNG_SYMBOL_NAME_LEN)) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto error;
}
} else if (domain->type == LTTNG_DOMAIN_LOG4J) {
- if (strncmp(attr
->
name, DEFAULT_LOG4J_CHANNEL_NAME,
+ if (strncmp(attr
.
name, DEFAULT_LOG4J_CHANNEL_NAME,
LTTNG_SYMBOL_NAME_LEN)) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto error;
}
} else if (domain->type == LTTNG_DOMAIN_PYTHON) {
LTTNG_SYMBOL_NAME_LEN)) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto error;
}
} else if (domain->type == LTTNG_DOMAIN_PYTHON) {
- if (strncmp(attr
->
name, DEFAULT_PYTHON_CHANNEL_NAME,
+ if (strncmp(attr
.
name, DEFAULT_PYTHON_CHANNEL_NAME,
LTTNG_SYMBOL_NAME_LEN)) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto error;
LTTNG_SYMBOL_NAME_LEN)) {
ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
goto error;
@@
-1620,10
+1627,10
@@
int cmd_enable_channel(struct ltt_session *session,
chan_ht = usess->domain_global.channels;
chan_ht = usess->domain_global.channels;
- uchan = trace_ust_find_channel_by_name(chan_ht, attr
->
name);
+ uchan = trace_ust_find_channel_by_name(chan_ht, attr
.
name);
if (uchan == NULL) {
if (uchan == NULL) {
- ret = channel_ust_create(usess, attr, domain->buf_type);
- if (attr
->
name[0] != '\0') {
+ ret = channel_ust_create(usess,
&
attr, domain->buf_type);
+ if (attr
.
name[0] != '\0') {
usess->has_non_default_channel = 1;
}
} else {
usess->has_non_default_channel = 1;
}
} else {
@@
-1636,7
+1643,7
@@
int cmd_enable_channel(struct ltt_session *session,
goto error;
}
goto error;
}
- if (ret == LTTNG_OK && attr
->
attr.output != LTTNG_EVENT_MMAP) {
+ if (ret == LTTNG_OK && attr
.
attr.output != LTTNG_EVENT_MMAP) {
session->has_non_mmap_channel = true;
}
error:
session->has_non_mmap_channel = true;
}
error:
@@
-1649,11
+1656,11
@@
end:
* Command LTTNG_DISABLE_EVENT processed by the client thread.
*/
int cmd_disable_event(struct ltt_session *session,
* Command LTTNG_DISABLE_EVENT processed by the client thread.
*/
int cmd_disable_event(struct ltt_session *session,
- enum lttng_domain_type domain, char *channel_name,
- struct lttng_event *event)
+ enum lttng_domain_type domain, c
onst c
har *channel_name,
+
const
struct lttng_event *event)
{
int ret;
{
int ret;
- char *event_name;
+ c
onst c
har *event_name;
DBG("Disable event command for event \'%s\'", event->name);
DBG("Disable event command for event \'%s\'", event->name);
@@
-1826,7
+1833,7
@@
error:
* Command LTTNG_ADD_CONTEXT processed by the client thread.
*/
int cmd_add_context(struct ltt_session *session, enum lttng_domain_type domain,
* Command LTTNG_ADD_CONTEXT processed by the client thread.
*/
int cmd_add_context(struct ltt_session *session, enum lttng_domain_type domain,
- char *channel_name, struct lttng_event_context *ctx, int kwpipe)
+ char *channel_name,
const
struct lttng_event_context *ctx, int kwpipe)
{
int ret, chan_kern_created = 0, chan_ust_created = 0;
char *app_ctx_provider_name = NULL, *app_ctx_name = NULL;
{
int ret, chan_kern_created = 0, chan_ust_created = 0;
char *app_ctx_provider_name = NULL, *app_ctx_name = NULL;
@@
-1997,7
+2004,7
@@
end:
* enable the events through which all "agent" events are funeled.
*/
static int _cmd_enable_event(struct ltt_session *session,
* enable the events through which all "agent" events are funeled.
*/
static int _cmd_enable_event(struct ltt_session *session,
- struct lttng_domain *domain,
+
const
struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
@@
-2394,7
+2401,8
@@
error:
* Command LTTNG_ENABLE_EVENT processed by the client thread.
* We own filter, exclusion, and filter_expression.
*/
* Command LTTNG_ENABLE_EVENT processed by the client thread.
* We own filter, exclusion, and filter_expression.
*/
-int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
+int cmd_enable_event(struct ltt_session *session,
+ const struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
@@
-2411,7
+2419,7
@@
int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
* reserved names.
*/
static int cmd_enable_event_internal(struct ltt_session *session,
* reserved names.
*/
static int cmd_enable_event_internal(struct ltt_session *session,
- struct lttng_domain *domain,
+
const
struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
char *channel_name, struct lttng_event *event,
char *filter_expression,
struct lttng_filter_bytecode *filter,
@@
-3067,7
+3075,7
@@
void cmd_destroy_session_reply(const struct ltt_session *session,
struct lttng_trace_archive_location *location = NULL;
struct lttcomm_lttng_msg llm = {
.cmd_type = LTTNG_DESTROY_SESSION,
struct lttng_trace_archive_location *location = NULL;
struct lttcomm_lttng_msg llm = {
.cmd_type = LTTNG_DESTROY_SESSION,
- .ret_code =
LTTNG_OK
,
+ .ret_code =
reply_context->destruction_status
,
.pid = UINT32_MAX,
.cmd_header_size =
sizeof(struct lttcomm_session_destroy_command_header),
.pid = UINT32_MAX,
.cmd_header_size =
sizeof(struct lttcomm_session_destroy_command_header),
@@
-3149,6
+3157,7
@@
int cmd_destroy_session(struct ltt_session *session,
int *sock_fd)
{
int ret;
int *sock_fd)
{
int ret;
+ enum lttng_error_code destruction_last_error = LTTNG_OK;
struct cmd_destroy_session_reply_context *reply_context = NULL;
if (sock_fd) {
struct cmd_destroy_session_reply_context *reply_context = NULL;
if (sock_fd) {
@@
-3173,6
+3182,7
@@
int cmd_destroy_session(struct ltt_session *session,
/* Carry on with the destruction of the session. */
ERR("Failed to stop session \"%s\" as part of its destruction: %s",
session->name, lttng_strerror(-ret));
/* Carry on with the destruction of the session. */
ERR("Failed to stop session \"%s\" as part of its destruction: %s",
session->name, lttng_strerror(-ret));
+ destruction_last_error = ret;
}
}
}
}
@@
-3181,6
+3191,7
@@
int cmd_destroy_session(struct ltt_session *session,
session)) {
ERR("Failed to stop the \"rotation schedule\" timer of session %s",
session->name);
session)) {
ERR("Failed to stop the \"rotation schedule\" timer of session %s",
session->name);
+ destruction_last_error = LTTNG_ERR_TIMER_STOP_ERROR;
}
}
}
}
@@
-3200,6
+3211,7
@@
int cmd_destroy_session(struct ltt_session *session,
if (ret != LTTNG_OK) {
ERR("Failed to perform an implicit rotation as part of the destruction of session \"%s\": %s",
session->name, lttng_strerror(-ret));
if (ret != LTTNG_OK) {
ERR("Failed to perform an implicit rotation as part of the destruction of session \"%s\": %s",
session->name, lttng_strerror(-ret));
+ destruction_last_error = -ret;
}
if (reply_context) {
reply_context->implicit_rotation_on_destroy = true;
}
if (reply_context) {
reply_context->implicit_rotation_on_destroy = true;
@@
-3218,6
+3230,7
@@
int cmd_destroy_session(struct ltt_session *session,
if (ret != LTTNG_OK) {
ERR("Failed to perform a quiet rotation as part of the destruction of session \"%s\": %s",
session->name, lttng_strerror(-ret));
if (ret != LTTNG_OK) {
ERR("Failed to perform a quiet rotation as part of the destruction of session \"%s\": %s",
session->name, lttng_strerror(-ret));
+ destruction_last_error = -ret;
}
}
}
}
@@
-3282,6
+3295,7
@@
int cmd_destroy_session(struct ltt_session *session,
*/
session_destroy(session);
if (reply_context) {
*/
session_destroy(session);
if (reply_context) {
+ reply_context->destruction_status = destruction_last_error;
ret = session_add_destroy_notifier(session,
cmd_destroy_session_reply,
(void *) reply_context);
ret = session_add_destroy_notifier(session,
cmd_destroy_session_reply,
(void *) reply_context);
@@
-3712,7
+3726,7
@@
error:
* Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_snapshot_add_output(struct ltt_session *session,
* Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_snapshot_add_output(struct ltt_session *session,
- struct lttng_snapshot_output *output, uint32_t *id)
+
const
struct lttng_snapshot_output *output, uint32_t *id)
{
int ret;
struct snapshot_output *new_output;
{
int ret;
struct snapshot_output *new_output;
@@
-3780,7
+3794,7
@@
error:
* Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_snapshot_del_output(struct ltt_session *session,
* Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_snapshot_del_output(struct ltt_session *session,
- struct lttng_snapshot_output *output)
+
const
struct lttng_snapshot_output *output)
{
int ret;
struct snapshot_output *sout = NULL;
{
int ret;
struct snapshot_output *sout = NULL;
@@
-4608,7
+4622,7
@@
error:
* Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_snapshot_record(struct ltt_session *session,
* Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_snapshot_record(struct ltt_session *session,
- struct lttng_snapshot_output *output, int wait)
+
const
struct lttng_snapshot_output *output, int wait)
{
enum lttng_error_code cmd_ret = LTTNG_OK;
int ret;
{
enum lttng_error_code cmd_ret = LTTNG_OK;
int ret;
@@
-4774,6
+4788,8
@@
int cmd_rotate_session(struct ltt_session *session,
struct lttng_trace_chunk *chunk_being_archived = NULL;
struct lttng_trace_chunk *new_trace_chunk = NULL;
enum lttng_trace_chunk_status chunk_status;
struct lttng_trace_chunk *chunk_being_archived = NULL;
struct lttng_trace_chunk *new_trace_chunk = NULL;
enum lttng_trace_chunk_status chunk_status;
+ bool failed_to_rotate = false;
+ enum lttng_error_code rotation_fail_code = LTTNG_OK;
assert(session);
assert(session);
@@
-4831,7
+4847,13
@@
int cmd_rotate_session(struct ltt_session *session,
}
}
}
}
- /* The current trace chunk becomes the chunk being archived. */
+ /*
+ * The current trace chunk becomes the chunk being archived.
+ *
+ * After this point, "chunk_being_archived" must absolutely
+ * be closed on the consumer(s), otherwise it will never be
+ * cleaned-up, which will result in a leak.
+ */
ret = session_set_trace_chunk(session, new_trace_chunk,
&chunk_being_archived);
if (ret) {
ret = session_set_trace_chunk(session, new_trace_chunk,
&chunk_being_archived);
if (ret) {
@@
-4847,13
+4869,15
@@
int cmd_rotate_session(struct ltt_session *session,
if (session->kernel_session) {
cmd_ret = kernel_rotate_session(session);
if (cmd_ret != LTTNG_OK) {
if (session->kernel_session) {
cmd_ret = kernel_rotate_session(session);
if (cmd_ret != LTTNG_OK) {
- goto error;
+ failed_to_rotate = true;
+ rotation_fail_code = cmd_ret;
}
}
if (session->ust_session) {
cmd_ret = ust_app_rotate_session(session);
if (cmd_ret != LTTNG_OK) {
}
}
if (session->ust_session) {
cmd_ret = ust_app_rotate_session(session);
if (cmd_ret != LTTNG_OK) {
- goto error;
+ failed_to_rotate = true;
+ rotation_fail_code = cmd_ret;
}
}
}
}
@@
-4868,6
+4892,11
@@
int cmd_rotate_session(struct ltt_session *session,
goto error;
}
goto error;
}
+ if (failed_to_rotate) {
+ cmd_ret = rotation_fail_code;
+ goto error;
+ }
+
session->quiet_rotation = quiet_rotation;
ret = timer_session_rotation_pending_check_start(session,
DEFAULT_ROTATE_PENDING_TIMER);
session->quiet_rotation = quiet_rotation;
ret = timer_session_rotation_pending_check_start(session,
DEFAULT_ROTATE_PENDING_TIMER);
This page took
0.030783 seconds
and
4
git commands to generate.