Fix: error logged on partial recvmsg() in MSG_DONTWAIT
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 18 Dec 2018 19:01:08 +0000 (14:01 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 14 Jan 2019 22:56:28 +0000 (17:56 -0500)
The relay daemon logs a "Resource temporarily unavailable" error
message when the lttcomm_recvmsg_inet_sock() is invoked and
no data is left to be consumed from the lttcomm_sock.

The "recvmsg" socket operation is called in a loop by the relay
daemon to consume the data being received in 64k chunks. If, on
one of those iterations, 0 bytes are available, recvmsg() will
return an error (-1, errno = EAGAIN). This should not be
logged in non-blocking mode.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/sessiond-comm/inet.c

index ac450dbc8b31b9e394eac7062d326edefcc26748..57ffbe45c28ed1ae68bded38f4713f901a23deb1 100644 (file)
@@ -381,6 +381,15 @@ ssize_t lttcomm_recvmsg_inet_sock(struct lttcomm_sock *sock, void *buf,
        } while ((ret > 0 && ret < len_last) || (ret < 0 && errno == EINTR));
 
        if (ret < 0) {
+               if (errno == EAGAIN && flags & MSG_DONTWAIT) {
+                       /*
+                        * EAGAIN is expected in non-blocking mode and should
+                        * not be reported as an error. Moreover, if no data
+                        * was read, 0 must not be returned as it would be
+                        * interpreted as an orderly shutdown of the socket.
+                        */
+                       goto end;
+               }
                PERROR("recvmsg inet");
        } else if (ret > 0) {
                ret = len;
This page took 0.026315 seconds and 4 git commands to generate.