projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: acquire stream lock during kernel metadata snapshot
[lttng-tools.git]
/
src
/
common
/
kernel-consumer
/
kernel-consumer.c
diff --git
a/src/common/kernel-consumer/kernel-consumer.c
b/src/common/kernel-consumer/kernel-consumer.c
index 66ae16bc8f09c224ffd3e1130bf9c1fa0ca0fa13..3455f827b6b715c5415bcb3ee11c0d6147a46972 100644
(file)
--- a/
src/common/kernel-consumer/kernel-consumer.c
+++ b/
src/common/kernel-consumer/kernel-consumer.c
@@
-336,7
+336,7
@@
end:
*
* Returns 0 on success, < 0 on error
*/
*
* Returns 0 on success, < 0 on error
*/
-int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
+
static
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
uint64_t relayd_id, struct lttng_consumer_local_data *ctx)
{
int ret, use_relayd = 0;
uint64_t relayd_id, struct lttng_consumer_local_data *ctx)
{
int ret, use_relayd = 0;
@@
-355,11
+355,12
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
if (!metadata_channel) {
ERR("Kernel snapshot metadata not found for key %" PRIu64, key);
ret = -1;
if (!metadata_channel) {
ERR("Kernel snapshot metadata not found for key %" PRIu64, key);
ret = -1;
- goto error;
+ goto error
_no_channel
;
}
metadata_stream = metadata_channel->metadata_stream;
assert(metadata_stream);
}
metadata_stream = metadata_channel->metadata_stream;
assert(metadata_stream);
+ pthread_mutex_lock(&metadata_stream->lock);
/* Flag once that we have a valid relayd for the stream. */
if (relayd_id != (uint64_t) -1ULL) {
/* Flag once that we have a valid relayd for the stream. */
if (relayd_id != (uint64_t) -1ULL) {
@@
-369,7
+370,7
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
if (use_relayd) {
ret = consumer_send_relayd_stream(metadata_stream, path);
if (ret < 0) {
if (use_relayd) {
ret = consumer_send_relayd_stream(metadata_stream, path);
if (ret < 0) {
- goto error;
+ goto error
_snapshot
;
}
} else {
ret = utils_create_stream_file(path, metadata_stream->name,
}
} else {
ret = utils_create_stream_file(path, metadata_stream->name,
@@
-377,7
+378,7
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
metadata_stream->tracefile_count_current,
metadata_stream->uid, metadata_stream->gid, NULL);
if (ret < 0) {
metadata_stream->tracefile_count_current,
metadata_stream->uid, metadata_stream->gid, NULL);
if (ret < 0) {
- goto error;
+ goto error
_snapshot
;
}
metadata_stream->out_fd = ret;
}
}
metadata_stream->out_fd = ret;
}
@@
-390,7
+391,8
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
if (ret_read != -EAGAIN) {
ERR("Kernel snapshot reading metadata subbuffer (ret: %zd)",
ret_read);
if (ret_read != -EAGAIN) {
ERR("Kernel snapshot reading metadata subbuffer (ret: %zd)",
ret_read);
- goto error;
+ ret = ret_read;
+ goto error_snapshot;
}
/* ret_read is negative at this point so we will exit the loop. */
continue;
}
/* ret_read is negative at this point so we will exit the loop. */
continue;
@@
-415,11
+417,12
@@
int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
}
ret = 0;
}
ret = 0;
-
+error_snapshot:
+ pthread_mutex_unlock(&metadata_stream->lock);
cds_list_del(&metadata_stream->send_node);
consumer_stream_destroy(metadata_stream, NULL);
metadata_channel->metadata_stream = NULL;
cds_list_del(&metadata_stream->send_node);
consumer_stream_destroy(metadata_stream, NULL);
metadata_channel->metadata_stream = NULL;
-error:
+error
_no_channel
:
rcu_read_unlock();
return ret;
}
rcu_read_unlock();
return ret;
}
@@
-1151,7
+1154,6
@@
int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
msg.u.rotate_channel.key, ctx);
if (ret < 0) {
ERR("Rotate ready streams failed");
msg.u.rotate_channel.key, ctx);
if (ret < 0) {
ERR("Rotate ready streams failed");
- ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
}
break;
}
break;
@@
-1183,19
+1185,20
@@
int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
}
case LTTNG_CONSUMER_ROTATE_PENDING_RELAY:
{
}
case LTTNG_CONSUMER_ROTATE_PENDING_RELAY:
{
+ int pending;
uint32_t pending_reply;
DBG("Consumer rotate pending on relay for session %" PRIu64,
msg.u.rotate_pending_relay.session_id);
uint32_t pending_reply;
DBG("Consumer rotate pending on relay for session %" PRIu64,
msg.u.rotate_pending_relay.session_id);
-
ret
= lttng_consumer_rotate_pending_relay(
+
pending
= lttng_consumer_rotate_pending_relay(
msg.u.rotate_pending_relay.session_id,
msg.u.rotate_pending_relay.relayd_id,
msg.u.rotate_pending_relay.chunk_id);
msg.u.rotate_pending_relay.session_id,
msg.u.rotate_pending_relay.relayd_id,
msg.u.rotate_pending_relay.chunk_id);
- if (
ret
< 0) {
+ if (
pending
< 0) {
ERR("Rotate pending relay failed");
ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
} else {
ERR("Rotate pending relay failed");
ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
} else {
- pending_reply = !!
ret
;
+ pending_reply = !!
pending
;
}
health_code_update();
}
health_code_update();
@@
-1206,6
+1209,15
@@
int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
goto end_nosignal;
}
goto end_nosignal;
}
+ if (pending < 0) {
+ /*
+ * An error occured while running the command;
+ * don't send the 'pending' flag as the sessiond
+ * will not read it.
+ */
+ break;
+ }
+
/* Send back returned value to session daemon */
ret = lttcomm_send_unix_sock(sock, &pending_reply,
sizeof(pending_reply));
/* Send back returned value to session daemon */
ret = lttcomm_send_unix_sock(sock, &pending_reply,
sizeof(pending_reply));
This page took
0.025553 seconds
and
4
git commands to generate.