Remove some explicit sbrk() usage
[openafs.git] / src / viced / viced.c
index 5f03ee6..b2f3f04 100644 (file)
 
 #undef SHARED
 
-#include <rx/xdr.h>
+#include <afs/opr.h>
 #include <afs/nfs.h>
+#include <rx/rx_queue.h>
 #include <lwp.h>
-#include <lock.h>
+#include <opr/lock.h>
+#include <opr/proc.h>
 #include <afs/cmd.h>
 #include <afs/ptclient.h>
 #include <afs/afsint.h>
@@ -68,7 +70,6 @@
 #include <afs/partition.h>
 #include <afs/dir.h>
 #ifndef AFS_NT40_ENV
-# include <afs/netutils.h>
 # include <afs/softsig.h>
 #endif
 #include "viced_prototypes.h"
@@ -93,6 +94,7 @@ static afs_int32 Do_VLRegisterRPC(void);
 
 int eventlog = 0, rxlog = 0;
 FILE *debugFile;
+char *logFile = NULL;
 
 pthread_mutex_t fsync_glock_mutex;
 pthread_cond_t fsync_cond;
@@ -152,6 +154,7 @@ static int panic_timeout = 2 * 60;
 static int panic_timeout = 30 * 60;
 #endif
 
+static int host_thread_quota;
 int rxpackets = 150;           /* 100 */
 int nSmallVns = 400;           /* 200 */
 int large = 400;               /* 200 */
@@ -228,8 +231,8 @@ static int fs_stateInit(void)
     fs_state.options.fs_state_verify_before_save = 1;
     fs_state.options.fs_state_verify_after_restore = 1;
 
-    CV_INIT(&fs_state.worker_done_cv, "worker done", CV_DEFAULT, 0);
-    osi_Assert(pthread_rwlock_init(&fs_state.state_lock, NULL) == 0);
+    opr_cv_init(&fs_state.worker_done_cv, "worker done");
+    opr_Verify(pthread_rwlock_init(&fs_state.state_lock, NULL) == 0);
 }
 # endif /* AFS_NT40_ENV */
 #endif /* AFS_DEMAND_ATTACH_FS */
@@ -434,7 +437,7 @@ FiveMinuteCheckLWP(void *unused)
            Do_VLRegisterRPC();
        /* Force wakeup in case we missed something; pthreads does timedwait */
        if (printBanner && (++msg & 1)) {       /* Every 10 minutes */
-           time_t now = FT_ApproxTime();
+           time_t now = time(NULL);
            struct tm tm;
            strftime(tbuffer, sizeof(tbuffer), "%a %b %d %H:%M:%S %Y",
                     localtime_r(&now, &tm));
@@ -448,7 +451,7 @@ FiveMinuteCheckLWP(void *unused)
 #ifdef AFS_DEMAND_ATTACH_FS
     fs_state.FiveMinuteLWP_tranquil = 1;
     FS_LOCK;
-    CV_BROADCAST(&fs_state.worker_done_cv);
+    opr_cv_broadcast(&fs_state.worker_done_cv);
     FS_UNLOCK;
     FS_STATE_UNLOCK;
 #endif
@@ -496,7 +499,7 @@ HostCheckLWP(void *unused)
 #ifdef AFS_DEMAND_ATTACH_FS
     fs_state.HostCheckLWP_tranquil = 1;
     FS_LOCK;
-    CV_BROADCAST(&fs_state.worker_done_cv);
+    opr_cv_broadcast(&fs_state.worker_done_cv);
     FS_UNLOCK;
     FS_STATE_UNLOCK;
 #endif
@@ -529,7 +532,7 @@ FsyncCheckLWP(void *unused)
        fsync_next.tv_nsec = 0;
        fsync_next.tv_sec = time(0) + fiveminutes;
 
-       code = CV_TIMEDWAIT(&fsync_cond, &fsync_glock_mutex,
+       code = opr_cv_timedwait(&fsync_cond, &fsync_glock_mutex,
                            &fsync_next);
        if (code != 0 && code != ETIMEDOUT)
            ViceLog(0, ("pthread_cond_timedwait returned %d\n", code));
@@ -555,7 +558,7 @@ FsyncCheckLWP(void *unused)
 #ifdef AFS_DEMAND_ATTACH_FS
     fs_state.FsyncCheckLWP_tranquil = 1;
     FS_LOCK;
-    CV_BROADCAST(&fs_state.worker_done_cv);
+    opr_cv_broadcast(&fs_state.worker_done_cv);
     FS_UNLOCK;
     FS_STATE_UNLOCK;
 #endif /* AFS_DEMAND_ATTACH_FS */
@@ -644,7 +647,7 @@ PrintCounters(void)
     int stats_flags = 0;
 #endif
 
-    FT_GetTimeOfDay(&tpl, 0);
+    gettimeofday(&tpl, 0);
     Statistics = 1;
     strftime(tbuffer, sizeof(tbuffer), "%a %b %d %H:%M:%S %Y",
             localtime_r(&StartTime, &tm));
@@ -668,11 +671,7 @@ PrintCounters(void)
     audit_PrintStats(stderr);
     h_PrintStats();
     PrintCallBackStats();
-#ifdef AFS_NT40_ENV
-    processSize = -1;          /* TODO: */
-#else
-    processSize = (int)((long)sbrk(0) >> 10);
-#endif
+    processSize = opr_procsize();
     ViceLog(0,
            ("There are %d connections, process size %d\n",
             CurrentConnections, processSize));
@@ -729,8 +728,9 @@ ShutDownAndCore(int dopanic)
     if (dopanic) {
        pthread_t watchdogPid;
        pthread_attr_t tattr;
-       osi_Assert(pthread_attr_init(&tattr) == 0);
-       osi_Assert(pthread_create(&watchdogPid, &tattr, ShutdownWatchdogLWP, NULL) == 0);
+       opr_Verify(pthread_attr_init(&tattr) == 0);
+       opr_Verify(pthread_create(&watchdogPid, &tattr,
+                                 ShutdownWatchdogLWP, NULL) == 0);
     }
 
     /* do not allows new reqests to be served from now on, all new requests
@@ -785,7 +785,7 @@ ShutDownAndCore(int dopanic)
                FS_LOCK;
                FS_STATE_UNLOCK;
                ViceLog(0, ("waiting for background host/callback threads to quiesce before saving fileserver state...\n"));
-               CV_WAIT(&fs_state.worker_done_cv, &fileproc_glock_mutex);
+               opr_cv_wait(&fs_state.worker_done_cv, &fileproc_glock_mutex);
                FS_UNLOCK;
                FS_STATE_RDLOCK;
            }
@@ -977,7 +977,8 @@ enum optionsList {
     OPT_rxmaxmtu,
     OPT_udpsize,
     OPT_dotted,
-    OPT_realm
+    OPT_realm,
+    OPT_sync
 };
 
 static int
@@ -991,6 +992,7 @@ ParseArgs(int argc, char *argv[])
 
     int lwps_max;
     char *auditFileName = NULL;
+    char *sync_behavior = NULL;
 
 #if defined(AFS_AIX32_ENV)
     extern int aixlow_water;
@@ -1038,7 +1040,7 @@ ParseArgs(int argc, char *argv[])
 
     cmd_AddParmAtOffset(opts, OPT_spare, "-spare", CMD_SINGLE,
                        CMD_OPTIONAL, "kB overage on volume quota");
-    cmd_AddParmAtOffset(opts, OPT_pctspare, "pctspare", CMD_SINGLE,
+    cmd_AddParmAtOffset(opts, OPT_pctspare, "-pctspare", CMD_SINGLE,
                        CMD_OPTIONAL, "percentage overage on volume quota");
 
     cmd_AddParmAtOffset(opts, OPT_hostcpsrefresh, "-hr", CMD_SINGLE,
@@ -1112,12 +1114,8 @@ ParseArgs(int argc, char *argv[])
                        CMD_OPTIONAL, "location of audit log");
     cmd_AddParmAtOffset(opts, OPT_auditiface, "-audit-interface", CMD_SINGLE,
                        CMD_OPTIONAL, "interface to use for audit logging");
-    cmd_AddParmAtOffset(opts, OPT_config, "-config", CMD_SINGLE, CMD_OPTIONAL,
-                       "configuration location");
     cmd_AddParmAtOffset(opts, OPT_debug, "-d", CMD_SINGLE, CMD_OPTIONAL,
                        "debug level");
-    cmd_AddParmAtOffset(opts, OPT_logfile, "-logfile", CMD_SINGLE,
-                       CMD_OPTIONAL, "location of logfile");
     cmd_AddParmAtOffset(opts, OPT_mrafslogs, "-mrafslogs", CMD_FLAG,
                        CMD_OPTIONAL, "enable MRAFS style logging");
     cmd_AddParmAtOffset(opts, OPT_threads, "-p", CMD_SINGLE, CMD_OPTIONAL,
@@ -1155,13 +1153,22 @@ ParseArgs(int argc, char *argv[])
                        "permit Kerberos 5 principals with dots");
     cmd_AddParmAtOffset(opts, OPT_realm, "-realm",
                        CMD_LIST, CMD_OPTIONAL, "local realm");
+    cmd_AddParmAtOffset(opts, OPT_sync, "-sync",
+                       CMD_SINGLE, CMD_OPTIONAL, "always | onclose | never");
+
+    /* testing options */
+    cmd_AddParmAtOffset(opts, OPT_logfile, "-logfile", CMD_SINGLE,
+           CMD_OPTIONAL, "location of log file");
+    cmd_AddParmAtOffset(opts, OPT_config, "-config", CMD_SINGLE,
+           CMD_OPTIONAL, "configuration location");
 
     code = cmd_Parse(argc, argv, &opts);
+    if (code == CMD_HELP) {
+       exit(0);
+    }
     if (code)
        return -1;
 
-    /* XXX - cmd_OptionAsString(opts, OPT_config, &configDir); */
-
     cmd_OpenConfigFile(AFSDIR_SERVER_CONFIG_FILE_FILEPATH);
     cmd_SetCommandName("fileserver");
 
@@ -1215,9 +1222,11 @@ ParseArgs(int argc, char *argv[])
     cmd_OptionAsInt(opts, OPT_buffers, &buffs);
 
     if (cmd_OptionAsInt(opts, OPT_callbacks, &numberofcbs) == 0) {
-       printf("number of cbs %d invalid; "
-              "must be between 10000 and 2147483647\n", numberofcbs);
-       return -1;
+       if ((numberofcbs < 10000) || (numberofcbs > 2147483647)) {
+           printf("number of cbs %d invalid; "
+                  "must be between 10000 and 2147483647\n", numberofcbs);
+           return -1;
+       }
     }
 
     cmd_OptionAsInt(opts, OPT_vcsize, &volcache);
@@ -1286,6 +1295,12 @@ ParseArgs(int argc, char *argv[])
                    &vol_io_params.fd_max_cachesize);
     cmd_OptionAsUint(opts, OPT_vhandle_initial_cachesize,
                    &vol_io_params.fd_initial_cachesize);
+    if (cmd_OptionAsString(opts, OPT_sync, &sync_behavior) == 0) {
+       if (ih_SetSyncBehavior(sync_behavior)) {
+           printf("Invalid -sync value %s\n", sync_behavior);
+           return -1;
+       }
+    }
 
 #ifdef AFS_DEMAND_ATTACH_FS
     if (cmd_OptionPresent(opts, OPT_fs_state_dont_save))
@@ -1342,7 +1357,6 @@ ParseArgs(int argc, char *argv[])
     }
 
     cmd_OptionAsInt(opts, OPT_debug, &LogLevel);
-    /* XXX - cmd_OptionAsString(opts, OPT_logfile, &logFile); */
     cmd_OptionAsFlag(opts, OPT_mrafslogs, &mrafsStyleLogs);
 
     if (cmd_OptionAsInt(opts, OPT_threads, &lwps) == 0) {
@@ -1410,9 +1424,23 @@ ParseArgs(int argc, char *argv[])
        busy_threshold = 3 * rxpackets / 2;
     }
 
+    cmd_OptionAsString(opts, OPT_logfile, &logFile);
+    cmd_OptionAsString(opts, OPT_config, &FS_configPath);
+
+
     if (auditFileName)
        osi_audit_file(auditFileName);
 
+    if (lwps > 64) {
+       host_thread_quota = 5;
+    } else if (lwps > 32) {
+       host_thread_quota = 4;
+    } else if (lwps > 16) {
+       host_thread_quota = 3;
+    } else {
+       host_thread_quota = 2;
+    }
+
     return (0);
 }                              /*ParseArgs */
 
@@ -1457,7 +1485,7 @@ InitPR(void)
        return code;
     }
 
-    osi_Assert(pthread_key_create(&viced_uclient_key, NULL) == 0);
+    opr_Verify(pthread_key_create(&viced_uclient_key, NULL) == 0);
 
     SystemId = SYSADMINID;
     SystemAnyUser = ANYUSERID;
@@ -1505,6 +1533,11 @@ vl_Initialize(struct afsconf_dir *dir)
        exit(1);
     }
     code = afsconf_GetCellInfo(dir, NULL, AFSCONF_VLDBSERVICE, &info);
+    if (code) {
+       ViceLog(0,
+               ("vl_Initialize: Failed to get cell information\n"));
+       exit(1);
+    }
     if (info.numServers > MAXSERVERS) {
        ViceLog(0,
                ("vl_Initialize: info.numServers=%d (> MAXSERVERS=%d)\n",
@@ -1618,8 +1651,8 @@ WriteSysIdFile(void)
        /*
         * File exists; keep the old one around
         */
-       renamefile(AFSDIR_SERVER_SYSID_FILEPATH,
-                  AFSDIR_SERVER_OLDSYSID_FILEPATH);
+       rk_rename(AFSDIR_SERVER_SYSID_FILEPATH,
+                 AFSDIR_SERVER_OLDSYSID_FILEPATH);
     }
     fd = afs_open(AFSDIR_SERVER_SYSID_FILEPATH, O_WRONLY | O_TRUNC | O_CREAT,
                  0666);
@@ -1725,10 +1758,12 @@ SetupVL(void)
         * /usr/afs/local/NetRestict)
         */
        char reason[1024];
-       afs_int32 code = parseNetFiles(FS_HostAddrs, NULL, NULL,
-                                      ADDRSPERSITE, reason,
-                                      AFSDIR_SERVER_NETINFO_FILEPATH,
-                                      AFSDIR_SERVER_NETRESTRICT_FILEPATH);
+       afs_int32 code;
+
+       code = afsconf_ParseNetFiles(FS_HostAddrs, NULL, NULL,
+                                    ADDRSPERSITE, reason,
+                                    AFSDIR_SERVER_NETINFO_FILEPATH,
+                                    AFSDIR_SERVER_NETRESTRICT_FILEPATH);
        if (code < 0) {
            ViceLog(0, ("Can't register any valid addresses: %s\n", reason));
            exit(1);
@@ -1829,10 +1864,13 @@ main(int argc, char *argv[])
     /* check for the parameter file */
     CheckParms();
 
+    FS_configPath = strdup(AFSDIR_SERVER_ETC_DIRPATH);
+    logFile = strdup(AFSDIR_SERVER_FILELOG_FILEPATH);
+
     if (ParseArgs(argc, argv)) {
        exit(-1);
     }
-    MUTEX_INIT(&fileproc_glock_mutex, "fileproc", MUTEX_DEFAULT, 0);
+    opr_mutex_init(&fileproc_glock_mutex);
 
 #ifdef AFS_SGI_VNODE_GLUE
     if (afs_init_kernel_config(-1) < 0) {
@@ -1841,7 +1879,6 @@ main(int argc, char *argv[])
        exit(1);
     }
 #endif
-    FS_configPath = strdup(AFSDIR_SERVER_ETC_DIRPATH);
 
     confDir = afsconf_Open(FS_configPath);
     if (!confDir) {
@@ -1857,10 +1894,13 @@ main(int argc, char *argv[])
 #ifndef AFS_NT40_ENV
     serverLogSyslogTag = "fileserver";
 #endif
-    OpenLog(AFSDIR_SERVER_FILELOG_FILEPATH);
+    OpenLog(logFile);
     SetupLogSignals();
 
     LogCommandLine(argc, argv, "starting", "", "File server", FSLog);
+    if (afsconf_GetLatestKey(confDir, NULL, NULL) == 0) {
+       LogDesWarning();
+    }
 
 #if !defined(AFS_NT40_ENV)
     /* initialize the pthread soft signal handler thread */
@@ -2032,7 +2072,7 @@ main(int argc, char *argv[])
     }
 
     init_sys_error_to_et();    /* Set up error table translation */
-    h_InitHostPackage();       /* set up local cellname and realmname */
+    h_InitHostPackage(host_thread_quota); /* set up local cellname and realmname */
     InitCallBack(numberofcbs);
     ClearXStatValues();
 
@@ -2051,8 +2091,8 @@ main(int argc, char *argv[])
     /* allow super users to manage RX statistics */
     rx_SetRxStatUserOk(viced_SuperUser);
 
-    CV_INIT(&fsync_cond, "fsync", CV_DEFAULT, 0);
-    MUTEX_INIT(&fsync_glock_mutex, "fsync", MUTEX_DEFAULT, 0);
+    opr_cv_init(&fsync_cond);
+    opr_mutex_init(&fsync_glock_mutex);
 
 #if !defined(AFS_DEMAND_ATTACH_FS)
     /*
@@ -2149,18 +2189,18 @@ main(int argc, char *argv[])
     ih_UseLargeCache();
 
     ViceLog(5, ("Starting pthreads\n"));
-    osi_Assert(pthread_attr_init(&tattr) == 0);
-    osi_Assert(pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) == 0);
-
-    osi_Assert(pthread_create
-          (&serverPid, &tattr, FiveMinuteCheckLWP,
-           &fiveminutes) == 0);
-    osi_Assert(pthread_create
-          (&serverPid, &tattr, HostCheckLWP, &fiveminutes) == 0);
-    osi_Assert(pthread_create
-          (&serverPid, &tattr, FsyncCheckLWP, &fiveminutes) == 0);
-
-    FT_GetTimeOfDay(&tp, 0);
+    opr_Verify(pthread_attr_init(&tattr) == 0);
+    opr_Verify(pthread_attr_setdetachstate(&tattr,
+                                          PTHREAD_CREATE_DETACHED) == 0);
+
+    opr_Verify(pthread_create(&serverPid, &tattr, FiveMinuteCheckLWP,
+                             &fiveminutes) == 0);
+    opr_Verify(pthread_create(&serverPid, &tattr, HostCheckLWP,
+                             &fiveminutes) == 0);
+    opr_Verify(pthread_create(&serverPid, &tattr, FsyncCheckLWP,
+                             &fiveminutes) == 0);
+
+    gettimeofday(&tp, 0);
 
     /*
      * Figure out the FileServer's name and primary address.