All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH lttng-tools] Fix: consumerd errors on exit
@ 2014-02-21 15:14 Mathieu Desnoyers
  0 siblings, 0 replies; only message in thread
From: Mathieu Desnoyers @ 2014-02-21 15:14 UTC (permalink / raw)
  To: dgoulet; +Cc: lttng-dev

- The LTTNG_CONSUMER_STOP command is not used by sessiond anymore, so
  deprecate it,
- Ensure that the normal teardown (with signal handler) does not trigger
  a health error in consumer daemon by distinguishing between errors and
  "should exit" with different lttng_consumer_poll_socket() return values.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
 src/common/consumer.c                        |   42 +++++++++++++++-----------
 src/common/consumer.h                        |    2 +-
 src/common/kernel-consumer/kernel-consumer.c |   18 +++--------
 src/common/ust-consumer/ust-consumer.c       |   15 ++-------
 4 files changed, 33 insertions(+), 44 deletions(-)

diff --git a/src/common/consumer.c b/src/common/consumer.c
index 821a04e..8462c0e 100644
--- a/src/common/consumer.c
+++ b/src/common/consumer.c
@@ -1095,8 +1095,8 @@ static int update_poll_array(struct lttng_consumer_local_data *ctx,
 }
 
 /*
- * Poll on the should_quit pipe and the command socket return -1 on error and
- * should exit, 0 if data is available on the command socket
+ * Poll on the should_quit pipe and the command socket return -1 on
+ * error, 1 if should exit, 0 if data is available on the command socket
  */
 int lttng_consumer_poll_socket(struct pollfd *consumer_sockpoll)
 {
@@ -1112,16 +1112,13 @@ restart:
 			goto restart;
 		}
 		PERROR("Poll error");
-		goto exit;
+		return -1;
 	}
 	if (consumer_sockpoll[0].revents & (POLLIN | POLLPRI)) {
 		DBG("consumer_should_quit wake up");
-		goto exit;
+		return 1;
 	}
 	return 0;
-
-exit:
-	return -1;
 }
 
 /*
@@ -2944,8 +2941,8 @@ static int set_metadata_socket(struct lttng_consumer_local_data *ctx,
 	assert(ctx);
 	assert(sockpoll);
 
-	if (lttng_consumer_poll_socket(sockpoll) < 0) {
-		ret = -1;
+	ret = lttng_consumer_poll_socket(sockpoll);
+	if (ret) {
 		goto error;
 	}
 	DBG("Metadata connection on client_socket");
@@ -3014,7 +3011,12 @@ void *consumer_thread_sessiond_poll(void *data)
 	consumer_sockpoll[1].fd = client_socket;
 	consumer_sockpoll[1].events = POLLIN | POLLPRI;
 
-	if (lttng_consumer_poll_socket(consumer_sockpoll) < 0) {
+	ret = lttng_consumer_poll_socket(consumer_sockpoll);
+	if (ret) {
+		if (ret > 0) {
+			/* should exit */
+			err = 0;
+		}
 		goto end;
 	}
 	DBG("Connection on client_socket");
@@ -3031,7 +3033,11 @@ void *consumer_thread_sessiond_poll(void *data)
 	 * command unix socket.
 	 */
 	ret = set_metadata_socket(ctx, consumer_sockpoll, client_socket);
-	if (ret < 0) {
+	if (ret) {
+		if (ret > 0) {
+			/* should exit */
+			err = 0;
+		}
 		goto end;
 	}
 
@@ -3052,15 +3058,15 @@ void *consumer_thread_sessiond_poll(void *data)
 		health_poll_entry();
 		ret = lttng_consumer_poll_socket(consumer_sockpoll);
 		health_poll_exit();
-		if (ret < 0) {
+		if (ret) {
+			if (ret > 0) {
+				/* should exit */
+				err = 0;
+			}
 			goto end;
 		}
 		DBG("Incoming command on sock");
 		ret = lttng_consumer_recv_cmd(ctx, sock, consumer_sockpoll);
-		if (ret == -ENOENT) {
-			DBG("Received STOP command");
-			goto end;
-		}
 		if (ret <= 0) {
 			/*
 			 * This could simply be a session daemon quitting. Don't output
@@ -3278,7 +3284,9 @@ int consumer_add_relayd_socket(uint64_t net_seq_idx, int sock_type,
 	}
 
 	/* Poll on consumer socket. */
-	if (lttng_consumer_poll_socket(consumer_sockpoll) < 0) {
+	ret = lttng_consumer_poll_socket(consumer_sockpoll);
+	if (ret) {
+		/* Needing to exit in the middle of a command: error. */
 		lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_POLL_ERROR);
 		ret = -EINTR;
 		goto error_nosignal;
diff --git a/src/common/consumer.h b/src/common/consumer.h
index 84ef271..7485e65 100644
--- a/src/common/consumer.h
+++ b/src/common/consumer.h
@@ -41,7 +41,7 @@ enum lttng_consumer_command {
 	/* pause, delete, active depending on fd state */
 	LTTNG_CONSUMER_UPDATE_STREAM,
 	/* inform the consumer to quit when all fd has hang up */
-	LTTNG_CONSUMER_STOP,
+	LTTNG_CONSUMER_STOP,	/* deprecated */
 	LTTNG_CONSUMER_ADD_RELAYD_SOCKET,
 	/* Inform the consumer to kill a specific relayd connection */
 	LTTNG_CONSUMER_DESTROY_RELAYD,
diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c
index 061123d..ab4f604 100644
--- a/src/common/kernel-consumer/kernel-consumer.c
+++ b/src/common/kernel-consumer/kernel-consumer.c
@@ -441,17 +441,8 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
 	health_code_update();
 
-	if (msg.cmd_type == LTTNG_CONSUMER_STOP) {
-		/*
-		 * Notify the session daemon that the command is completed.
-		 *
-		 * On transport layer error, the function call will print an error
-		 * message so handling the returned code is a bit useless since we
-		 * return an error code anyway.
-		 */
-		(void) consumer_send_status_msg(sock, ret_code);
-		return -ENOENT;
-	}
+	/* Deprecated command */
+	assert(msg.cmd_type != LTTNG_CONSUMER_STOP);
 
 	health_code_update();
 
@@ -593,9 +584,8 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 		health_poll_entry();
 		ret = lttng_consumer_poll_socket(consumer_sockpoll);
 		health_poll_exit();
-		if (ret < 0) {
-			rcu_read_unlock();
-			return -EINTR;
+		if (ret) {
+			goto error_fatal;
 		}
 
 		health_code_update();
diff --git a/src/common/ust-consumer/ust-consumer.c b/src/common/ust-consumer/ust-consumer.c
index b48a3c8..be203cf 100644
--- a/src/common/ust-consumer/ust-consumer.c
+++ b/src/common/ust-consumer/ust-consumer.c
@@ -1116,17 +1116,8 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
 	health_code_update();
 
-	if (msg.cmd_type == LTTNG_CONSUMER_STOP) {
-		/*
-		 * Notify the session daemon that the command is completed.
-		 *
-		 * On transport layer error, the function call will print an error
-		 * message so handling the returned code is a bit useless since we
-		 * return an error code anyway.
-		 */
-		(void) consumer_send_status_msg(sock, ret_code);
-		return -ENOENT;
-	}
+	/* deprecated */
+	assert(msg.cmd_type != LTTNG_CONSUMER_STOP);
 
 	health_code_update();
 
@@ -1456,7 +1447,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 		health_poll_entry();
 		ret = lttng_consumer_poll_socket(consumer_sockpoll);
 		health_poll_exit();
-		if (ret < 0) {
+		if (ret) {
 			goto error_fatal;
 		}
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2014-02-21 15:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-21 15:14 [PATCH lttng-tools] Fix: consumerd errors on exit Mathieu Desnoyers

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.