From 1a97cc3cfdcc96b06a2c48577e470f7fddae825c Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 18 Mar 2012 18:11:35 +0100 Subject: [PATCH] Separate login_grace_time from max_idle max_idle applies in state PS_PLAYING, login_grace_time before (login, state PS_INIT) and after (logout, state PS_SHUTDOWN). Cut login_grace_time to two minutes, from max_idle's 15. Two minutes is plenty to complete login and logout. Makes swamping the server with connections slightly harder, as they get dropped faster. While that makes sense all by itself, the real aim is making increasing max_idle safe. The next commit will complete that job. --- include/econfig-spec.h | 4 +++- include/prototypes.h | 1 + src/lib/global/constants.c | 3 ++- src/lib/player/accept.c | 12 +++++++++++- src/lib/player/login.c | 2 +- src/lib/player/recvclient.c | 14 ++++---------- src/lib/subs/pr.c | 6 +----- 7 files changed, 23 insertions(+), 19 deletions(-) diff --git a/include/econfig-spec.h b/include/econfig-spec.h index 69fb01a9..f69838cd 100644 --- a/include/econfig-spec.h +++ b/include/econfig-spec.h @@ -28,7 +28,7 @@ * * Known contributors to this file: * Marc Olzheim, 2004 - * Markus Armbruster, 2004-2011 + * Markus Armbruster, 2004-2012 */ /* @@ -200,6 +200,8 @@ EMPCFBOTH("max_btus", max_btus, int, NSC_INT, 0, "Maximum number of BTUs a country can have") EMPCFBOTH("max_idle", max_idle, int, NSC_INT, 0, "Maximum number of minutes a player can sit idle while logged in") +EMPCFBOTH("login_grace_time", login_grace_time, int, NSC_INT, 0, + "Grace time for clients to complete login and logout (seconds)") EMPCFBOTH("players_at_00", players_at_00, int, NSC_INT, 0, "Players have their coordinate system at deity 0,0 (0 - no, 1 - yes)") EMPCFBOTH("at_least_one_100", at_least_one_100, int, NSC_INT, KM_INTERNAL, diff --git a/include/prototypes.h b/include/prototypes.h index 5dd3fbbd..ffe87a5e 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -338,6 +338,7 @@ extern struct player *player_next(struct player *); extern struct player *player_prev(struct player *); extern struct player *getplayer(natid); extern void player_accept(void *); +extern time_t player_io_deadline(struct player *, int); /* dispatch.c */ extern int dispatch(char *, char *); /* empdis.c */ diff --git a/src/lib/global/constants.c b/src/lib/global/constants.c index fafb4055..e051fd78 100644 --- a/src/lib/global/constants.c +++ b/src/lib/global/constants.c @@ -29,7 +29,7 @@ * Known contributors to this file: * Ken Stevens, 1995 * Steve McClure, 1996 - * Markus Armbruster, 2004-2011 + * Markus Armbruster, 2004-2012 */ #include @@ -65,6 +65,7 @@ char *game_days = ""; /* days game is running */ char *game_hours = ""; /* hours game is running */ char *pre_update_hook = ""; int max_idle = 15; /* session dies after max_idle minutes idle */ +int login_grace_time = 120; /* Grace time for completing login (sec) */ int sect_mob_max = 127; /* sector mobility limits */ float sect_mob_scale = 1.0; /* accumulation multiplier */ diff --git a/src/lib/player/accept.c b/src/lib/player/accept.c index 8d459182..f32548e0 100644 --- a/src/lib/player/accept.c +++ b/src/lib/player/accept.c @@ -99,7 +99,7 @@ player_delete(struct player *lp) if (lp->iop) { /* it's a real player */ - io_close(lp->iop, player->curup + minutes(max_idle)); + io_close(lp->iop, player->curup + login_grace_time); lp->iop = NULL; } back = (struct player *)lp->queue.q_back; @@ -152,6 +152,16 @@ getplayer(natid cnum) return NULL; } +time_t +player_io_deadline(struct player *pl, int write) +{ + if (pl->may_sleep < (write ? PLAYER_SLEEP_FREELY : PLAYER_SLEEP_ON_INPUT)) + return 0; + if (pl->state != PS_PLAYING) + return pl->curup + login_grace_time; + return pl->curup + minutes(max_idle); +} + /*ARGSUSED*/ void player_accept(void *unused) diff --git a/src/lib/player/login.c b/src/lib/player/login.c index ba415d8b..aa0033be 100644 --- a/src/lib/player/login.c +++ b/src/lib/player/login.c @@ -88,7 +88,7 @@ player_login(void *ud) pr_id(player, C_INIT, "Empire server ready\n"); for (;;) { - deadline = player->curup + minutes(max_idle); + deadline = player_io_deadline(player, 0); if (io_outputwaiting(player->iop)) { if (io_output(player->iop, deadline) <= 0) break; diff --git a/src/lib/player/recvclient.c b/src/lib/player/recvclient.c index f9f34534..b89bbef6 100644 --- a/src/lib/player/recvclient.c +++ b/src/lib/player/recvclient.c @@ -36,7 +36,6 @@ #include "empio.h" #include "journal.h" -#include "optlist.h" #include "player.h" #include "prototypes.h" @@ -81,20 +80,15 @@ recvclient(char *cmd, int size) * Flush all queued output before potentially sleeping in * io_input(), to make sure player sees the prompt. */ - deadline = player->curup + minutes(max_idle); - if (player->may_sleep < PLAYER_SLEEP_ON_INPUT) - deadline = 0; + deadline = player_io_deadline(player, 0); while (io_output(player->iop, deadline) > 0) ; /* - * Try to receive some input. Need to check player->may_sleep - * again; command abortion during io_output() might have - * changed it. + * Try to receive some input. Need to recompute deadline; + * command abortion during io_output() might have changed it. */ - deadline = player->curup + minutes(max_idle); - if (player->may_sleep < PLAYER_SLEEP_ON_INPUT) - deadline = 0; + deadline = player_io_deadline(player, 0); res = io_input(player->iop, deadline); if (res > 0) ; diff --git a/src/lib/subs/pr.c b/src/lib/subs/pr.c index fb46bef0..6413a5e6 100644 --- a/src/lib/subs/pr.c +++ b/src/lib/subs/pr.c @@ -58,7 +58,6 @@ #include "journal.h" #include "misc.h" #include "nat.h" -#include "optlist.h" #include "player.h" #include "proto.h" #include "prototypes.h" @@ -332,11 +331,8 @@ outid(struct player *pl, int n) static void player_output_some(void) { - time_t deadline; + time_t deadline = player_io_deadline(player, 1); - deadline = player->curup + minutes(max_idle); - if (player->may_sleep != PLAYER_SLEEP_FREELY) - deadline = 0; while (io_output_if_queue_long(player->iop, deadline) > 0) ; }