{
}
-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
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();
/* 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 ... */
virtual void reference(StoreEntry&);
- virtual void dereference(StoreEntry&);
+ virtual bool dereference(StoreEntry&);
virtual void maintain();
void
SwapDir::reference(StoreEntry &) {}
-void
-SwapDir::dereference(StoreEntry &) {}
+bool
+SwapDir::dereference(StoreEntry &)
+{
+ return true; // keep in global store_table
+}
int
SwapDir::callback()
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;
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;
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
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;
* 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
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();
/* 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)
}
}
-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 *
(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;
}
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()
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 *);
};