From: Richard Kettlewell Date: Sat, 18 Jul 2009 14:01:57 +0000 (+0100) Subject: Don't create socket until database is in a sensible state. Should X-Git-Tag: 5.0~110 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/37f29ce96baac1d999dab119d671bb7dff6793e8?ds=inline Don't create socket until database is in a sensible state. Should lead to less in the way of semi-random test failures. --- diff --git a/server/disorder-server.h b/server/disorder-server.h index 8900915..60e97df 100644 --- a/server/disorder-server.h +++ b/server/disorder-server.h @@ -99,8 +99,16 @@ void daemonize(const char *tag, int fac, const char *pidfile); void quit(ev_source *ev) attribute((noreturn)); /* terminate the daemon */ -int reconfigure(ev_source *ev, int reload); -/* reconfigure. If @reload@ is nonzero, update the configuration. */ +int reconfigure(ev_source *ev, unsigned flags); +/* reconfigure */ + +void reset_sockets(ev_source *ev); + +/** @brief Set when starting server */ +#define RECONFIGURE_FIRST 0x0001 + +/** @brief Set when reloading after SIGHUP etc */ +#define RECONFIGURE_RELOADING 0x0002 void dbparams_check(void); diff --git a/server/disorderd.c b/server/disorderd.c index a4af66b..31b70a4 100644 --- a/server/disorderd.c +++ b/server/disorderd.c @@ -58,7 +58,7 @@ static int handle_sighup(ev_source attribute((unused)) *ev_, int attribute((unused)) sig, void attribute((unused)) *u) { info("received SIGHUP"); - reconfigure(ev, 1); + reconfigure(ev, RECONFIGURE_RELOADING); return 0; } @@ -262,8 +262,8 @@ int main(int argc, char **argv) { /* initialize database environment */ trackdb_init(TRACKDB_NORMAL_RECOVER|TRACKDB_MAY_CREATE); trackdb_master(ev); - /* install new config (calls trackdb_open()) */ - if(reconfigure(ev, 0)) + /* install new config; don't create socket */ + if(reconfigure(ev, RECONFIGURE_FIRST)) fatal(0, "failed to read configuration"); /* Open the database */ trackdb_open(TRACKDB_CAN_UPGRADE); @@ -276,6 +276,8 @@ int main(int argc, char **argv) { trackdb_old_users(); /* create a root login */ trackdb_create_root(); + /* create sockets */ + reset_sockets(ev); /* check for change to database parameters */ dbparams_check(); /* re-read config if we receive a SIGHUP */ diff --git a/server/state.c b/server/state.c index e10a230..bd74b14 100644 --- a/server/state.c +++ b/server/state.c @@ -62,7 +62,7 @@ static struct sockaddr *copy_sockaddr(const struct addrinfo *addr) { } /** @brief Create and destroy sockets to set current configuration */ -static void reset_socket(ev_source *ev) { +void reset_sockets(ev_source *ev) { const char *new_unix; struct addrinfo *res, *r; struct listener *l, **ll; @@ -144,20 +144,21 @@ static void reset_socket(ev_source *ev) { } /** @brief Reconfigure the server - * @param reload 0 at startup, 1 for a reload + * @param flags Flags + * @return As config_read(); 0 on success, -1 if could not (re-)read config */ -int reconfigure(ev_source *ev, int reload) { +int reconfigure(ev_source *ev, unsigned flags) { int need_another_rescan = 0; int ret = 0; - D(("reconfigure(%d)", reload)); + D(("reconfigure(%x)", flags)); /* Deconfigure the old audio API if there is one */ if(api) { if(api->close_mixer) api->close_mixer(); api = NULL; } - if(reload) { + if(flags & RECONFIGURE_RELOADING) { /* If there's a rescan in progress, cancel it but remember to start a fresh * one after the reload. */ need_another_rescan = trackdb_rescan_cancel(); @@ -179,9 +180,9 @@ int reconfigure(ev_source *ev, int reload) { /* If we interrupted a rescan of all the tracks, start a new one */ if(need_another_rescan) trackdb_rescan(ev, 1/*check*/, 0, 0); - if(!ret) { - /* Reset sockets */ - reset_socket(ev); + if(!ret && !(flags & RECONFIGURE_FIRST)) { + /* Open/close sockets */ + reset_sockets(ev); } return ret; }