windows-flush-btrees-20080911
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 11 Sep 2008 18:09:34 +0000 (18:09 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 11 Sep 2008 18:09:34 +0000 (18:09 +0000)
LICENSE MIT

fs flushall, fs flushvolume, and fs flush should tear down directory
B+ trees so that when the data buffers are re-read from the file server
with the same data version, the B+ trees will be rebuilt.

src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h

index a0d416d..9f5bee8 100644 (file)
@@ -104,6 +104,8 @@ cm_FlushFile(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
         
     lock_ObtainWrite(&scp->rw);
     cm_DiscardSCache(scp);
+    if (scp->fileType == CM_SCACHETYPE_DIRECTORY)
+        cm_ResetSCacheDirectory(scp);
     lock_ReleaseWrite(&scp->rw);
 
     osi_Log2(afsd_logp,"cm_FlushFile scp 0x%x returns error: [%x]",scp, code);
@@ -3049,7 +3051,7 @@ cm_CheckServersStatus(cm_serverRef_t *serversp)
         if (tsp = tsrp->server) {
             cm_GetServerNoLock(tsp);
             lock_ReleaseRead(&cm_serverLock);
-            if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
+            if ((tsrp->status == srv_deleted) && !(tsp->flags & CM_SERVERFLAG_DOWN)) {
                 allDown = 0;
                 if (tsrp->status == srv_busy) {
                     allOffline = 0;
index d790989..b3944a5 100644 (file)
@@ -75,10 +75,25 @@ void cm_RemoveSCacheFromHashTable(cm_scache_t *scp)
     }
 }
 
-/* called with cm_scacheLock and scp write-locked; recycles an existing scp. 
- *
- * this function ignores all of the locking hierarchy.  
- */
+/* called with cm_scacheLock and scp write-locked */
+void cm_ResetSCacheDirectory(cm_scache_t *scp)
+{
+#ifdef USE_BPLUS
+    /* destroy directory Bplus Tree */
+    if (scp->dirBplus) {
+        LARGE_INTEGER start, end;
+        QueryPerformanceCounter(&start);
+        bplus_free_tree++;
+        freeBtree(scp->dirBplus);
+        scp->dirBplus = NULL;
+        QueryPerformanceCounter(&end);
+
+        bplus_free_time += (end.QuadPart - start.QuadPart);
+    }
+#endif
+}
+
+/* called with cm_scacheLock and scp write-locked; recycles an existing scp. */
 long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags)
 {
     if (scp->refCount != 0) {
@@ -207,19 +222,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags)
      */
     cm_FreeAllACLEnts(scp);
 
-#ifdef USE_BPLUS
-    /* destroy directory Bplus Tree */
-    if (scp->dirBplus) {
-        LARGE_INTEGER start, end;
-        QueryPerformanceCounter(&start);
-        bplus_free_tree++;
-        freeBtree(scp->dirBplus);
-        scp->dirBplus = NULL;
-        QueryPerformanceCounter(&end);
-
-        bplus_free_time += (end.QuadPart - start.QuadPart);
-    }
-#endif
+    cm_ResetSCacheDirectory(scp);
     return 0;
 }
 
index 2320807..5494916 100644 (file)
@@ -409,4 +409,6 @@ extern void cm_RemoveSCacheFromHashTable(cm_scache_t *scp);
 extern void cm_AdjustScacheLRU(cm_scache_t *scp);
 
 extern int cm_DumpSCache(FILE *outputFile, char *cookie, int lock);
+
+extern void cm_ResetSCacheDirectory(cm_scache_t *scp);
 #endif /*  __CM_SCACHE_H_ENV__ */