]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
afsd-afsdb-shutdown-cleanly-20011005
authorNickolai Zeldovich <kolya@mit.edu>
Fri, 5 Oct 2001 21:36:59 +0000 (21:36 +0000)
committerDerrick Brashear <shadow@dementia.org>
Fri, 5 Oct 2001 21:36:59 +0000 (21:36 +0000)
make userspace afsdb handler shut down cleanly

src/afs/afs_call.c
src/afs/afs_cell.c
src/afs/afs_dcache.c
src/afsd/afsd.c
src/config/afs_args.h

index 1ac95bf803525ff3f49436c4c7177731c6dbe8ca..71cea688b038952f745a1472f96b5e053c5c529e 100644 (file)
@@ -609,8 +609,16 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        int cellLen = (sizeArg & 0xffff0000) >> 16;
        afs_int32 *kmsg = afs_osi_Alloc(kmsgLen);
        char *cellname = afs_osi_Alloc(cellLen);
+
        AFS_COPYIN((afs_int32 *)parm3, kmsg, kmsgLen, code);
-       if (!code) code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+       if (!code) {
+           code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+           if (*cellname == 1) *cellname = 0;
+           if (code == -2) {   /* Shutting down? */
+               *cellname = 1;
+               code = 0;
+           }
+       }
        if (!code) AFS_COPYOUT(cellname, (char *)parm2, cellLen, code);
        afs_osi_Free(kmsg, kmsgLen);
        afs_osi_Free(cellname, cellLen);
@@ -1201,6 +1209,12 @@ afs_shutdown()
        afs_osi_Wakeup((char*)&afs_CacheTruncateDaemon);
        afs_osi_Sleep(&afs_termState);
     }
+#ifdef AFS_AFSDB_ENV
+    afs_warn("AFSDB... ");
+    afs_StopAfsdb();
+    while (afs_termState == AFSOP_STOP_AFSDB)
+       afs_osi_Sleep(&afs_termState);
+#endif
 #if    defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV)
     afs_warn("RxEvent... ");
     /* cancel rx event deamon */
index 82bf5a26d4c2f3998f892be85ad3e08f1087f19b..2d8311059c443f362369463283f8ac8c18c81719 100644 (file)
@@ -57,6 +57,7 @@ static char afs_AfsdbLookupWait;
 
 char afs_AfsdbHandlerPresent = 0;
 char afs_AfsdbHandlerInuse = 0;
+char afs_AfsdbHandlerShutdown = 0;
 
 char *afs_AfsdbHandler_CellName;
 afs_int32 *afs_AfsdbHandler_CellHosts;
@@ -87,6 +88,16 @@ int afs_strcasecmp(s1, s2)
 
 
 #ifdef AFS_AFSDB_ENV
+void afs_StopAfsdb()
+{
+    if (afs_AfsdbHandlerPresent) {
+       afs_osi_Wakeup(&afs_AfsdbHandlerWait);
+    } else {
+       afs_AfsdbHandlerShutdown = 1;
+       afs_termState = AFSOP_STOP_RXEVENT;
+    }
+}
+
 int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
     char *acellName;
     int acellNameLen;
@@ -94,6 +105,7 @@ int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
 {
     /* afs_syscall_call() has already grabbed the global lock */
 
+    if (afs_AfsdbHandlerShutdown) return -2;
     afs_AfsdbHandlerPresent = 1;
 
     if (afs_AfsdbHandler_ReqPending) {
@@ -117,9 +129,21 @@ int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
     }
 
     /* Wait for a request */
-    while (afs_AfsdbHandler_ReqPending == 0)
+    while (afs_AfsdbHandler_ReqPending == 0 && afs_termState != AFSOP_STOP_AFSDB)
        afs_osi_Sleep(&afs_AfsdbHandlerWait);
 
+    /* Check if we're shutting down */
+    if (afs_termState == AFSOP_STOP_AFSDB) {
+       /* Inform anyone waiting for us that we're going away */
+       afs_AfsdbHandlerShutdown = 1;
+       afs_AfsdbHandlerPresent = 0;
+       afs_osi_Wakeup(&afs_AfsdbLookupWait);
+
+       afs_termState = AFSOP_STOP_RXEVENT;
+       afs_osi_Wakeup(&afs_termState);
+       return -2;
+    }
+
     /* Copy the requested cell name into the request buffer */
     strncpy(acellName, afs_AfsdbHandler_CellName, acellNameLen);
 
@@ -139,6 +163,9 @@ int afs_GetCellHostsFromDns(acellName, acellHosts, timeout)
 
     if (!afs_AfsdbHandlerPresent) return ENOENT;
 
+    /* Initialize host list to empty in case the handler is gone */
+    *acellHosts = 0;
+
     if (!ISAFS_GLOCK()) {
        grab_glock = 1;
        AFS_GLOCK();
@@ -160,7 +187,7 @@ int afs_GetCellHostsFromDns(acellName, acellHosts, timeout)
     afs_osi_Wakeup(&afs_AfsdbHandlerWait);
 
     /* Wait for the handler to get back to us with the reply */
-    while (!afs_AfsdbHandler_Completed)
+    while (afs_AfsdbHandlerPresent && !afs_AfsdbHandler_Completed)
        afs_osi_Sleep(&afs_AfsdbLookupWait);
 
     /* Release the AFSDB handler and wake up others waiting for it */
index f2c0459b95b0987159f77b3ae3d68308c6b4f9e9..ee28e5dd15055c2106d0fb47fe42c32b517560f8 100644 (file)
@@ -294,7 +294,11 @@ void afs_CacheTruncateDaemon() {
            afs_stats_AddTo(CTD_stats.CTD_sleepTime, CTD_tmpTime);
        }
        if (afs_termState == AFSOP_STOP_TRUNCDAEMON) {
+#ifdef AFS_AFSDB_ENV
+           afs_termState = AFSOP_STOP_AFSDB;
+#else
            afs_termState = AFSOP_STOP_RXEVENT;
+#endif
            afs_osi_Wakeup(&afs_termState);
            break;
        }
index 3edd97e83c83d063e70398e782c99e68a79fe992..7ff32b8e84eb6cb36baeb62b983fe49cc68ac603 100644 (file)
@@ -1067,6 +1067,9 @@ static AfsdbLookupHandler()
            continue;
        }
 
+       if (*acellName == 1)    /* Shutting down */
+           break;
+
        code = afsconf_GetAfsdbInfo(acellName, 0, &acellInfo);
        if (code) {
            kernelMsg[0] = 0;
@@ -1081,6 +1084,8 @@ static AfsdbLookupHandler()
                kernelMsg[i+2] = acellInfo.hostAddr[i].sin_addr.s_addr;
        }    
     }
+
+    exit(1);
 }
 #endif
 
index 51427adee7698c78447a3cf65339b60f563c0109..1c76a9e299e0cd473b5b46e6801fddbd6b3adbd5 100644 (file)
 /* #define AFSOP_STOP_RXEVENT   214     defined in osi.h             */
 /* #define AFSOP_STOP_COMPLETE     215  defined in osi.h             */
 /* #define AFSOP_STOP_RXK_LISTENER   217     defined in osi.h        */
+#define AFSOP_STOP_AFSDB       218     /* Stop AFSDB handler */
 
 /* Main afs syscall entry; this number may vary per system (i.e. defined in afs/param.h) */
 #ifndef        AFS_SYSCALL