summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-05-03 22:16:51 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-05-03 22:16:51 +0800
commitc4673a6f32926629d87aa31a72213e2f490e927c (patch)
tree1c3fc218370b42a5d8c5efe76c994a1a2f4224d8
parentbb3f67a2bbf8b22ea89f2a629a86ee4e6f9d34a4 (diff)
downloadpttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.tar
pttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.tar.gz
pttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.tar.bz2
pttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.tar.lz
pttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.tar.xz
pttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.tar.zst
pttbbs-c4673a6f32926629d87aa31a72213e2f490e927c.zip
* check system overload flag again before starting service
* also set overload flag when ack queue exceed boundary git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5043 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--pttbbs/daemon/logind/logind.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/pttbbs/daemon/logind/logind.c b/pttbbs/daemon/logind/logind.c
index a7962681..0ebc5d9b 100644
--- a/pttbbs/daemon/logind/logind.c
+++ b/pttbbs/daemon/logind/logind.c
@@ -1283,10 +1283,16 @@ auth_start(int fd, login_conn_ctx *conn)
return AUTH_RESULT_STOP;
}
- draw_auth_success(conn, isfree);
+ // consider system as overloaded if ack queue indicates service unavailable
+ if (g_overload || ackq_size() > LOGIND_ACKQUEUE_BOUND)
+ {
+ g_overload = 1; // set overload again to reject all incoming connections
+ draw_overload(conn, 1);
+ return AUTH_RESULT_STOP;
+ }
- if (ackq_size() > LOGIND_ACKQUEUE_BOUND ||
- !start_service(fd, conn))
+ draw_auth_success(conn, isfree);
+ if (!start_service(fd, conn))
{
// too bad, we can't start service.
retry_service();
@@ -1419,6 +1425,18 @@ get_tunnel_ack(int tunnel)
{
void *arg = NULL;
+#ifdef VERIFY_BLOCKING_TUNNEL
+ // fprintf(stderr, LOG_PREFIX "get_tunnel_ack: tunnel %s .\r\n",
+ // ( fcntl(tunnel, F_GETFL) & O_NONBLOCK ) ? "nonblock" : "blocking");
+ if (fcntl(tunnel, F_GETFL) & (O_NONBLOCK))
+ {
+ fprintf(stderr, LOG_PREFIX
+ "get_tunnel_ack: warning: tunnel is nonblocking.\r\n");
+ stop_tunnel(tunnel);
+ return NULL;
+ }
+#endif
+
if (toread(tunnel, &arg, sizeof(arg)) < sizeof(arg) ||
!arg)
{