]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
main/utils: Don't emit an ERROR message if the read end of a pipe closes 10/1810/3
authorMatt Jordan <mjordan@digium.com>
Sun, 13 Dec 2015 19:13:55 +0000 (13:13 -0600)
committerMatt Jordan <mjordan@digium.com>
Sun, 13 Dec 2015 19:22:52 +0000 (13:22 -0600)
An ERROR or WARNING message should generally indicate that something has gone
wrong in Asterisk. In the case of writing to a file descriptor, Asterisk is not
in control of when the far end closes its reading on a file descriptor. If the
far end does close the file descriptor in an unclean fashion, this isn't a bug
or error in Asterisk, particularly when the situation can be gracefully
handled in Asterisk.

Currently, when this happens, a user would see the following somewhat cryptic
ERROR message:

  "utils.c: write() returned error: Broken pipe"

There's a few problems with this:
(1) It doesn't provide any context, other than 'something broke a pipe'
(2) As noted, it isn't actually an error in Asterisk
(3) It can get rather spammy if the thing breaking the pipe occurs often, such
    as a FastAGI server
(4) Spammy ERROR messages make Asterisk appear to be having issues, or can even
    mask legitimate issues

This patch changes ast_carefulwrite to only log an ERROR if we actually had one
that was reasonably under our control. For debugging purposes, we still emit
a debug message if we detect that the far side has stopped reading.

Change-Id: Ia503bb1efcec685fa6f3017bedf98061f8e1b566

main/utils.c

index 3fa0b767847af746c610fb314cb4acbf93e0ea1d..8c239d58c64bdd5530d42533b3239613b3611cc5 100644 (file)
@@ -1390,7 +1390,13 @@ int ast_carefulwrite(int fd, char *s, int len, int timeoutms)
 
                if (res < 0 && errno != EAGAIN && errno != EINTR) {
                        /* fatal error from write() */
-                       ast_log(LOG_ERROR, "write() returned error: %s\n", strerror(errno));
+                       if (errno == EPIPE) {
+#ifndef STANDALONE
+                               ast_debug(1, "write() failed due to reading end being closed: %s\n", strerror(errno));
+#endif
+                       } else {
+                               ast_log(LOG_ERROR, "write() returned error: %s\n", strerror(errno));
+                       }
                        return -1;
                }