Hi all.

Recently we switched from ugly firewall rules to powerdns backends our geo
dns.

Unfortunately for us, the geo backend was made to serve only one domain (lot
of static variables inside the class).

We've patched it and now each instance can handle one domain.

Comments are welcome.

-- 
José Arthur Benetasso Villanova (azlev)
diff --git a/modules/geobackend/geobackend.cc b/modules/geobackend/geobackend.cc
index 0a79099..1624ef9 100644
--- a/modules/geobackend/geobackend.cc
+++ b/modules/geobackend/geobackend.cc
@@ -25,17 +25,7 @@ using boost::trim_right;
 
 // Static members
 
-IPPrefTree * GeoBackend::ipt;
-vector<string> GeoBackend::nsRecords;
-map<string, GeoRecord*> GeoBackend::georecords;
-string GeoBackend::soaMasterServer;
-string GeoBackend::soaHostmaster;
-string GeoBackend::zoneName;
-uint32_t GeoBackend::geoTTL;
-uint32_t GeoBackend::nsTTL;
-time_t GeoBackend::lastDiscoverTime = 0;
 const string GeoBackend::logprefix = "[geobackend] ";
-bool GeoBackend::first = true;
 int GeoBackend::backendcount = 0;
 pthread_mutex_t GeoBackend::startup_lock;
 pthread_mutex_t GeoBackend::ipt_lock;
@@ -49,36 +39,30 @@ GeoRecord::GeoRecord() : origin(".") {}
 GeoBackend::GeoBackend(const string &suffix) : forceReload(false) {
 	setArgPrefix("geo" + suffix);
 	
-	// Make sure only one (the first) backend instance is initializing static things
-	Lock lock(&startup_lock);
-
-	backendcount++;
-
-	if (!first)
-		return;
-	first = false;
-	
 	ipt = NULL;
+	lastDiscoverTime = 0;
 	
 	loadZoneName();
 	loadTTLValues();
 	loadSOAValues();
 	loadNSRecords();
 	reload();
+
+	// Make sure only one (the first) backend instance is initializing static things
+	Lock lock(&startup_lock);
+	backendcount++;
 }
 
 GeoBackend::~GeoBackend() {
+	for (map<string, GeoRecord*>::iterator i = georecords.begin(); i != georecords.end(); ++i)
+		delete i->second;
+	
+	if (ipt != NULL) {
+		delete ipt;
+		ipt = NULL;
+	}
 	Lock lock(&startup_lock);
 	backendcount--;	
-	if (backendcount == 0) {
-		for (map<string, GeoRecord*>::iterator i = georecords.begin(); i != georecords.end(); ++i)
-			delete i->second;
-		
-		if (ipt != NULL) {
-			delete ipt;
-			ipt = NULL;
-		}
-	}
 }
 
 bool GeoBackend::getSOA(const string &name, SOAData &soadata, DNSPacket *p) {
diff --git a/modules/geobackend/geobackend.hh b/modules/geobackend/geobackend.hh
index 1ba6471..7010864 100644
--- a/modules/geobackend/geobackend.hh
+++ b/modules/geobackend/geobackend.hh
@@ -43,21 +43,22 @@ public:
 	
 private:
 	// Static resources, shared by all instances
-	static IPPrefTree *ipt;
-	static vector<string> nsRecords;
-	static map<string, GeoRecord*> georecords;
-	static string soaMasterServer;
-	static string soaHostmaster;
-	static string zoneName;
-	static uint32_t geoTTL;
-	static uint32_t nsTTL;
-	static time_t lastDiscoverTime;
 	const static string logprefix;
-	
+
+	// Instance variables: to load multiple domains
+	IPPrefTree *ipt;
+	vector<string> nsRecords;
+	map<string, GeoRecord*> georecords;
+	string soaMasterServer;
+	string soaHostmaster;
+	string zoneName;
+	uint32_t geoTTL;
+	uint32_t nsTTL;
+	time_t lastDiscoverTime;
+
 	bool forceReload;
 	
 	// Locking
-	static bool first;
 	static int backendcount;
 	static pthread_mutex_t startup_lock;
 	static pthread_mutex_t ipt_lock;
_______________________________________________
Pdns-users mailing list
[email protected]
http://mailman.powerdns.com/mailman/listinfo/pdns-users

Reply via email to