cm_serverRef_t * serversp,
cm_callbackRequest_t *cbrp, long errorCode)
{
- cm_server_t *serverp = 0;
- cm_serverRef_t **serverspp = 0;
+ cm_server_t *serverp = NULL;
+ cm_serverRef_t **serverspp = NULL;
cm_serverRef_t *tsrp;
cm_ucell_t *ucellp;
int retry = 0;
int free_svr_list = 0;
int dead_session;
long timeUsed, timeLeft;
+ long code;
osi_Log2(afsd_logp, "cm_Analyze connp 0x%x, code 0x%x",
(long) connp, errorCode);
if (timeLeft > 7) {
osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLOFFLINE.");
thrd_Sleep(5000);
+
/* cm_ForceUpdateVolume marks all servers as non_busy */
/* No it doesn't and it won't do anything if all of the
* the servers are marked as DOWN. So clear the DOWN
* flag and reset the busy state as well.
*/
if (!serversp) {
- cm_GetServerList(fidp, userp, reqp, &serverspp);
- serversp = *serverspp;
- free_svr_list = 1;
+ code = cm_GetServerList(fidp, userp, reqp, &serverspp);
+ if (code == 0) {
+ serversp = *serverspp;
+ free_svr_list = 1;
+ }
}
if (serversp) {
lock_ObtainWrite(&cm_serverLock);
if (fidp != NULL) /* Not a VLDB call */
cm_ForceUpdateVolume(fidp, userp, reqp);
+ else
+ retry = 0;
}
}
if (timeLeft > 7) {
thrd_Sleep(5000);
if (!serversp) {
- cm_GetServerList(fidp, userp, reqp, &serverspp);
- serversp = *serverspp;
- free_svr_list = 1;
+ code = cm_GetServerList(fidp, userp, reqp, &serverspp);
+ if (code == 0) {
+ serversp = *serverspp;
+ free_svr_list = 1;
+ }
}
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
/* special codes: VBUSY and VRESTARTING */
else if (errorCode == VBUSY || errorCode == VRESTARTING) {
if (!serversp) {
- cm_GetServerList(fidp, userp, reqp, &serverspp);
- serversp = *serverspp;
- free_svr_list = 1;
+ code = cm_GetServerList(fidp, userp, reqp, &serverspp);
+ if (code == 0) {
+ serversp = *serverspp;
+ free_svr_list = 1;
+ }
}
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
/* Mark server offline for this volume */
if (!serversp) {
- cm_GetServerList(fidp, userp, reqp, &serverspp);
- serversp = *serverspp;
- free_svr_list = 1;
+ code = cm_GetServerList(fidp, userp, reqp, &serverspp);
+ if (code == 0) {
+ serversp = *serverspp;
+ free_svr_list = 1;
+ }
}
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->server == serverp)
if (!(flags & CM_MERGEFLAG_FORCE)
&& statusp->DataVersion < (unsigned long) scp->dataVersion) {
struct cm_cell *cellp;
- struct cm_volume *volp;
cellp = cm_FindCellByID(scp->fid.cell);
- cm_GetVolumeByID(cellp, scp->fid.volume, userp,
- (cm_req_t *) NULL, &volp);
- if (scp->cbServerp)
+ if (scp->cbServerp) {
+ struct cm_volume *volp = NULL;
+
+ cm_GetVolumeByID(cellp, scp->fid.volume, userp,
+ (cm_req_t *) NULL, &volp);
osi_Log2(afsd_logp, "old data from server %x volume %s",
scp->cbServerp->addr.sin_addr.s_addr,
- volp->namep);
+ volp ? volp->namep : "(unknown)");
+ if (volp)
+ cm_PutVolume(volp);
+ }
osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %d, RPC dv %d",
scp, scp->dataVersion, statusp->DataVersion);
/* we have a number of data fetch/store operations running