Reorder bosserver startup prior to pthreads
authorBen Kaduk <kaduk@mit.edu>
Mon, 29 Jul 2013 18:22:46 +0000 (14:22 -0400)
committerDerrick Brashear <shadow@your-file-system.com>
Tue, 8 Oct 2013 12:51:07 +0000 (05:51 -0700)
The rx calls will take locks when built in pthreaded mode, and must go
after rx_Init().  Some other setup would benefit from using time-domain
locking and should run before we go multithreaded.

In particular, initialize bozo_confdir while single-threaded, as it is
otherwise protected by the afsconf internal locking.  While here, pass
NULL to afsconf_SetCellInfo -- bozo_confdir would always be NULL there,
anyway.

Change a couple globals into local variables in main; they are just
used to defer setup after argument parsing.

ReadBozoFile will create worker threads to monitor child processes,
so it cannot move up too far.

Change when we daemonize, too.

Change-Id: If7b6883748919270c9a5a41cd8e6fb724e95aa36
Reviewed-on: http://gerrit.openafs.org/10285
Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/bozo/bosserver.c

index 3899efc..511ad4e 100644 (file)
@@ -762,6 +762,8 @@ main(int argc, char **argv, char **envp)
     char *auditFileName = NULL;
     struct rx_securityClass **securityClasses;
     afs_int32 numClasses;
+    int DoPeerRPCStats = 0;
+    int DoProcessRPCStats = 0;
 #ifndef AFS_NT40_ENV
     int nofork = 0;
     struct stat sb;
@@ -866,9 +868,9 @@ main(int argc, char **argv, char **envp)
        }
 #endif
        else if (strcmp(argv[code], "-enable_peer_stats") == 0) {
-           rx_enablePeerRPCStats();
+           DoPeerRPCStats = 1;
        } else if (strcmp(argv[code], "-enable_process_stats") == 0) {
-           rx_enableProcessRPCStats();
+           DoProcessRPCStats = 1;
        }
        else if (strcmp(argv[code], "-restricted") == 0) {
            bozo_isrestricted = 1;
@@ -943,35 +945,6 @@ main(int argc, char **argv, char **envp)
     }
 #endif
 
-    code = bnode_Init();
-    if (code) {
-       printf("bosserver: could not init bnode package, code %d\n", code);
-       exit(1);
-    }
-
-    bnode_Register("fs", &fsbnode_ops, 3);
-    bnode_Register("dafs", &dafsbnode_ops, 4);
-    bnode_Register("simple", &ezbnode_ops, 1);
-    bnode_Register("cron", &cronbnode_ops, 2);
-
-    /* create useful dirs */
-    CreateDirs(DoCore);
-
-    /* chdir to AFS log directory */
-    if (DoCore)
-       chdir(DoCore);
-    else
-       chdir(AFSDIR_SERVER_LOGS_DIRPATH);
-
-    /* go into the background and remove our controlling tty, close open
-       file desriptors
-     */
-
-#ifndef AFS_NT40_ENV
-    if (!nofork)
-       daemon(1, 0);
-#endif /* ! AFS_NT40_ENV */
-
     if ((!DoSyslog)
 #ifndef AFS_NT40_ENV
        && ((lstat(AFSDIR_BOZLOG_FILE, &sb) == 0) &&
@@ -995,6 +968,76 @@ main(int argc, char **argv, char **envp)
 #endif
     }
 
+    /*
+     * go into the background and remove our controlling tty, close open
+     * file desriptors
+     */
+
+#ifndef AFS_NT40_ENV
+    if (!nofork)
+       daemon(1, 0);
+#endif /* ! AFS_NT40_ENV */
+
+    /* create useful dirs */
+    CreateDirs(DoCore);
+
+    /* Write current state of directory permissions to log file */
+    DirAccessOK();
+
+    /* chdir to AFS log directory */
+    if (DoCore)
+       chdir(DoCore);
+    else
+       chdir(AFSDIR_SERVER_LOGS_DIRPATH);
+
+    /* try to read the key from the config file */
+    tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
+    if (!tdir) {
+       /* try to create local cell config file */
+       struct afsconf_cell tcell;
+       strcpy(tcell.name, "localcell");
+       tcell.numServers = 1;
+       code = gethostname(tcell.hostName[0], MAXHOSTCHARS);
+       if (code) {
+           bozo_Log("failed to get hostname, code %d\n", errno);
+           exit(1);
+       }
+       if (tcell.hostName[0][0] == 0) {
+           bozo_Log("host name not set, can't start\n");
+           bozo_Log("try the 'hostname' command\n");
+           exit(1);
+       }
+       memset(tcell.hostAddr, 0, sizeof(tcell.hostAddr));      /* not computed */
+       code =
+           afsconf_SetCellInfo(NULL, AFSDIR_SERVER_ETC_DIRPATH,
+                               &tcell);
+       if (code) {
+           bozo_Log
+               ("could not create cell database in '%s' (code %d), quitting\n",
+                AFSDIR_SERVER_ETC_DIRPATH, code);
+           exit(1);
+       }
+       tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
+       if (!tdir) {
+           bozo_Log
+               ("failed to open newly-created cell database, quitting\n");
+           exit(1);
+       }
+    }
+    /* opened the cell databse */
+    bozo_confdir = tdir;
+
+    code = bnode_Init();
+    if (code) {
+       printf("bosserver: could not init bnode package, code %d\n", code);
+       exit(1);
+    }
+
+    bnode_Register("fs", &fsbnode_ops, 3);
+    bnode_Register("dafs", &dafsbnode_ops, 4);
+    bnode_Register("simple", &ezbnode_ops, 1);
+    bnode_Register("cron", &cronbnode_ops, 2);
+
 #if defined(RLIMIT_CORE) && defined(HAVE_GETRLIMIT)
     {
       struct rlimit rlp;
@@ -1009,8 +1052,13 @@ main(int argc, char **argv, char **envp)
     }
 #endif
 
-    /* Write current state of directory permissions to log file */
-    DirAccessOK();
+    /* Read init file, starting up programs. Also starts watcher threads. */
+    if ((code = ReadBozoFile(0))) {
+       bozo_Log
+           ("bosserver: Something is wrong (%d) with the bos configuration file %s; aborting\n",
+            code, AFSDIR_SERVER_BOZCONF_FILEPATH);
+       exit(code);
+    }
 
     if (rxBind) {
        afs_int32 ccode;
@@ -1027,7 +1075,6 @@ main(int argc, char **argv, char **envp)
         if (ccode == 1)
             host = SHostAddrs[0];
     }
-
     for (i = 0; i < 10; i++) {
        if (rxBind) {
            code = rx_InitHost(host, htons(AFSCONF_NANNYPORT));
@@ -1045,6 +1092,12 @@ main(int argc, char **argv, char **envp)
        exit(code);
     }
 
+    /* Set some rx config */
+    if (DoPeerRPCStats)
+       rx_enablePeerRPCStats();
+    if (DoProcessRPCStats)
+       rx_enableProcessRPCStats();
+
     /* Disable jumbograms */
     rx_SetNoJumbo();
 
@@ -1062,57 +1115,11 @@ main(int argc, char **argv, char **envp)
         exit(1);
     }
 
-    /* try to read the key from the config file */
-    tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
-    if (!tdir) {
-       /* try to create local cell config file */
-       struct afsconf_cell tcell;
-       strcpy(tcell.name, "localcell");
-       tcell.numServers = 1;
-       code = gethostname(tcell.hostName[0], MAXHOSTCHARS);
-       if (code) {
-           bozo_Log("failed to get hostname, code %d\n", errno);
-           exit(1);
-       }
-       if (tcell.hostName[0][0] == 0) {
-           bozo_Log("host name not set, can't start\n");
-           bozo_Log("try the 'hostname' command\n");
-           exit(1);
-       }
-       memset(tcell.hostAddr, 0, sizeof(tcell.hostAddr));      /* not computed */
-       code =
-           afsconf_SetCellInfo(bozo_confdir, AFSDIR_SERVER_ETC_DIRPATH,
-                               &tcell);
-       if (code) {
-           bozo_Log
-               ("could not create cell database in '%s' (code %d), quitting\n",
-                AFSDIR_SERVER_ETC_DIRPATH, code);
-           exit(1);
-       }
-       tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
-       if (!tdir) {
-           bozo_Log
-               ("failed to open newly-created cell database, quitting\n");
-           exit(1);
-       }
-    }
-
     /* initialize audit user check */
-    osi_audit_set_user_check(tdir, bozo_IsLocalRealmMatch);
-
-    /* read init file, starting up programs */
-    if ((code = ReadBozoFile(0))) {
-       bozo_Log
-           ("bosserver: Something is wrong (%d) with the bos configuration file %s; aborting\n",
-            code, AFSDIR_SERVER_BOZCONF_FILEPATH);
-       exit(code);
-    }
+    osi_audit_set_user_check(bozo_confdir, bozo_IsLocalRealmMatch);
 
     bozo_CreateRxBindFile(host);       /* for local scripts */
 
-    /* opened the cell databse */
-    bozo_confdir = tdir;
-
     /* allow super users to manage RX statistics */
     rx_SetRxStatUserOk(bozo_rxstat_userok);