chiark / gitweb /
Don't create socket until database is in a sensible state. Should
authorRichard Kettlewell <rjk@greenend.org.uk>
Sat, 18 Jul 2009 14:01:57 +0000 (15:01 +0100)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sat, 18 Jul 2009 14:01:57 +0000 (15:01 +0100)
lead to less in the way of semi-random test failures.

server/disorder-server.h
server/disorderd.c
server/state.c

index 8900915..60e97df 100644 (file)
@@ -99,8 +99,16 @@ void daemonize(const char *tag, int fac, const char *pidfile);
 void quit(ev_source *ev) attribute((noreturn));
 /* terminate the daemon */
 
 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);
 
 
 void dbparams_check(void);
 
index a4af66b..31b70a4 100644 (file)
@@ -58,7 +58,7 @@ static int handle_sighup(ev_source attribute((unused)) *ev_,
                         int attribute((unused)) sig,
                         void attribute((unused)) *u) {
   info("received SIGHUP");
                         int attribute((unused)) sig,
                         void attribute((unused)) *u) {
   info("received SIGHUP");
-  reconfigure(ev, 1);
+  reconfigure(ev, RECONFIGURE_RELOADING);
   return 0;
 }
 
   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);
   /* 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);
     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();
   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 */
   /* check for change to database parameters */
   dbparams_check();
   /* re-read config if we receive a SIGHUP */
index e10a230..bd74b14 100644 (file)
@@ -62,7 +62,7 @@ static struct sockaddr *copy_sockaddr(const struct addrinfo *addr) {
 }
 
 /** @brief Create and destroy sockets to set current configuration */
 }
 
 /** @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;
   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
 }
 
 /** @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;
 
   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;
   }
   /* 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();
     /* 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 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;
 }
   }
   return ret;
 }