diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2010-05-03 22:16:51 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2010-05-03 22:16:51 +0800 |
commit | c4673a6f32926629d87aa31a72213e2f490e927c (patch) | |
tree | 1c3fc218370b42a5d8c5efe76c994a1a2f4224d8 | |
parent | bb3f67a2bbf8b22ea89f2a629a86ee4e6f9d34a4 (diff) | |
download | pttbbs-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.c | 24 |
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) { |