projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix deadlock: don't take channel lock in timer
[lttng-tools.git]
/
src
/
common
/
ust-consumer
/
ust-consumer.c
diff --git
a/src/common/ust-consumer/ust-consumer.c
b/src/common/ust-consumer/ust-consumer.c
index e933f9227c9bd48fc0ce46562cd2994565684157..f8c02ee72cf03adf6eeca28548aa4f0aff98afcb 100644
(file)
--- a/
src/common/ust-consumer/ust-consumer.c
+++ b/
src/common/ust-consumer/ust-consumer.c
@@
-757,7
+757,7
@@
static int snapshot_metadata(uint64_t key, char *path, uint64_t relayd_id,
* Ask the sessiond if we have new metadata waiting and update the
* consumer metadata cache.
*/
* Ask the sessiond if we have new metadata waiting and update the
* consumer metadata cache.
*/
- ret = lttng_ustconsumer_request_metadata(ctx, metadata_channel);
+ ret = lttng_ustconsumer_request_metadata(ctx, metadata_channel
, 0
);
if (ret < 0) {
goto error;
}
if (ret < 0) {
goto error;
}
@@
-980,7
+980,8
@@
error:
* Receive the metadata updates from the sessiond.
*/
int lttng_ustconsumer_recv_metadata(int sock, uint64_t key, uint64_t offset,
* Receive the metadata updates from the sessiond.
*/
int lttng_ustconsumer_recv_metadata(int sock, uint64_t key, uint64_t offset,
- uint64_t len, struct lttng_consumer_channel *channel)
+ uint64_t len, struct lttng_consumer_channel *channel,
+ int timer)
{
int ret, ret_code = LTTNG_OK;
char *metadata_str;
{
int ret, ret_code = LTTNG_OK;
char *metadata_str;
@@
-1017,7
+1018,7
@@
int lttng_ustconsumer_recv_metadata(int sock, uint64_t key, uint64_t offset,
}
pthread_mutex_unlock(&channel->metadata_cache->lock);
}
pthread_mutex_unlock(&channel->metadata_cache->lock);
- while (consumer_metadata_cache_flushed(channel, offset + len)) {
+ while (consumer_metadata_cache_flushed(channel, offset + len
, timer
)) {
DBG("Waiting for metadata to be flushed");
usleep(DEFAULT_METADATA_AVAILABILITY_WAIT_TIME);
}
DBG("Waiting for metadata to be flushed");
usleep(DEFAULT_METADATA_AVAILABILITY_WAIT_TIME);
}
@@
-1352,7
+1353,7
@@
int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
}
ret = lttng_ustconsumer_recv_metadata(sock, key, offset,
}
ret = lttng_ustconsumer_recv_metadata(sock, key, offset,
- len, channel);
+ len, channel
, 0
);
if (ret < 0) {
/* error receiving from sessiond */
goto error_fatal;
if (ret < 0) {
/* error receiving from sessiond */
goto error_fatal;
@@
-1804,8
+1805,14
@@
void lttng_ustconsumer_close_stream_wakeup(struct lttng_consumer_stream *stream)
}
}
}
}
+/*
+ * Please refer to consumer-timer.c before adding any lock within this
+ * function or any of its callees. Timers have a very strict locking
+ * semantic with respect to teardown. Failure to respect this semantic
+ * introduces deadlocks.
+ */
int lttng_ustconsumer_request_metadata(struct lttng_consumer_local_data *ctx,
int lttng_ustconsumer_request_metadata(struct lttng_consumer_local_data *ctx,
- struct lttng_consumer_channel *channel)
+ struct lttng_consumer_channel *channel
, int timer
)
{
struct lttcomm_metadata_request_msg request;
struct lttcomm_consumer_msg msg;
{
struct lttcomm_metadata_request_msg request;
struct lttcomm_consumer_msg msg;
@@
-1893,7
+1900,7
@@
int lttng_ustconsumer_request_metadata(struct lttng_consumer_local_data *ctx,
}
ret_code = lttng_ustconsumer_recv_metadata(ctx->consumer_metadata_socket,
}
ret_code = lttng_ustconsumer_recv_metadata(ctx->consumer_metadata_socket,
- key, offset, len, channel);
+ key, offset, len, channel
, timer
);
if (ret_code >= 0) {
/*
* Only send the status msg if the sessiond is alive meaning a positive
if (ret_code >= 0) {
/*
* Only send the status msg if the sessiond is alive meaning a positive
This page took
0.033029 seconds
and
4
git commands to generate.