From d2e9d29b77c9eabb73ab859ccb0635e8c45a30a0 Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Fri, 5 Oct 2001 21:36:59 +0000 Subject: [PATCH] afsd-afsdb-shutdown-cleanly-20011005 make userspace afsdb handler shut down cleanly --- src/afs/afs_call.c | 16 +++++++++++++++- src/afs/afs_cell.c | 31 +++++++++++++++++++++++++++++-- src/afs/afs_dcache.c | 4 ++++ src/afsd/afsd.c | 5 +++++ src/config/afs_args.h | 1 + 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 1ac95bf80..71cea688b 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -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 */ diff --git a/src/afs/afs_cell.c b/src/afs/afs_cell.c index 82bf5a26d..2d8311059 100644 --- a/src/afs/afs_cell.c +++ b/src/afs/afs_cell.c @@ -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 */ diff --git a/src/afs/afs_dcache.c b/src/afs/afs_dcache.c index f2c0459b9..ee28e5dd1 100644 --- a/src/afs/afs_dcache.c +++ b/src/afs/afs_dcache.c @@ -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; } diff --git a/src/afsd/afsd.c b/src/afsd/afsd.c index 3edd97e83..7ff32b8e8 100644 --- a/src/afsd/afsd.c +++ b/src/afsd/afsd.c @@ -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 diff --git a/src/config/afs_args.h b/src/config/afs_args.h index 51427adee..1c76a9e29 100644 --- a/src/config/afs_args.h +++ b/src/config/afs_args.h @@ -105,6 +105,7 @@ /* #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 -- 2.39.5