]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Removed Rock-specific code from StoreController.
authorAlex Rousskov <rousskov@measurement-factory.com>
Thu, 12 May 2011 03:58:16 +0000 (21:58 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Thu, 12 May 2011 03:58:16 +0000 (21:58 -0600)
Allow Store::dereference(e) to indicate whether the entry should
be kept in the global index. Old SwapDirs keep it. Newer code that
maintains entry tables dedicated to each cache_dir does not.

12 files changed:
src/MemStore.cc
src/MemStore.h
src/Store.h
src/StoreHashIndex.h
src/SwapDir.cc
src/SwapDir.h
src/fs/rock/RockSwapDir.cc
src/fs/rock/RockSwapDir.h
src/fs/ufs/store_dir_ufs.cc
src/fs/ufs/ufscommon.h
src/store_dir.cc
src/tests/testStore.h

index 15154365969216b9d9dc1129c0d0497efeb5caba..c9f77a86c40b912d0f8b011af366734a5f1c3868 100644 (file)
@@ -113,9 +113,11 @@ MemStore::reference(StoreEntry &)
 {
 }
 
-void
+bool
 MemStore::dereference(StoreEntry &)
 {
+    // no need to keep e in the global store_table for us; we have our own map
+    return false;
 }
 
 int
index 16710fd29c887915b8cff22c7f1d9b65efba89a7..7f803d79082c50e01d26bb0afa9725a54db34dde 100644 (file)
@@ -39,7 +39,7 @@ public:
     virtual void stat(StoreEntry &) const;
     virtual StoreSearch *search(String const url, HttpRequest *);
     virtual void reference(StoreEntry &);
-    virtual void dereference(StoreEntry &);
+    virtual bool dereference(StoreEntry &);
     virtual void maintain();
 
     static int64_t EntryLimit();
index ccb50f8ab453aeca00682ca5268d299a0ff5ca07..254e18cd656fca9e503ddeb470b1f0c7802e6240 100644 (file)
@@ -328,7 +328,8 @@ public:
     /* pulled up from SwapDir for migration.... probably do not belong here */
     virtual void reference(StoreEntry &) = 0;  /* Reference this object */
 
-    virtual void dereference(StoreEntry &) = 0;        /* Unreference this object */
+    /// Undo reference(), returning false iff idle e should be destroyed
+    virtual bool dereference(StoreEntry &e) = 0;
 
     virtual void maintain() = 0; /* perform regular maintenance should be private and self registered ... */
 
index f7b78a73a0cefa5e6b7bbb0b11d6237c853df1c1..4ec269f4296e27e84a5814854d78164a7bd723ea 100644 (file)
@@ -77,7 +77,7 @@ public:
 
     virtual void reference(StoreEntry&);
 
-    virtual void dereference(StoreEntry&);
+    virtual bool dereference(StoreEntry&);
 
     virtual void maintain();
 
index 913c4e673d913941ad1e1e2917318b51456468e3..cb0fcf3c605715a2319686dfb7811f37923471fc 100644 (file)
@@ -103,8 +103,11 @@ SwapDir::minSize() const
 void
 SwapDir::reference(StoreEntry &) {}
 
-void
-SwapDir::dereference(StoreEntry &) {}
+bool
+SwapDir::dereference(StoreEntry &)
+{
+    return true; // keep in global store_table
+}
 
 int
 SwapDir::callback()
index a92f7079a066ab2bff422e29442260906f84d37a..4e5558491cdf2ad13aa67608b411b585203429ab 100644 (file)
@@ -83,7 +83,7 @@ public:
 
     virtual void reference(StoreEntry &);      /* Reference this object */
 
-    virtual void dereference(StoreEntry &);    /* Unreference this object */
+    virtual bool dereference(StoreEntry &);    /* Unreference this object */
 
     /* the number of store dirs being rebuilt. */
     static int store_dirs_rebuilding;
@@ -199,7 +199,7 @@ public:
     virtual bool canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const = 0;
     /* These two are notifications */
     virtual void reference(StoreEntry &);      /* Reference this object */
-    virtual void dereference(StoreEntry &);    /* Unreference this object */
+    virtual bool dereference(StoreEntry &);    /* Unreference this object */
     virtual int callback();    /* Handle pending callbacks */
     virtual void sync();       /* Sync the store prior to shutdown */
     virtual StoreIOState::Pointer createStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *) = 0;
index bcafc17e2c25b511c087d7ba027cc2580e487ecd..ddb3c11465d6188db0617f58f07088d24f850481 100644 (file)
@@ -608,12 +608,15 @@ Rock::SwapDir::reference(StoreEntry &e)
         repl->Referenced(repl, &e, &e.repl);
 }
 
-void
+bool
 Rock::SwapDir::dereference(StoreEntry &e)
 {
     debugs(47, 5, HERE << &e << ' ' << e.swap_dirn << ' ' << e.swap_filen);
     if (repl && repl->Dereferenced)
         repl->Dereferenced(repl, &e, &e.repl);
+
+    // no need to keep e in the global store_table for us; we have our own map
+    return false;
 }
 
 void
index 04c21589e5ac246f3836b865b2f9e3f3de42961c..095dee5e1248567ff472d0c68f98d31ec97beb2c 100644 (file)
@@ -48,7 +48,7 @@ protected:
     virtual void maintain();
     virtual void diskFull();
     virtual void reference(StoreEntry &e);
-    virtual void dereference(StoreEntry &e);
+    virtual bool dereference(StoreEntry &e);
     virtual void unlink(StoreEntry &e);
     virtual void statfs(StoreEntry &e) const;
 
index da36b6396c987d48a5656661b8e277bf49312288..f1014300aac558240f52facfa2a5640ffeca996e 100644 (file)
@@ -424,13 +424,15 @@ UFSSwapDir::reference(StoreEntry &e)
  * This routine is called whenever the last reference to an object is
  * removed, to maintain replacement information within the storage fs.
  */
-void
+bool
 UFSSwapDir::dereference(StoreEntry & e)
 {
     debugs(47, 3, "UFSSwapDir::dereference: referencing " << &e << " " << e.swap_dirn << "/" << e.swap_filen);
 
     if (repl->Dereferenced)
         repl->Dereferenced(repl, &e, &e.repl);
+
+    return true; // keep e in the global store_table
 }
 
 StoreIOState::Pointer
index 883c99f9d4a60d24153e6424923ce900bb7ade8f..35fad81a081a4be8b4abffdc013a2a6fec1de03e 100644 (file)
@@ -64,7 +64,7 @@ public:
     virtual void maintain();
     virtual bool canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const;
     virtual void reference(StoreEntry &);
-    virtual void dereference(StoreEntry &);
+    virtual bool dereference(StoreEntry &);
     virtual StoreIOState::Pointer createStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
     virtual StoreIOState::Pointer openStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
     virtual void openLog();
index 4f414b31831fee3736d4cc07dfd7e15116f01824..699e9e35a36cf73f16d9dadcba67886b9c698d5b 100644 (file)
@@ -665,7 +665,7 @@ StoreController::reference(StoreEntry &e)
     /* Notify the fs that we're referencing this object again */
 
     if (e.swap_dirn > -1)
-        e.store()->reference(e);
+        swapDir->reference(e);
 
     // Notify the memory cache that we're referencing this object again
     if (memStore && e.mem_status == IN_MEMORY)
@@ -678,23 +678,27 @@ StoreController::reference(StoreEntry &e)
     }
 }
 
-void
+bool
 StoreController::dereference(StoreEntry & e)
 {
+    bool keepInStoreTable = false;
+
     /* Notify the fs that we're not referencing this object any more */
 
     if (e.swap_filen > -1)
-        e.store()->dereference(e);
+        keepInStoreTable = swapDir->dereference(e) || keepInStoreTable;
 
     // Notify the memory cache that we're not referencing this object any more
     if (memStore && e.mem_status == IN_MEMORY)
-        memStore->dereference(e);
+        keepInStoreTable = memStore->dereference(e) || keepInStoreTable;
 
     // TODO: move this code to a non-shared memory cache class when we have it
     if (e.mem_obj) {
         if (mem_policy->Dereferenced)
             mem_policy->Dereferenced(mem_policy, &e, &e.mem_obj->repl);
     }
+
+    return keepInStoreTable;
 }
 
 StoreEntry *
@@ -758,11 +762,9 @@ StoreController::handleIdleEntry(StoreEntry &e)
             (mem_node::InUseCount() <= store_pages_max);
     }
 
-    dereference(e);
-
-    // XXX: Rock store specific: Since each SwapDir controls its index,
-    // unlocked entries should not stay in the global store_table.
-    if (fileno >= 0) {
+    // An idle, unlocked entry that belongs to a SwapDir which controls
+    // its own index, should not stay in the global store_table.
+    if (!dereference(e)) {
         debugs(20, 5, HERE << "destroying unlocked entry: " << &e << ' ' << e);
         destroyStoreEntry(static_cast<hash_link*>(&e));
         return;
@@ -972,12 +974,16 @@ StoreHashIndex::stat(StoreEntry & output) const
 }
 
 void
-StoreHashIndex::reference(StoreEntry&)
-{}
+StoreHashIndex::reference(StoreEntry &e)
+{
+    e.store()->reference(e);
+}
 
-void
-StoreHashIndex::dereference(StoreEntry&)
-{}
+bool
+StoreHashIndex::dereference(StoreEntry &e)
+{
+    return e.store()->dereference(e);
+}
 
 void
 StoreHashIndex::maintain()
index 08ceebaeaef37bef147dd9b9e35f5764d625c5bc..a0c65fa47699d125c7d6b6fb4606f256b3d6dbfc 100644 (file)
@@ -63,7 +63,7 @@ public:
 
     virtual void reference(StoreEntry &) {}    /* Reference this object */
 
-    virtual void dereference(StoreEntry &) {}  /* Unreference this object */
+    virtual bool dereference(StoreEntry &) { return true; }
 
     virtual StoreSearch *search(String const url, HttpRequest *);
 };