From: Bert Hubert Date: Sat, 7 Apr 2007 18:07:59 +0000 (+0000) Subject: implement multiple master mode, plus make room in sql tables for multiple masters X-Git-Tag: pdns-2.9.21~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4232a932d733711c74a7e30b28fca755f9722d9f;p=pdns implement multiple master mode, plus make room in sql tables for multiple masters git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1017 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/backends/bind/bindparser.yy b/pdns/backends/bind/bindparser.yy index 5ffbb3e4e..a0897a782 100644 --- a/pdns/backends/bind/bindparser.yy +++ b/pdns/backends/bind/bindparser.yy @@ -213,7 +213,9 @@ masters: /* empty */ master: AWORD { - s_di.master=$1; + if(!s_di.master.empty()) + s_di.master.append(1, ' '); + s_di.master.append($1); free($1); } ; diff --git a/pdns/communicator.cc b/pdns/communicator.cc index 5497e938e..fc6019f13 100644 --- a/pdns/communicator.cc +++ b/pdns/communicator.cc @@ -1,6 +1,6 @@ /* PowerDNS Versatile Database Driven Nameserver - Copyright (C) 2002-2005 PowerDNS.COM BV + Copyright (C) 2002-2007 PowerDNS.COM BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as @@ -20,7 +20,7 @@ #include #include "communicator.hh" #include - +#include #include "dnsbackend.hh" #include "ueberbackend.hh" #include "packethandler.hh" @@ -64,7 +64,7 @@ void CommunicatorClass::suck(const string &domain,const string &remote) bool first=true; try { Resolver resolver; - resolver.axfr(remote,domain.c_str()); + resolver.axfr(remote, domain.c_str()); UeberBackend *B=dynamic_cast(P.getBackend()); @@ -250,37 +250,47 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P) Resolver resolver; resolver.makeUDPSocket(); d_slaveschanged=true; - uint32_t ourserial=i->serial,theirserial=0; + uint32_t ourserial=i->serial, theirserial=0; + + if(d_havepriosuckrequest) { + d_havepriosuckrequest=false; + break; + } - try { - if(d_havepriosuckrequest) { - d_havepriosuckrequest=false; + vector masters; + stringtok(masters, i->master, ", \t"); + for(vector::const_iterator iter = masters.begin(); iter != masters.end(); ++iter) { + try { + resolver.getSoaSerial(*iter, i->zone, &theirserial); + + if(theirserialserial) { + L<zone<<" more recent than master, our serial "< their serial "<backend->setFresh(i->id); + } + else if(theirserial==i->serial) { + L<zone<<" is fresh"<backend->setFresh(i->id); + } + else { + L<zone<<" is stale, master serial "<serial<zone, *iter); + } break; } - - resolver.getSoaSerial(i->master, i->zone, &theirserial); - - if(theirserialserial) { - L<zone<<" more recent than master, our serial "< their serial "<backend->setFresh(i->id); - } - else if(theirserial==i->serial) { - L<zone<<" is fresh"<backend->setFresh(i->id); + catch(ResolverException &re) { + L<zone+"': "+re.reason<zone+"'"<zone<<" is stale, master serial "<serial<zone,i->master); + catch(AhuException &re) { + L<zone+"': "+re.reason<zone+"'"<zone+"': "+re.reason<