If a fileserver is shutdown while one or more PR_GetHostCPS calls
are in progress, this state is saved in the fsstate.dat file as
hostFlags HCPS_WAITING, HCPS_INPROGRESS. Other hosts that are
merely waiting will have HCPS_WAITING recorded.
However, it makes no sense to restore host structs in this state,
because the GetCPS calls will no longer be in progress. Once these
hosts become active, they will block server threads and quickly cause
all server threads to be exhausted as other CPS requests are blocked
behind them.
Instead, exclude these states from both save and restore.
Reviewed-on: https://gerrit.openafs.org/12561
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
(cherry picked from commit
38a3f51fb8b3910ecdd7cacb06f35ec681990aea)
Change-Id: I0e02543fd2e547fcc9f95db0973f09e5951a1da1
Reviewed-on: https://gerrit.openafs.org/12568
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
#define IN_CLASSB_SUBNET 0xffffff00
#endif
+#define hostBusyFlags(hf) \
+ ((hf) & (HWHO_INPROGRESS | HCPS_INPROGRESS | HCPS_WAITING) \
+ || !((hf) & ALTADDR))
/* get a new block of CEs and chain it on CEFree */
static void
return 1;
}
- if ((host->hostFlags & HWHO_INPROGRESS) || !(host->hostFlags & ALTADDR)) {
- /* We shouldn't hit this if the host wasn't locked, but just in case... */
+ if (hostBusyFlags(host->hostFlags)) {
return 1;
}
osi_Assert(hcps != NULL);
}
- if ((hdsk.hostFlags & HWHO_INPROGRESS) || !(hdsk.hostFlags & ALTADDR)) {
+ if (hostBusyFlags(hdsk.hostFlags)) {
char hoststr[16];
ViceLog(0, ("h_stateRestoreHost: skipping host %s:%d due to invalid flags 0x%x\n",
afs_inet_ntoa_r(hdsk.host, hoststr), (int)ntohs(hdsk.port),