From 0b1ee8c1c359fe16693bf117524f54160ebe53e3 Mon Sep 17 00:00:00 2001 From: Ben Kaduk Date: Mon, 29 Jul 2013 14:22:46 -0400 Subject: [PATCH] Reorder bosserver startup prior to pthreads 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 Reviewed-by: Derrick Brashear Tested-by: BuildBot --- src/bozo/bosserver.c | 169 ++++++++++++++++++++++--------------------- 1 file changed, 88 insertions(+), 81 deletions(-) diff --git a/src/bozo/bosserver.c b/src/bozo/bosserver.c index 3899efc1b..511ad4ecf 100644 --- a/src/bozo/bosserver.c +++ b/src/bozo/bosserver.c @@ -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); -- 2.39.5