]> granicus.if.org Git - pdns/commitdiff
reload all lmdb backend threads
authorKees Monshouwer <mind04@monshouwer.org>
Sat, 20 Sep 2014 21:03:31 +0000 (23:03 +0200)
committermind04 <mind04@monshouwer.org>
Sun, 21 Sep 2014 09:02:46 +0000 (11:02 +0200)
modules/lmdbbackend/lmdbbackend.cc
modules/lmdbbackend/lmdbbackend.hh

index 9195021dcb819dc70b1fac897ebcd6847b4641a7..92a21884010e042d1796769d86111dd051f0970b 100644 (file)
@@ -30,6 +30,7 @@
 #define DEBUGLOG(msg) do {} while(0)
 #endif
 
+int LMDBBackend::s_reloadcount=0;
 pthread_mutex_t LMDBBackend::s_initlock = PTHREAD_MUTEX_INITIALIZER;
 
 LMDBBackend::LMDBBackend(const string &suffix)
@@ -41,6 +42,7 @@ LMDBBackend::LMDBBackend(const string &suffix)
     catch (ArgException e) {
       d_doDnssec = false;
     }
+    d_lastreload = s_reloadcount;
     open_db();
 }
 
@@ -123,8 +125,15 @@ LMDBBackend::~LMDBBackend()
 }
 
 void LMDBBackend::reload() {
+  ++s_reloadcount;
+}
+
+void LMDBBackend::needReload() {
+  if (s_reloadcount > d_lastreload) {
+    d_lastreload = s_reloadcount;
     close_db();
     open_db();
+  }
 }
 
 bool LMDBBackend::getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta)
@@ -132,6 +141,8 @@ bool LMDBBackend::getDomainMetadata(const string& name, const std::string& kind,
   if (!d_doDnssec)
     return false;
 
+  needReload();
+
   if (kind == "PRESIGNED" || kind == "NSEC3PARAM") {
     int rc;
     MDB_val key, data;
@@ -166,6 +177,8 @@ bool LMDBBackend::getDirectNSECx(uint32_t id, const string &hashed, const QType
   if (!d_doDnssec)
     return false;
 
+  needReload();
+
   MDB_val key, data;
   string key_str, cur_key, cur_value;
   vector<string> keyparts, valparts;
@@ -236,6 +249,8 @@ bool LMDBBackend::getDirectRRSIGs(const string &signer, const string &qname, con
   if (!d_doDnssec)
     return false;
 
+  needReload();
+
   int rc;
   MDB_val key, data;
   string key_str, cur_value;
@@ -276,6 +291,8 @@ bool LMDBBackend::getDirectRRSIGs(const string &signer, const string &qname, con
 // Get the zone name of the requested zone (labelReversed) OR the name of the closest parrent zone
 bool LMDBBackend::getAuthZone( string &rev_zone )
 {
+    needReload();
+
     MDB_val key, data;
     // XXX can do this just using char *
 
@@ -315,6 +332,8 @@ bool LMDBBackend::getAuthZone( string &rev_zone )
 
 bool LMDBBackend::getAuthData( SOAData &soa, DNSPacket *p )
 {
+    needReload();
+
     MDB_val key, value;
     if( mdb_cursor_get(zone_cursor, &key, &value, MDB_GET_CURRENT) )
         return false;
@@ -358,6 +377,8 @@ void LMDBBackend::lookup(const QType &type, const string &inQdomain, DNSPacket *
 {
     DEBUGLOG("lookup: " <<inQdomain << " " << type.getName() << endl);
 
+    needReload();
+
     d_first = true;
     d_origdomain = inQdomain;
     d_curqtype = type;
index aeaa2765a513d5d208beeae3b126a3c037eae769..5e14faf7c325fc11813ff1688d92406cf2f778dd 100644 (file)
@@ -37,9 +37,14 @@ private:
     // d_querykey with some additional bits potentially tacked on to make searching faster
     string d_searchkey;
 
+    // d_lastreload last time the db was reloaded
+    int d_lastreload;
+
     void open_db();
     void close_db();
+    void needReload();
     inline bool get_finished();
+    static int s_reloadcount;
     static pthread_mutex_t s_initlock;
 
 public: