Windows: Add caching to cm_GetAddrsU
[openafs.git] / src / WINNT / afsd / cm_volume.c
index 8eca1ca..b338d60 100644 (file)
@@ -20,6 +20,7 @@
 #include <strsafe.h>
 #include <malloc.h>
 #include "afsd.h"
+#include "cm_getaddrs.h"
 #include <osi.h>
 #include <rx/rx.h>
 
@@ -111,6 +112,8 @@ cm_ShutdownVolume(void)
         lock_FinalizeRWLock(&volp->rw);
     }
 
+    cm_getaddrsShutdown();
+
     return 0;
 }
 
@@ -153,7 +156,10 @@ void cm_InitVolume(int newFile, long maxVols)
                 _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_RO_SIZE_VALID);
             }
         }
-        osi_EndOnce(&once);
+
+       cm_getaddrsInit();
+
+       osi_EndOnce(&once);
     }
 }
 
@@ -268,10 +274,8 @@ cm_GetEntryByID( struct cm_cell *cellp, afs_uint32 id,
 long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
                     cm_volume_t *volp)
 {
-    struct rx_connection *rxconnp;
-    cm_conn_t *connp;
     int i;
-    afs_uint32 j, k;
+    afs_uint32 j;
     cm_serverRef_t *tsrp;
     cm_server_t *tsp;
     struct sockaddr_in tsockAddr;
@@ -401,6 +405,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
         afs_int32 roID;
         afs_int32 bkID;
         afs_int32 serverNumber[NMAXNSERVERS];
+       afs_int32 serverUnique[NMAXNSERVERS];
         afs_int32 serverFlags[NMAXNSERVERS];
         afsUUID   serverUUID[NMAXNSERVERS];
         afs_int32 rwServers_alldown = 1;
@@ -420,6 +425,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
         }
 
         memset(serverUUID, 0, sizeof(serverUUID));
+       memset(serverUnique, 0, sizeof(serverUnique));
 
         switch ( method ) {
         case 0:
@@ -460,46 +466,14 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
                     serverNumber[j] = uvldbEntry.serverNumber[i].time_low;
                     j++;
                 } else {
-                    afs_uint32 * addrp, nentries, code, unique;
-                    bulkaddrs  addrs;
-                    ListAddrByAttributes attrs;
-                    afsUUID uuid;
-
-                    memset(&attrs, 0, sizeof(attrs));
-                    attrs.Mask = VLADDR_UUID;
-                    attrs.uuid = uvldbEntry.serverNumber[i];
-                    memset(&uuid, 0, sizeof(uuid));
-                    memset(&addrs, 0, sizeof(addrs));
-
-                    do {
-                        code = cm_ConnByMServers(cellp->vlServersp, FALSE, userp, reqp, &connp);
-                        if (code)
-                            continue;
-
-                        rxconnp = cm_GetRxConn(connp);
-                        code = VL_GetAddrsU(rxconnp, &attrs, &uuid, &unique, &nentries, &addrs);
-                        rx_PutConnection(rxconnp);
-                    } while (cm_Analyze(connp, userp, reqp, NULL, cellp, 0, NULL, NULL, &cellp->vlServersp, NULL, code));
-
-                    if ( code ) {
-                        code = cm_MapVLRPCError(code, reqp);
-                        osi_Log2(afsd_logp, "CALL VL_GetAddrsU serverNumber %u FAILURE, code 0x%x",
-                                 i, code);
-                        continue;
-                    }
-                    osi_Log1(afsd_logp, "CALL VL_GetAddrsU serverNumber %u SUCCESS", i);
-
-                    addrp = addrs.bulkaddrs_val;
-                    for (k = 0; k < nentries && j < NMAXNSERVERS; j++, k++) {
-                        serverFlags[j] = uvldbEntry.serverFlags[i];
-                        serverNumber[j] = addrp[k];
-                        serverUUID[j] = uuid;
-                    }
-
-                    xdr_free((xdrproc_t) xdr_bulkaddrs, &addrs);
-
-                    if (nentries == 0)
-                        code = CM_ERROR_INVAL;
+                   code = cm_GetAddrsU(cellp, userp, reqp,
+                                       &uvldbEntry.serverNumber[i],
+                                       uvldbEntry.serverUnique[i],
+                                       uvldbEntry.serverFlags[i], &j,
+                                       serverFlags, serverNumber,
+                                       serverUUID, serverUnique);
+                   if (code == CM_ERROR_RETRY)
+                       continue;
                 }
             }
             nServers = j;                                      /* update the server count */
@@ -1391,37 +1365,27 @@ cm_CheckOfflineVolumeState(cm_volume_t *volp, cm_vol_state_t *statep, afs_uint32
 
                 code = cm_GetSCache(&vfid, NULL, &vscp, cm_rootUserp, &req);
                 if (code = 0) {
-                    lock_ObtainWrite(&vscp->rw);
-                    code = cm_SyncOp(vscp, NULL, cm_rootUserp, &req, PRSFS_READ,
-                                     CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
-                    lock_ReleaseWrite(&vscp->rw);
-                    if (code == 0) {
-                        do {
-                            code = cm_ConnFromVolume(volp, statep->ID, cm_rootUserp, &req, &connp);
-                            if (code)
-                                continue;
-
-                            rxconnp = cm_GetRxConn(connp);
-                            code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
-                                                         &volStat, &Name, &OfflineMsg, &MOTD);
-                            rx_PutConnection(rxconnp);
-                        } while (cm_Analyze(connp, cm_rootUserp, &req, &vfid, NULL, 0, NULL, NULL, NULL, NULL, code));
-                        code = cm_MapRPCError(code, &req);
-
-                        if (code == 0 && volType == ROVOL)
-                        {
-
-                            lock_ObtainWrite(&volp->rw);
-                            volp->volumeSizeRO = volStat.BlocksInUse * 1024;
-                            _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RO_SIZE_VALID);
-                            lock_ReleaseWrite(&volp->rw);
-                        }
-                    }
-
-                    lock_ObtainWrite(&vscp->rw);
-                    cm_SyncOpDone(vscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
-                    lock_ReleaseWrite(&vscp->rw);
-                    cm_ReleaseSCache(vscp);
+                   do {
+                       code = cm_ConnFromVolume(volp, statep->ID, cm_rootUserp, &req, &connp);
+                       if (code)
+                          continue;
+
+                       rxconnp = cm_GetRxConn(connp);
+                       code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
+                                                    &volStat, &Name, &OfflineMsg, &MOTD);
+                       rx_PutConnection(rxconnp);
+                   } while (cm_Analyze(connp, cm_rootUserp, &req, &vfid, NULL, 0, NULL, NULL, NULL, NULL, code));
+                   code = cm_MapRPCError(code, &req);
+
+                   if (code == 0 && volType == ROVOL)
+                   {
+                       lock_ObtainWrite(&volp->rw);
+                       volp->volumeSizeRO = volStat.BlocksInUse * 1024;
+                       _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RO_SIZE_VALID);
+                       lock_ReleaseWrite(&volp->rw);
+                   }
+
+                   cm_ReleaseSCache(vscp);
                 }
                 lock_ObtainWrite(&volp->rw);
                 if (code == 0 && volStat.Online) {