void cm_PutConn(cm_conn_t *connp)
{
lock_ObtainWrite(&cm_connLock);
- osi_assert(connp->refCount-- > 0);
+ osi_assertx(connp->refCount-- > 0, "cm_conn_t refcount 0");
lock_ReleaseWrite(&cm_connLock);
}
return CM_ERROR_INVAL;
}
- cellp = cm_FindCellByID(fidp->cell);
+ cellp = cm_FindCellByID(fidp->cell, 0);
if (!cellp)
return CM_ERROR_NOSUCHCELL;
}
}
if (cellp == NULL && fidp) {
- cellp = cm_FindCellByID(fidp->cell);
+ cellp = cm_FindCellByID(fidp->cell, 0);
}
}
cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, cellp);
retry = 1;
}
- }
+ }
+
+ else if (errorCode == UAEWOULDBLOCK || errorCode == EWOULDBLOCK ||
+ errorCode == UAEAGAIN || errorCode == EAGAIN) {
+ osi_Log0(afsd_logp, "cm_Analyze passed EWOULDBLOCK or EAGAIN.");
+ if (timeLeft > 5 ) {
+ thrd_Sleep(1000);
+ retry = 1;
+ }
+ }
/* if there is nosuchvolume, then we have a situation in which a
* previously known volume no longer has a set of servers
* background daemon thread as they become available
*/
if (timeLeft > 7 && fidp) {
- cm_volume_t *volp;
- cm_vol_state_t *statep;
-
thrd_Sleep(5000);
code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp,
else if (fidp->volume == volp->bk.ID)
statep = &volp->bk;
}
-
- cm_PutVolume(volp);
}
break;
}
}
lock_ReleaseWrite(&cm_serverLock);
- if (statep)
+ if (statep) {
cm_UpdateVolumeStatus(volp, statep->ID);
-
+ cm_PutVolume(volp);
+ }
+
if (free_svr_list) {
cm_FreeServerList(&serversp, 0);
*serverspp = serversp;
free_svr_list = 1;
}
}
+ lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->server == serverp) {
/* REDIRECT */
- if (errorCode == VNOVOL || errorCode == VMOVED) {
+ if (errorCode == VMOVED) {
tsrp->status = srv_deleted;
- if (fidp) {
- cm_ForceUpdateVolume(fidp, userp, reqp);
- }
- } else
+ } else {
tsrp->status = srv_offline;
+ }
+
+ if (fidp) { /* File Server query */
+ code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp,
+ CM_GETVOL_FLAG_NO_LRU_UPDATE,
+ &volp);
+ if (code == 0) {
+ if (fidp->volume == volp->rw.ID)
+ statep = &volp->rw;
+ else if (fidp->volume == volp->ro.ID)
+ statep = &volp->ro;
+ else if (fidp->volume == volp->bk.ID)
+ statep = &volp->bk;
+ }
+ }
}
}
+ lock_ReleaseWrite(&cm_serverLock);
+
+ if (fidp && errorCode == VMOVED)
+ cm_ForceUpdateVolume(fidp, userp, reqp);
+
+ if (statep) {
+ cm_UpdateVolumeStatus(volp, statep->ID);
+ cm_PutVolume(volp);
+ }
+
if (free_svr_list) {
cm_FreeServerList(&serversp, 0);
*serverspp = serversp;
/* mark server as down */
lock_ObtainMutex(&serverp->mx);
if (reqp->flags & CM_REQ_NEW_CONN_FORCED) {
- serverp->flags |= CM_SERVERFLAG_DOWN;
- serverp->downTime = osi_Time();
+ if (!(serverp->flags & CM_SERVERFLAG_DOWN)) {
+ serverp->flags |= CM_SERVERFLAG_DOWN;
+ serverp->downTime = time(NULL);
+ }
} else {
reqp->flags |= CM_REQ_NEW_CONN_FORCED;
forcing_new = 1;
case UAENOENT : s = "UAENOENT"; break;
case VICECONNBAD : s = "VICECONNBAD"; break;
case VICETOKENDEAD : s = "VICETOKENDEAD"; break;
+ case WSAEWOULDBLOCK : s = "WSAEWOULDBLOCK"; break;
+ case UAEWOULDBLOCK : s = "UAEWOULDBLOCK"; break;
case CM_ERROR_NOSUCHCELL : s = "CM_ERROR_NOSUCHCELL"; break;
case CM_ERROR_NOSUCHVOLUME : s = "CM_ERROR_NOSUCHVOLUME"; break;
case CM_ERROR_TIMEDOUT : s = "CM_ERROR_TIMEDOUT"; break;
int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1;
long timeUsed, timeLeft, hardTimeLeft;
+ *connpp = NULL;
+
if (serversp == NULL) {
osi_Log1(afsd_logp, "cm_ConnByMServers returning 0x%x", CM_ERROR_ALLDOWN);
return CM_ERROR_ALLDOWN;
}
- *connpp = NULL;
-
timeUsed = (GetTickCount() - reqp->startTime) / 1000;
/* leave 5 seconds margin of safety */
serviceID = 52;
}
else {
- osi_assert(serverp->type == CM_SERVER_FILE);
+ osi_assertx(serverp->type == CM_SERVER_FILE, "incorrect server type");
port = htons(7000);
serviceID = 1;
}
tcp->cryptlevel = rxkad_clear;
secObjp = rxnull_NewClientSecurityObject();
}
- osi_assert(secObjp != NULL);
+ osi_assertx(secObjp != NULL, "null rx_securityClass");
tcp->callp = rx_NewConnection(serverp->addr.sin_addr.s_addr,
port,
serviceID,
cm_conn_t *tcp;
cm_ucell_t *ucellp;
+ *connpp = NULL;
+
lock_ObtainMutex(&userp->mx);
lock_ObtainWrite(&cm_connLock);
for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {