]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
DNS caching stuff (almost done)
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 7 Jan 2007 21:35:25 +0000 (21:35 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 7 Jan 2007 21:35:25 +0000 (21:35 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6252 e03df62e-2008-0410-955e-edbf42e46eb7

include/dns.h
include/inspircd.h
src/dns.cpp
src/modules.cpp
src/modules/extra/m_pgsql.cpp
src/modules/m_cgiirc.cpp
src/modules/m_dnsbl.cpp
src/modules/m_http_client.cpp
src/modules/m_spanningtree.cpp
src/modules/m_testcommand.cpp
src/users.cpp

index 83e4ab902224d472e116c279d5b4eefd3a8faf09..bfced41846fef83949d9ec4bb0212708b232462d 100644 (file)
@@ -194,6 +194,16 @@ class Resolver : public Extensible
         * The core uses this to route results to the correct objects.
         */
        int myid;
+
+       /**
+        * Cached result, if there is one
+        */
+       CachedQuery *CQ;
+
+       /**
+        * Time left before cache expiry
+        */
+       int time_left;
  public:
        /**
         * Initiate DNS lookup. Your class should not attempt to delete or free these
@@ -238,7 +248,7 @@ class Resolver : public Extensible
         * When your lookup completes, this method will be called.
         * @param result The resulting DNS lookup, either an IP address or a hostname.
         */
-       virtual void OnLookupComplete(const std::string &result, unsigned int ttl);
+       virtual void OnLookupComplete(const std::string &result, unsigned int ttl) = 0;
        /**
         * If an error occurs (such as NXDOMAIN, no domain name found) then this method
         * will be called.
@@ -260,6 +270,8 @@ class Resolver : public Extensible
         * Returns the creator module, or NULL
         */
        Module* GetCreator();
+
+       void TriggerCachedResult();
 };
 
 /** DNS is a singleton class used by the core to dispatch dns
index 3f6b702f15ccecba6221d1b666d12d3c148a4b61..136914276ada0904571794749ac76a4c35562ab5 100644 (file)
@@ -885,9 +885,10 @@ class InspIRCd : public classbase
 
        /** Add a dns Resolver class to this server's active set
         * @param r The resolver to add
+        * @param cached The value of 'cached' which you passed to the Resolver constructor before this function.
         * @return True if the resolver was added
         */
-        bool AddResolver(Resolver* r);
+        bool AddResolver(Resolver* r, bool cached);
 
        /** Add a command to this server's command parser
         * @param f A command_t command handler object to add
index 385f8639ea91f97ec6b443f146f7f4432cdcdfca..a8aaa3fde3827473106feb7cf61865beb4bb5d45 100644 (file)
@@ -911,9 +911,10 @@ void DNS::DelCache(const std::string &source)
        cache->erase(source.c_str());
 }
 
-void Resolver::OnLookupComplete(const std::string &result, unsigned int ttl)
+void Resolver::TriggerCachedResult()
 {
-       throw CoreException("Someone didnt define an OnLookupComplete method for their Resolver class!");
+       if (CQ)
+               OnLookupComplete(CQ->data, time_left);
 }
 
 /** High level abstraction of dns used by application at large */
@@ -923,10 +924,10 @@ Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt,
 
        cached = false;
 
-       CachedQuery* CQ = ServerInstance->Res->GetCache(source);
+       CQ = ServerInstance->Res->GetCache(source);
        if (CQ)
        {
-               int time_left = CQ->CalcTTLRemaining();
+               time_left = CQ->CalcTTLRemaining();
                if (!time_left)
                {
                        ServerInstance->Log(DEBUG,"Cached but EXPIRED result: %s", CQ->data.c_str());
@@ -936,7 +937,6 @@ Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt,
                {
                        cached = true;
                        ServerInstance->Log(DEBUG,"Cached result: %s", CQ->data.c_str());
-                       OnLookupComplete(CQ->data, time_left);
                        return;
                }
        }
index 9590926410a6f50bcb9dc5662790c4af00f350f5..8d5ca846f1349257447960ecfffb2afa691cff55 100644 (file)
@@ -434,9 +434,16 @@ bool InspIRCd::DelModeWatcher(ModeWatcher* mw)
        return this->Modes->DelModeWatcher(mw);
 }
 
-bool InspIRCd::AddResolver(Resolver* r)
+bool InspIRCd::AddResolver(Resolver* r, bool cached)
 {
-       return this->Res->AddResolverClass(r);
+       if (!cached)
+               return this->Res->AddResolverClass(r);
+       else
+       {
+               r->TriggerCachedResult();
+               delete r;
+               return true;
+       }
 }
 
 bool InspIRCd::UserToPseudo(userrec* user, const std::string &message)
index d72256a5ffa52961e49f931f1b94d44d6c3b2528..d5041f6f752e4adcebb00ddca352999fd644985c 100644 (file)
@@ -1101,10 +1101,7 @@ public:
                                {
                                        bool cached;
                                        resolver = new SQLresolver(this, ServerInstance, host, cached);
-                                       if (!cached)
-                                               ServerInstance->AddResolver(resolver);
-                                       else
-                                               delete resolver;
+                                       ServerInstance->AddResolver(resolver, cached);
                                }
                                catch(...)
                                {
index 6df039dceb82226e43c5560231c1731c952b4a5a..a5f0bca3e74ae5c28f97b2deebaec526942b714b 100644 (file)
@@ -261,10 +261,7 @@ public:
                                {
                                        bool cached;
                                        CGIResolver* r = new CGIResolver(this, ServerInstance, NotifyOpers, user->password, false, user, user->GetFd(), "PASS", cached);
-                                       if (!cached)
-                                               ServerInstance->AddResolver(r);
-                                       else
-                                               delete r;
+                                       ServerInstance->AddResolver(r, cached);
                                }
                                catch (ModuleException& e)
                                {
@@ -321,10 +318,7 @@ public:
                        ServerInstance->Log(DEBUG,"MAKE RESOLVER: %s %d %s",newip, user->GetFd(), "IDENT");
                        bool cached;
                        CGIResolver* r = new CGIResolver(this, ServerInstance, NotifyOpers, newip, false, user, user->GetFd(), "IDENT", cached);
-                       if (!cached)
-                               ServerInstance->AddResolver(r);
-                       else
-                               delete r;
+                       ServerInstance->AddResolver(r, cached);
                }
                catch (ModuleException& e)
                {
index d6581a7d1cc4e7182f8f827b9ea496244aa4a740..a60c2eb0c9c2e99c98a7167a33666515ae6c9d0c 100644 (file)
@@ -309,10 +309,7 @@ class ModuleDNSBL : public Module
                                /* now we'd need to fire off lookups for `hostname'. */
                                bool cached;
                                DNSBLResolver *r = new DNSBLResolver(this, ServerInstance, hostname, user, user->GetFd(), *i, cached);
-                               if (!cached)
-                                       ServerInstance->AddResolver(r);
-                               else
-                                       delete r;
+                               ServerInstance->AddResolver(r, cached);
                        }
                }
 
index 92a9aa34839e39aa2ad1fbe3124e885ae6533052..6891aa9726648b9ac37ce6180e1e21333056d822 100644 (file)
@@ -151,10 +151,7 @@ bool HTTPSocket::DoRequest(HTTPClientRequest *req)
        {
                bool cached;
                HTTPResolver* r = new HTTPResolver(this, Server, url.domain, cached, (Module*)Mod);
-               if (!cached)
-                       Instance->AddResolver(r);
-               else
-                       delete r;
+               Instance->AddResolver(r, cached);
                return true;
        }
        else
index cbecfa24f1bf117cdab3ac52048793e4521268c8..6cc46f119b2fc2345deaa4d39496b2c21ce4a2c5 100644 (file)
@@ -4124,10 +4124,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                                        {
                                                bool cached;
                                                SecurityIPResolver* sr = new SecurityIPResolver((Module*)this->Creator, this, ServerInstance, L.IPAddr, L, cached);
-                                               if (!cached)
-                                                       ServerInstance->AddResolver(sr);
-                                               else
-                                                       delete sr;
+                                               ServerInstance->AddResolver(sr, cached);
                                        }
                                        catch (ModuleException& e)
                                        {
@@ -4659,10 +4656,7 @@ class ModuleSpanningTree : public Module
                        {
                                bool cached;
                                ServernameResolver* snr = new ServernameResolver((Module*)this, Utils, ServerInstance,x->IPAddr, *x, cached);
-                               if (!cached)
-                                       ServerInstance->AddResolver(snr);
-                               else
-                                       delete snr;
+                               ServerInstance->AddResolver(snr, cached);
                        }
                        catch (ModuleException& e)
                        {
index 55632c98e435cf9431f4c827af29c7c9e863f2ad..761196978b176c45ffe4379a41fb02daa2888087 100644 (file)
@@ -60,24 +60,11 @@ class cmd_woot : public command_t
                 * do it for us as required.*/
                try
                {
-                       bool cached1, cached2;
-                       MyV6Resolver* r = new MyV6Resolver(ServerInstance, Creator, "shake.stacken.kth.se", true, cached1);
-                       if (!cached1)
-                               ServerInstance->AddResolver(r);
-                       else
-                       {
-                               ServerInstance->Log(DEBUG,"Result was cached, delete object");
-                               delete r;
-                       }
-
-                       r = new MyV6Resolver(ServerInstance, Creator, "2001:6b0:1:ea:202:a5ff:fecd:13a6", false, cached2);
-                       if (!cached2)
-                               ServerInstance->AddResolver(r);
-                       else
-                       {
-                               ServerInstance->Log(DEBUG,"Result was cached, delete object");
-                               delete r;
-                       }
+                       bool cached;
+                       MyV6Resolver* r = new MyV6Resolver(ServerInstance, Creator, "shake.stacken.kth.se", true, cached);
+                       ServerInstance->AddResolver(r, cached);
+                       r = new MyV6Resolver(ServerInstance, Creator, "2001:6b0:1:ea:202:a5ff:fecd:13a6", false, cached);
+                       ServerInstance->AddResolver(r, cached);
                }
                catch (ModuleException& e)
                {
index 37664a629d7560289fcd70efbd26ddda41aa173e..a42e86210fa58a53a90baf7bbd96875b947e187f 100644 (file)
@@ -153,10 +153,7 @@ void userrec::StartDNSLookup()
                ServerInstance->Log(DEBUG,"Passing instance: %08x",this->ServerInstance);
                bool cached;
                res_reverse = new UserResolver(this->ServerInstance, this, this->GetIPString(), DNS_QUERY_REVERSE, cached);
-               if (!cached)
-                       this->ServerInstance->AddResolver(res_reverse);
-               else
-                       delete res_reverse;
+               this->ServerInstance->AddResolver(res_reverse, cached);
        }
        catch (CoreException& e)
        {
@@ -189,10 +186,7 @@ void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl)
 #else
                                bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, DNS_QUERY_A, cached);
 #endif
-                               if (!cached)
-                                       this->ServerInstance->AddResolver(bound_user->res_forward);
-                               else
-                                       delete bound_user->res_forward;
+                               this->ServerInstance->AddResolver(bound_user->res_forward, cached);
                        }
                }
                catch (CoreException& e)