From: Mathieu Desnoyers Date: Mon, 3 Oct 2016 17:18:53 +0000 (-0400) Subject: Fix: perform statedump before replying to sessiond X-Git-Tag: v2.8.2~4 X-Git-Url: http://git.liburcu.org/?p=lttng-ust.git;a=commitdiff_plain;h=cf18865a7dc67b21d895d68176a5ae2c7d3a980e Fix: perform statedump before replying to sessiond If a stop command immediately follows a start command, the consumer daemon will stop event recording in the ring buffers shared memory control structures before the sessiond sends further commands to the application. Therefore, a stop-after-start may be performed concurrently with the statedump, leading to have parts of the statedump being missing. This case may always happen if an application exits during statedump, but it is not expected to have incomplete statedump in the stop-after-start use case. Signed-off-by: Mathieu Desnoyers --- diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 34b930d2..38e66dc2 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -946,6 +946,21 @@ int handle_message(struct sock_info *sock_info, } } DBG("Return value: %d", lur.ret_val); + + ust_unlock(); + + /* + * Performed delayed statedump operations outside of the UST + * lock. We need to take the dynamic loader lock before we take + * the UST lock internally within handle_pending_statedump(). + */ + handle_pending_statedump(sock_info); + + if (ust_lock()) { + ret = -LTTNG_UST_ERR_EXITING; + goto error; + } + ret = send_reply(sock, &lur); if (ret < 0) { DBG("error sending reply"); @@ -976,13 +991,6 @@ int handle_message(struct sock_info *sock_info, error: ust_unlock(); - /* - * Performed delayed statedump operations outside of the UST - * lock. We need to take the dynamic loader lock before we take - * the UST lock internally within handle_pending_statedump(). - */ - handle_pending_statedump(sock_info); - return ret; }