]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Split RegisteredRunner cache management away from cache manager class
authorAmos Jeffries <squid3@treenet.co.nz>
Wed, 9 Sep 2015 13:37:00 +0000 (06:37 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Wed, 9 Sep 2015 13:37:00 +0000 (06:37 -0700)
src/auth/CredentialsCache.cc
src/auth/CredentialsCache.h

index 685f5e102cf62a5e52327717d464f1831f3427cf..70c08fdf235bb17a021bae71c7ac0c9d1210108d 100644 (file)
@@ -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"
 
 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<CredentialsCache> 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);
     }
index 8c2b9c0b47ce0571a139081ad5b117a9a87b4219..a428876e96e79aa415227d4eae05cce25d977054 100644 (file)
@@ -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<Auth::User::Pointer> 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