Hi!

This is an update to make the function getUpdatedMasters a little faster since 
it now use server-side processing instead of client processing.

(and also the performance increase for slave discussed earlier -  remember: 
there is no slave functionality in the backend - yet.).

For reference, see http://groups.google.com/group/mongodb-
user/browse_frm/thread/40d606279084eed4

-- 
//fredan
Index: test/mongodb.example.com.generate-hosts
===================================================================
--- test/mongodb.example.com.generate-hosts	(revision 2261)
+++ test/mongodb.example.com.generate-hosts	(arbetskopia)
@@ -1,4 +1,4 @@
-#!/usr/local/bin/bash
+#!/usr/bin/env bash
 
 h=0
 i=0
Index: master.cc
===================================================================
--- master.cc	(revision 2261)
+++ master.cc	(arbetskopia)
@@ -25,7 +25,7 @@
     virtual void getUpdatedMasters(vector<DomainInfo>* domains);
     virtual void setNotifed(int id, u_int32_t serial);
 */
-
+/*
 void MONGODBBackend::getUpdatedMasters(vector<DomainInfo>* domains) {
     //please see the function getTheFreshOnes in private.cc 
     
@@ -34,7 +34,38 @@
     
     getTheFreshOnes(domains, &type, &f_name);
 }
+*/
+void MONGODBBackend::getUpdatedMasters(vector<DomainInfo>* domains) {
+    string f_name = "(getUpdatedMasters)";
 
+    mongo::Query mongo_q = QUERY( "type" << "MASTER" << "$where" << "this.notified_serial != this.SOA.serial" );
+
+    auto_ptr<mongo::DBClientCursor> mongo_c;
+    mongo_c = m_db.query(collection_domains, mongo_q);
+
+    string m_q = mongo_q.toString();
+    
+    if(logging)
+        L<<Logger::Info << backend_name << f_name << " Query: "<< m_q << endl;
+
+    if (!mongo_c->more()) 
+        return;
+    
+    while(mongo_c->more()) {
+        DomainInfo di;
+        SOAData sd;
+
+        mongo::BSONObj mongo_r = mongo_c->next();
+
+        string domain = mongo_r.getStringField("domain");
+
+        if (checkDomainInfo(&domain, &mongo_r, &f_name, &m_q, &di, &sd)) {
+            di.serial = sd.serial;
+            domains->push_back(di);
+        }
+    }
+}
+
 void MONGODBBackend::setNotifed(int id, u_int32_t serial) {
     mongo::Query mongo_q = QUERY( "domain_id" << id );
     bson::bo update = BSON( "$set" << BSON("notified_serial" << serial ));
Index: schema.mongodb.sql
===================================================================
--- schema.mongodb.sql	(revision 2261)
+++ schema.mongodb.sql	(arbetskopia)
@@ -5,6 +5,7 @@
     { 	"domain_id" : int, 
 	"name" : string, 
 	"last_check" : int, 
+	"next_check" : int,
 	"notified_serial" : int, 
 	"type" : string, 
 	"ttl" : int,
Index: mongodbbackend.hh
===================================================================
--- mongodbbackend.hh	(revision 2261)
+++ mongodbbackend.hh	(arbetskopia)
@@ -37,6 +37,7 @@
     bool isMaster(const string &name, const string &ip);
     void getUnfreshSlaveInfos(vector<DomainInfo>* domains);
     void setFresh(int id);
+    void setFresh(uint32_t id, uint32_t refresh);
 /*
     bool startTransaction(const string &qname, int id);
     bool commitTransaction();
Index: slave.cc
===================================================================
--- slave.cc	(revision 2261)
+++ slave.cc	(arbetskopia)
@@ -36,18 +36,28 @@
 */
 
 void MONGODBBackend::setFresh(int id) {
+    SOAData soadata;
+    DomainInfo di;
+    string empty;
+    
+    if (getDomainInfo(empty, di, &soadata, id)) 
+	setFresh(id, ((unsigned int) time(0) + soadata.refresh));
+}
+
+void MONGODBBackend::setFresh(uint32_t id, uint32_t refresh ) {
     mongo::Query mongo_q = QUERY( "domain_id" << id );
-    bson::bo update = BSON( "$set" << BSON("last_check" << (unsigned int) time(0) ) );
+    bson::bo update = BSON( "$set" << BSON("last_check" << (unsigned int) time(0) << "next_check" << refresh) );
 
     if(logging) {
-        L<<Logger::Info << backend_name << "(setFresh)" << " Query: "<< mongo_q.toString() << endl;
+        L<<Logger::Info << backend_name << "(setFresh) Query: " << mongo_q.toString() << endl;
 	if(logging_content)
-    	    L<<Logger::Info << backend_name << "(setFresh)" << " Update: "<< update.toString() << endl;
+    	    L<<Logger::Info << backend_name << "(setFresh) Update: " << update.toString() << endl;
     }
     
     m_db.update(collection_domains, mongo_q , update, false );
 }
 
+/*
 void MONGODBBackend::getUnfreshSlaveInfos(vector<DomainInfo>* domains) {
     //please see the function getTheFreshOnes in private.cc
     
@@ -56,7 +66,44 @@
     
     getTheFreshOnes(domains, &type, &f_name);
 }
+*/
 
+void MONGODBBackend::getUnfreshSlaveInfos(vector<DomainInfo>* domains) {
+    string f_name = "(getUnfreshSlaveInfos)";
+
+    stringstream t;
+    t << (unsigned int) time(0);
+
+    mongo::Query mongo_q = QUERY( "type" << "SLAVE" << "next_refresh" << "{$lte:" + t.str() + "}");
+
+    auto_ptr<mongo::DBClientCursor> mongo_c;
+    mongo_c = m_db.query(collection_domains, mongo_q);
+
+    string m_q = mongo_q.toString();
+    
+    if(logging)
+        L<<Logger::Info << backend_name << f_name << " Query: " << m_q << endl;
+
+    if (!mongo_c->more()) 
+        return;
+    
+    while(mongo_c->more()) {
+        DomainInfo di;
+        SOAData sd;
+
+        mongo::BSONObj mongo_r = mongo_c->next();
+
+        string domain = mongo_r.getStringField("domain");
+
+        if (checkDomainInfo(&domain, &mongo_r, &f_name, &m_q, &di, &sd)) {
+            di.serial = sd.serial;
+            domains->push_back(di);
+        }
+    }
+
+
+}
+
 bool MONGODBBackend::isMaster(const string &domain, const string &ip) {
 
     mongo::Query mongo_q = QUERY( "name" << toLower(domain) );
Index: minimal.cc
===================================================================
--- minimal.cc	(revision 2261)
+++ minimal.cc	(arbetskopia)
@@ -67,62 +67,62 @@
 
 
 	    m_db.ensureIndex(collection_domains , BSON( "domain_id" << 1), true, "domain_id", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: domains: 'domain_id' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_domains << ": 'domain_id' done." << endl;
 
 	    m_db.ensureIndex(collection_domains , BSON( "name" << 1), true, "name", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: domains: 'name' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_domains << ": 'name' done." << endl;
 
-	    m_db.ensureIndex(collection_domains , BSON( "type" << 1), false, "type", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: domains: 'type' done." << endl;
+	    m_db.ensureIndex(collection_domains , BSON( "type" << 1 << "next_check" << 1), false, "type_next_check", true); //, true);
+	    L<<Logger::Error << backend_name << "Index: " << collection_domains << ": 'type_next_check' done." << endl;
 
 	    m_db.ensureIndex(collection_domains , BSON( "account" << 1), false, "account", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: domains: 'account' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_domains << ": 'account' done." << endl;
 
 
 	    m_db.ensureIndex(collection_records, BSON( "domain_id" << 1), false, "domain_id", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: records: 'domain_id' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_records << ": 'domain_id' done." << endl;
 	    
 	    m_db.ensureIndex(collection_records, BSON( "name" << 1), false, "name", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: records: 'name' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_records << ": 'name' done." << endl;
 
 	    m_db.ensureIndex(collection_records, BSON( "name" << 1 << "type" << 1), true, "name_type", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: records: 'name_type' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_records << ": 'name_type' done." << endl;
 
 	    m_db.ensureIndex(collection_records, BSON( "domain_id" << 1 << "auth" << 1 << "ordername" << -1), false, "domainid_auth_ordername_desc", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: records: 'domainid_auth_ordername_desc' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_records << ": 'domainid_auth_ordername_desc' done." << endl;
 
 	    m_db.ensureIndex(collection_records, BSON( "domain_id" << 1 << "auth" << 1 << "ordername" << 1), false, "domainid_auth_ordername_asc", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: records: 'domainid_auth_ordername_asc' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_records << ": 'domainid_auth_ordername_asc' done." << endl;
 
 	    m_db.ensureIndex(collection_records, BSON( "domain_id" << 1 << "name" << 1 ), false, "domainid_name", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: records: 'domainid_name' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_records << ": 'domainid_name' done." << endl;
 
 
 	    m_db.ensureIndex(collection_domainmetadata, BSON( "name" << 1 ), true, "name", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: domainmetadata: 'name' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_domainmetadata << ": 'name' done." << endl;
 
 	    m_db.ensureIndex(collection_domainmetadata, BSON( "name" << 1 << "content.kind" << 1), true, "name_kind", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: domainmetadata: 'name_kind' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_domainmetadata << ": 'name_kind' done." << endl;
 
 
 	    m_db.ensureIndex(collection_cryptokeys, BSON( "domain_id" << 1 ), true, "domain_id", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: cryptokeys: 'domain_id' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_cryptokeys << ": 'domain_id' done." << endl;
 
     	    m_db.ensureIndex(collection_cryptokeys, BSON( "name" << 1 ), true, "name", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: cryptokeys: 'name'  done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_cryptokeys << ": 'name'  done." << endl;
 
     	    m_db.ensureIndex(collection_cryptokeys, BSON( "name" << 1 << "domain_id" << 1), true, "name_domainid", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: cryptokeys: 'name_domainid'  done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_cryptokeys << ": 'name_domainid'  done." << endl;
 
     	    m_db.ensureIndex(collection_cryptokeys, BSON( "domain_id" << 1 << "content.id" << 1), true, "domainid_id", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: cryptokeys: 'domainid_id'  done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_cryptokeys << ": 'domainid_id'  done." << endl;
 
     	    m_db.ensureIndex(collection_cryptokeys, BSON( "name" << 1 << "content.id" << 1), true, "name_id", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: cryptokeys: 'name_id'  done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_cryptokeys << ": 'name_id'  done." << endl;
 
 
 	    m_db.ensureIndex(collection_tsigkeys, BSON( "name" << 1 << "content.algorithm" << 1), true, "name_algo", true); //, true);
-	    L<<Logger::Error << backend_name << "Index: tsigkeys: 'name_algo' done." << endl;
+	    L<<Logger::Error << backend_name << "Index: " << collection_tsigkeys << ": 'name_algo' done." << endl;
 
 
 	    L<<Logger::Error << backend_name << "(Re)creating index... DONE!" << endl;
_______________________________________________
Pdns-users mailing list
Pdns-users@mailman.powerdns.com
http://mailman.powerdns.com/mailman/listinfo/pdns-users

Reply via email to