From: Amos Jeffries Date: Wed, 9 Sep 2015 13:37:00 +0000 (-0700) Subject: Split RegisteredRunner cache management away from cache manager class X-Git-Tag: SQUID_4_0_1~21^2~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=51087401801f137af4b553ed2e7bc3f00d39fa60;p=thirdparty%2Fsquid.git Split RegisteredRunner cache management away from cache manager class --- diff --git a/src/auth/CredentialsCache.cc b/src/auth/CredentialsCache.cc index 685f5e102c..70c08fdf23 100644 --- a/src/auth/CredentialsCache.cc +++ b/src/auth/CredentialsCache.cc @@ -11,6 +11,7 @@ #include "squid.h" #include "acl/Gadgets.h" #include "auth/CredentialsCache.h" +#include "base/RunnersRegistry.h" #include "Debug.h" #include "event.h" #include "SquidConfig.h" @@ -18,16 +19,51 @@ namespace Auth { +class CredentialCacheRr : public RegisteredRunner +{ +public: + explicit CredentialCacheRr(const char *n, CredentialsCache * const c) : + name(n), + whichCache(c) + {} + + virtual ~CredentialCacheRr() { + debugs(29, 5, "Terminating username cache: " << name); + // invalidate the CBDATA reference. + // causes Auth::*::User::Cache() to produce nil / invalid pointer + delete whichCache.get(); + } + + virtual void endingShutdown() override { + debugs(29, 5, "Clearing username cache: " << name); + whichCache->reset(); + } + + virtual void syncConfig() override { + if (!whichCache.valid()) + return; + + debugs(29, 5, "Reconfiguring username cache: " << name); + whichCache->doConfigChangeCleanup(); + } + +private: + /// name of the cache being managed, for logs + const char *name; + + /// reference to the scheme cache which is being managed + CbcPointer whichCache; +}; + CBDATA_CLASS_INIT(CredentialsCache); CredentialsCache::CredentialsCache(const char *name) : gcScheduled_(false), - cachename(name), cacheCleanupEventName("User cache cleanup: ") { debugs(29, 5, "initializing " << name << " username cache"); cacheCleanupEventName.append(name); - RegisterRunner(this); + RegisterRunner(new Auth::CredentialCacheRr(name, this)); } Auth::User::Pointer @@ -105,17 +141,11 @@ CredentialsCache::scheduleCleanup() } void -CredentialsCache::endingShutdown() -{ - debugs(29, 5, "Shutting down username cache " << cachename); - eventDelete(&CredentialsCache::Cleanup, this); - reset(); -} - -void -CredentialsCache::syncConfig() +CredentialsCache::doConfigChangeCleanup() { - debugs(29, 5, "Reconfiguring username cache " << cachename); + // purge expired entries entirely + cleanup(); + // purge the ACL match data stored in the credentials for (auto i : store_) { aclCacheMatchFlush(&i.second->proxy_match_cache); } diff --git a/src/auth/CredentialsCache.h b/src/auth/CredentialsCache.h index 8c2b9c0b47..a428876e96 100644 --- a/src/auth/CredentialsCache.h +++ b/src/auth/CredentialsCache.h @@ -10,7 +10,6 @@ #define SQUID_SRC_AUTH_CREDENTIALSCACHE_H #include "auth/User.h" -#include "base/RunnersRegistry.h" #include "cbdata.h" #include "SBufAlgos.h" @@ -19,7 +18,7 @@ namespace Auth { /// Cache of Auth::User credentials, keyed by Auth::User::userKey -class CredentialsCache : public RegisteredRunner +class CredentialsCache { private: CBDATA_CLASS(CredentialsCache); @@ -56,13 +55,16 @@ public: /// cache garbage collection, removes timed-out entries void cleanup(); + /** + * Cleanup cache data after a reconfiguration has occured. + * Similar to cleanup() but also flushes stale config dependent + * state from retained entries. + */ + void doConfigChangeCleanup(); + /// obtain alphanumerically sorted list of usernames std::vector sortedUsersList() const; - /* RegisteredRunner API */ - virtual void endingShutdown() override; - virtual void syncConfig() override; - private: void scheduleCleanup(); @@ -71,9 +73,6 @@ private: StoreType store_; - // for logs, events etc. - const char *cachename; - // c_str() raw pointer is used in event. std::string must not reallocate // after ctor and until shutdown // must be unique