about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-07-09 00:14:56 +0000
committerEric Wong <normalperson@yhbt.net>2013-07-10 00:56:29 +0000
commit9897d28bb57f2aa84f91b1a8594c7ecd30be8446 (patch)
tree1645a006661ceba008f7fe13bd915cf72a537063
parent2c24cf070dfc9341462fcba59fab4c6b7b330938 (diff)
downloadcmogstored-9897d28bb57f2aa84f91b1a8594c7ecd30be8446.tar.gz
This should hopefully make failures easier to track down.
-rw-r--r--http.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/http.c b/http.c
index 3ba33bb..d147eb1 100644
--- a/http.c
+++ b/http.c
@@ -205,6 +205,28 @@ static enum mog_next http_run(struct mog_fd *mfd, struct mog_rbuf *rbuf,
         return MOG_NEXT_ACTIVE;
 }
 
+static MOG_NOINLINE enum mog_next
+http_client_died(struct mog_fd *mfd, size_t buf_len, int save_err)
+{
+        struct mog_ni ni;
+
+        /* TODO: support nameinfo */
+        TRACE(CMOGSTORED_HTTP_RDERR(buf_len, save_err));
+
+        switch (save_err) {
+        case ECONNRESET:
+        case ENOTCONN:
+                return MOG_NEXT_CLOSE;
+                /* these errors are too common to log, normally */
+        }
+
+        mog_nameinfo(&mfd->as.http.mpa, &ni);
+        errno = save_err;
+        syslog(LOG_NOTICE, "http client died: %m (%s%s)",
+                ni.ni_host, ni.ni_serv);
+        return MOG_NEXT_CLOSE;
+}
+
 static enum mog_next __http_queue_step(struct mog_fd *mfd)
 {
         struct mog_http *http = &mfd->as.http;
@@ -281,15 +303,8 @@ parse:
                         }
                         return MOG_NEXT_WAIT_RD;
                 case EINTR: goto reread;
-                case ECONNRESET:
-                case ENOTCONN:
-                        /* these errors are too common to log, normally */
-                        TRACE(CMOGSTORED_HTTP_RDERR(buf_len, errno));
-                        return MOG_NEXT_CLOSE;
                 default:
-                        TRACE(CMOGSTORED_HTTP_RDERR(buf_len, errno));
-                        syslog(LOG_NOTICE, "http client died: %m");
-                        return MOG_NEXT_CLOSE;
+                        return http_client_died(mfd, buf_len, errno);
                 }
         }