#endif
time_t StartTime;
+/**
+ * seconds to wait until forcing a panic during ShutDownAndCore(PANIC)
+ * in case we get stuck.
+ */
+#ifdef AFS_DEMAND_ATTACH_FS
+static int panic_timeout = 2 * 60;
+#else
+static int panic_timeout = 30 * 60;
+#endif
+
int rxpackets = 150; /* 100 */
int nSmallVns = 400; /* 200 */
int large = 400; /* 200 */
return 0;
} /*CheckSignal */
+static void *
+ShutdownWatchdogLWP(void *unused)
+{
+ sleep(panic_timeout);
+ ViceLog(0, ("ShutdownWatchdogLWP: Failed to shutdown and panic "
+ "within %d seconds; forcing panic\n", panic_timeout));
+ assert(0);
+ return NULL;
+}
+
void
ShutDownAndCore(int dopanic)
{
time_t now = time(0);
char tbuffer[32];
+ if (dopanic) {
+#ifdef AFS_PTHREAD_ENV
+ pthread_t watchdogPid;
+ pthread_attr_t tattr;
+ assert(pthread_attr_init(&tattr) == 0);
+ assert(pthread_create(&watchdogPid, &tattr, ShutdownWatchdogLWP, NULL) == 0);
+#else
+ PROCESS watchdogPid;
+ assert(LWP_CreateProcess
+ (ShutdownWatchdogLWP, stack * 1024, LWP_MAX_PRIORITY - 2,
+ NULL, "ShutdownWatchdog", &watchdogPid) == LWP_SUCCESS);
+#endif
+ }
+
/* do not allows new reqests to be served from now on, all new requests
* are returned with an error code of RX_RESTARTING ( transient failure ) */
rx_SetRxTranquil(); /* dhruba */
* demand attach fs
* save fileserver state to disk */
- /* make sure background threads have finished all of their asynchronous
- * work on host and callback structures */
- FS_STATE_RDLOCK;
- while (!fs_state.FiveMinuteLWP_tranquil ||
- !fs_state.HostCheckLWP_tranquil ||
- !fs_state.FsyncCheckLWP_tranquil) {
- FS_LOCK;
- FS_STATE_UNLOCK;
- ViceLog(0, ("waiting for background host/callback threads to quiesce before saving fileserver state...\n"));
- assert(pthread_cond_wait(&fs_state.worker_done_cv, &fileproc_glock_mutex) == 0);
- FS_UNLOCK;
+ if (dopanic) {
+ ViceLog(0, ("Not saving fileserver state; abnormal shutdown\n"));
+
+ } else {
+ /* make sure background threads have finished all of their asynchronous
+ * work on host and callback structures */
FS_STATE_RDLOCK;
- }
+ while (!fs_state.FiveMinuteLWP_tranquil ||
+ !fs_state.HostCheckLWP_tranquil ||
+ !fs_state.FsyncCheckLWP_tranquil) {
+ FS_LOCK;
+ FS_STATE_UNLOCK;
+ ViceLog(0, ("waiting for background host/callback threads to quiesce before saving fileserver state...\n"));
+ assert(pthread_cond_wait(&fs_state.worker_done_cv, &fileproc_glock_mutex) == 0);
+ FS_UNLOCK;
+ FS_STATE_RDLOCK;
+ }
- /* ok. it should now be fairly safe. let's do the state dump */
- fs_stateSave();
+ /* ok. it should now be fairly safe. let's do the state dump */
+ fs_stateSave();
+ }
}
#endif /* AFS_DEMAND_ATTACH_FS */
int curLimit;
time_t t;
afs_uint32 rx_bindhost;
+ VolumePackageOptions opts;
#ifdef AFS_AIX32_ENV
struct sigaction nsa;
* will be available "real soon now". Worry about whether we can satisfy the
* calls in the volume package itself.
*/
- if (VInitVolumePackage(fileServer, large, nSmallVns, 0, volcache)) {
+ VOptDefaults(fileServer, &opts);
+ opts.nLargeVnodes = large;
+ opts.nSmallVnodes = nSmallVns;
+ opts.volcache = volcache;
+
+ if (VInitVolumePackage2(fileServer, &opts)) {
ViceLog(0,
("Shutting down: errors encountered initializing volume package\n"));
VShutdown();