Periodically a customer^H^H^H^H^H^H^H^Huser will call in and ask what
the heck these messages are and why are we idiots who pass bad
parameters to syscalls...
[Thu Mar 21 10:04:08 2002] [error] (22)Invalid argument: getsockname
[Thu Mar 21 10:05:03 2002] [warn] (22)Invalid argument: setsockopt: (TCP_NODELAY)
After the meaning of this is explained, some will call back and say
they're getting a zillion of them and want to know the client.
Figuring that out involves some tcpdump hocus pocus.
With the following patch, the log messages look like this:
[Wed Jan 15 09:25:54 2003] [warn] (9)Bad file number: setsockopt: (TCP_NODELAY),
client 9.27.32.119 probably dropped the connection
[Wed Jan 15 09:27:09 2003] [error] (9)Bad file number: getsockname, client 9.27.32.119
probably dropped the connection
(errno is EBADF instead of EINVAL in these sample messages because the
way I drove the logging code was by inserting a temporary close() call
at an opportune point)
Index: main/http_main.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.599
diff -u -r1.599 http_main.c
--- main/http_main.c 9 Jan 2003 09:24:10 -0000 1.599
+++ main/http_main.c 15 Jan 2003 15:14:27 -0000
@@ -3555,7 +3555,7 @@
}
#if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
-static void sock_disable_nagle(int s)
+static void sock_disable_nagle(int s, struct sockaddr_in *sin_client)
{
/* The Nagle algorithm says that we should delay sending partial
* packets in hopes of getting more data. We don't want to do
@@ -3570,16 +3570,24 @@
if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &just_say_no,
sizeof(int)) < 0) {
+ char buf[128];
+
+ if (sin_client) {
+ ap_snprintf(buf, sizeof(buf),
+ ", client %pA probably dropped the connection",
+ &sin_client->sin_addr);
+ }
#ifdef NETWARE
errno = WSAGetLastError();
#endif
ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf,
- "setsockopt: (TCP_NODELAY)");
+ "setsockopt: (TCP_NODELAY)%s",
+ sin_client ? buf : "");
}
}
#else
-#define sock_disable_nagle(s) /* NOOP */
+#define sock_disable_nagle(s, c) /* NOOP */
#endif
static int make_sock(pool *p, const struct sockaddr_in *server)
@@ -3663,7 +3671,7 @@
}
#endif
- sock_disable_nagle(s);
+ sock_disable_nagle(s, NULL);
sock_enable_linger(s);
/*
@@ -4513,11 +4521,14 @@
clen = sizeof(sa_server);
if (getsockname(csd, &sa_server, &clen) < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "getsockname");
+ ap_log_error(APLOG_MARK, APLOG_ERR, server_conf,
+ "getsockname, client %pA probably dropped the "
+ "connection",
+ &((struct sockaddr_in *)&sa_client)->sin_addr);
continue;
}
- sock_disable_nagle(csd);
+ sock_disable_nagle(csd, (struct sockaddr_in *)&sa_client);
(void) ap_update_child_status(my_child_num, SERVER_BUSY_READ,
(request_rec *) NULL);
@@ -5884,7 +5895,7 @@
memset(&sa_client, '\0', sizeof(sa_client));
}
- sock_disable_nagle(csd);
+ sock_disable_nagle(csd, (struct sockaddr_in *)&sa_client);
(void) ap_update_child_status(child_num, SERVER_BUSY_READ,
(request_rec *) NULL);
--
Jeff Trawick | [EMAIL PROTECTED]
Born in Roswell... married an alien...