}
lock_ReleaseWrite(&cm_serverLock);
if (free_svr_list) {
- cm_FreeServerList(&serversp, 0);
- *serverspp = serversp = NULL;
+ cm_FreeServerList(serverspp, 0);
+ serverspp = NULL;
+ serversp = NULL;
free_svr_list = 0;
}
}
if (free_svr_list) {
- cm_FreeServerList(&serversp, 0);
- *serverspp = serversp = NULL;
+ cm_FreeServerList(serverspp, 0);
+ serverspp = NULL;
+ serversp = NULL;
free_svr_list = 0;
}
retry = 1;
char addr[16];
char *format;
DWORD msgID;
+
+ /* In case of timeout */
+ reqp->volumeError = errorCode;
+
switch ( errorCode ) {
case VNOVOL:
msgID = MSG_SERVER_REPORTS_VNOVOL;
LogEvent(EVENTLOG_WARNING_TYPE, msgID, addr, fidp->volume);
}
- /* Mark server offline for this volume */
+ /*
+ * Mark server offline for this volume or delete the volume
+ * from the server list if it was moved or is not present.
+ */
if (!serversp && fidp) {
code = cm_GetServerList(fidp, userp, reqp, &serverspp);
if (code == 0) {
- serversp = *serverspp = NULL;
+ serversp = *serverspp;
free_svr_list = 1;
}
}
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->status == srv_deleted)
continue;
+
+ sprintf(addr, "%d.%d.%d.%d",
+ ((tsrp->server->addr.sin_addr.s_addr & 0xff)),
+ ((tsrp->server->addr.sin_addr.s_addr & 0xff00)>> 8),
+ ((tsrp->server->addr.sin_addr.s_addr & 0xff0000)>> 16),
+ ((tsrp->server->addr.sin_addr.s_addr & 0xff000000)>> 24));
+
if (tsrp->server == serverp) {
/* REDIRECT */
if (errorCode == VMOVED || errorCode == VNOVOL) {
+ osi_Log2(afsd_logp, "volume %d not present on server %s",
+ fidp->volume, osi_LogSaveString(afsd_logp,addr));
tsrp->status = srv_deleted;
if (fidp)
cm_RemoveVolumeFromServer(serverp, fidp->volume);
} else {
+ osi_Log2(afsd_logp, "volume %d instance on server %s marked offline",
+ fidp->volume, osi_LogSaveString(afsd_logp,addr));
tsrp->status = srv_offline;
}
+ /* break; */
+ } else {
+ osi_Log3(afsd_logp, "volume %d exists on server %s with status %u",
+ fidp->volume, osi_LogSaveString(afsd_logp,addr), tsrp->status);
}
}
lock_ReleaseWrite(&cm_serverLock);
/* Free the server list before cm_ForceUpdateVolume is called */
if (free_svr_list) {
- cm_FreeServerList(&serversp, 0);
- *serverspp = serversp = NULL;
+ cm_FreeServerList(serverspp, 0);
+ serverspp = NULL;
+ serversp = NULL;
free_svr_list = 0;
}
if (code == 0)
statep = cm_VolumeStateByID(volp, fidp->volume);
- if (errorCode == VMOVED || errorCode == VNOVOL) {
+ if ((errorCode == VMOVED || errorCode == VNOVOL) &&
+ !(reqp->flags & CM_REQ_VOLUME_UPDATED))
+ {
code = cm_ForceUpdateVolume(fidp, userp, reqp);
if (code)
timeLeft = 0; /* prevent a retry on failure */
+ else
+ reqp->flags |= CM_REQ_VOLUME_UPDATED;
osi_Log3(afsd_logp, "cm_Analyze called cm_ForceUpdateVolume cell %u vol %u code 0x%x",
fidp->cell, fidp->volume, code);
}
if (connp)
cm_PutConn(connp);
+ /*
+ * clear the volume updated flag if we succeed.
+ * this way the flag will not prevent a subsequent volume
+ * from being updated if necessary.
+ */
+ if (errorCode == 0)
+ {
+ reqp->flags &= ~CM_REQ_VOLUME_UPDATED;
+ }
+
/* retry until we fail to find a connection */
return retry;
}
cm_serverRef_t *tsrp;
cm_server_t *tsp;
int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1;
+ char addr[16];
if (!volp || !statep) {
#ifdef DEBUG
lock_ObtainWrite(&cm_serverLock);
for (tsrp = statep->serversp; tsrp; tsrp=tsrp->next) {
- if (tsrp->status == srv_deleted)
- continue;
tsp = tsrp->server;
+ sprintf(addr, "%d.%d.%d.%d",
+ ((tsp->addr.sin_addr.s_addr & 0xff)),
+ ((tsp->addr.sin_addr.s_addr & 0xff00)>> 8),
+ ((tsp->addr.sin_addr.s_addr & 0xff0000)>> 16),
+ ((tsp->addr.sin_addr.s_addr & 0xff000000)>> 24));
+
+ if (tsrp->status == srv_deleted) {
+ osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s deleted",
+ statep->ID, osi_LogSaveString(afsd_logp,addr));
+ continue;
+ }
if (tsp) {
cm_GetServerNoLock(tsp);
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
allDown = 0;
if (tsrp->status == srv_busy) {
+ osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s busy",
+ statep->ID, osi_LogSaveString(afsd_logp,addr));
allOffline = 0;
someBusy = 1;
} else if (tsrp->status == srv_offline) {
+ osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s offline",
+ statep->ID, osi_LogSaveString(afsd_logp,addr));
allBusy = 0;
someOffline = 1;
} else {
+ osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s online",
+ statep->ID, osi_LogSaveString(afsd_logp,addr));
allOffline = 0;
allBusy = 0;
}
+ } else {
+ osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s online",
+ statep->ID, osi_LogSaveString(afsd_logp,addr));
}
cm_PutServerNoLock(tsp);
}
}
lock_ReleaseWrite(&cm_serverLock);
+ osi_Log5(afsd_logp, "cm_UpdateVolumeStatusInt allDown %d allBusy %d someBusy %d someOffline %d allOffline %d",
+ allDown, allBusy, someBusy, someOffline, allOffline);
+
if (allDown)
newStatus = vl_alldown;
else if (allBusy || (someBusy && someOffline))