for(vector<DomainInfo>::const_iterator i=cmdomains.begin();i!=cmdomains.end();++i) {
extern PacketCache PC;
- PC.purge(i->zone.toString()); // fixes cvstrac ticket #30
+ PC.purgeExact(i->zone);
queueNotifyDomain(i->zone,P->getBackend());
i->backend->setNotified(i->id,i->serial);
}
d_nq.add(domain, ip);
d_any_sem.post();
}
-
return delcount;
}
+int PacketCache::purgeExact(const DNSName& qname)
+{
+ int delcount=0;
+ auto& mc = getMap(qname);
+
+ WriteLock l(&mc.d_mut);
+ auto range = mc.d_map.equal_range(tie(qname));
+ if(range.first != range.second) {
+ delcount+=distance(range.first, range.second);
+ mc.d_map.erase(range.first, range.second);
+ }
+ *d_statnumentries-=delcount; // XXX FIXME NEEDS TO BE ADJUSTED (for packetcache shards)
+ return delcount;
+}
+
/* purges entries from the packetcache. If match ends on a $, it is treated as a suffix */
int PacketCache::purge(const string &match)
{
- int delcount=0;
if(ends_with(match, "$")) {
+ int delcount=0;
string prefix(match);
prefix.resize(prefix.size()-1);
DNSName dprefix(prefix);
}
mc.d_map.erase(start, iter);
}
+ *d_statnumentries-=delcount; // XXX FIXME NEEDS TO BE ADJUSTED (for packetcache shards)
+ return delcount;
}
else {
- DNSName dn(match);
- auto& mc = getMap(dn);
-
- WriteLock l(&mc.d_mut);
- auto range = mc.d_map.equal_range(tie(dn));
- if(range.first != range.second) {
- delcount+=distance(range.first, range.second);
- mc.d_map.erase(range.first, range.second);
- }
+ return purgeExact(DNSName(match));
}
-
- *d_statnumentries-=delcount; // XXX FIXME NEEDS TO BE ADJUSTED
- return delcount;
}
// called from ueberbackend
bool PacketCache::getEntry(const DNSName &qname, const QType& qtype, CacheEntryType cet, vector<DNSResourceRecord>& value, int zoneID)
void cleanup(); //!< force the cache to preen itself from expired packets
int purge();
int purge(const std::string& match); // could be $ terminated. Is not a dnsname!
+ int purgeExact(const DNSName& qname); // no wildcard matching here
map<char,int> getCounts();
private:
#endif /* PACKETCACHE_HH */
-
di.backend->commitTransaction();
extern PacketCache PC;
- PC.purge(zonename.toString()); // XXX DNSName pain - this seems the wrong way round!
+ PC.purgeExact(zonename);
// now the PTRs
for(const DNSResourceRecord& rr : new_ptrs) {
throw ApiException("PTR-Hosting backend for "+rr.qname.toString()+"/"+rr.qtype.getName()+" does not support editing records.");
}
sd.db->commitTransaction();
- PC.purge(rr.qname.toString());
+ PC.purgeExact(rr.qname);
}
// success