}
// Serial number cache
-bool LMDBBackend::SerialCache::get(domainid_t domainid, uint32_t& serial) const
+
+// Retrieve the transient domain info for the given domain, if any
+bool LMDBBackend::TransientDomainInfoCache::get(domainid_t domainid, TransientDomainInfo& data) const
{
- if (auto iter = d_serials.find(domainid); iter != d_serials.end()) {
- serial = iter->second;
+ if (auto iter = d_data.find(domainid); iter != d_data.end()) {
+ data = iter->second;
return true;
}
return false;
}
-void LMDBBackend::SerialCache::remove(domainid_t domainid)
+// Remove the transient domain info for the given domain
+void LMDBBackend::TransientDomainInfoCache::remove(domainid_t domainid)
{
- if (auto iter = d_serials.find(domainid); iter != d_serials.end()) {
- d_serials.erase(iter);
+ if (auto iter = d_data.find(domainid); iter != d_data.end()) {
+ d_data.erase(iter);
}
}
-void LMDBBackend::SerialCache::update(domainid_t domainid, uint32_t serial)
+// Create or update the transient domain info for the given domain
+void LMDBBackend::TransientDomainInfoCache::update(domainid_t domainid, const TransientDomainInfo& data)
+{
+ d_data.insert_or_assign(domainid, data);
+}
+
+// Return the contents of the first element and remove it
+bool LMDBBackend::TransientDomainInfoCache::pop(domainid_t& domainid, TransientDomainInfo& data)
{
- d_serials.insert_or_assign(domainid, serial);
+ auto iter = d_data.begin();
+ if (iter == d_data.end()) {
+ return false;
+ }
+ domainid = iter->first;
+ data = iter->second;
+ (void)d_data.erase(iter);
+ return true;
}
-SharedLockGuarded<LMDBBackend::SerialCache> LMDBBackend::s_notified_serial;
+SharedLockGuarded<LMDBBackend::TransientDomainInfoCache> LMDBBackend::s_transient_domain_info;
LMDBBackend::LMDBBackend(const std::string& suffix)
{
{
// Update the notified_serial value if we have a cached value in memory.
if (!d_write_notification_update) {
- auto container = s_notified_serial.read_lock();
- container->get(info.id, info.notified_serial);
+ auto container = s_transient_domain_info.read_lock();
+ TransientDomainInfo tdi;
+ container->get(info.id, tdi);
+ info.notified_serial = tdi.notified_serial;
}
}
void LMDBBackend::writeDomainInfo(const DomainInfo& info)
{
if (!d_write_notification_update) {
- uint32_t last_notified_serial{0};
- auto container = s_notified_serial.write_lock();
- container->get(info.id, last_notified_serial);
+ auto container = s_transient_domain_info.write_lock();
+ TransientDomainInfo tdi;
+ container->get(info.id, tdi);
// Only remove the in-memory value if it has not been modified since the
// DomainInfo data was set up.
- if (last_notified_serial == info.notified_serial) {
+ if (tdi.notified_serial == info.notified_serial) {
container->remove(info.id);
}
}
// Remove zone
{
- auto container = s_notified_serial.write_lock();
+ auto container = s_transient_domain_info.write_lock();
container->remove(static_cast<domainid_t>(id));
}
auto txn = d_tdomains->getRWTransaction();
DomainInfo info;
if (findDomain(domain_id, info)) {
- auto container = s_notified_serial.write_lock();
- container->update(info.id, serial);
+ auto container = s_transient_domain_info.write_lock();
+ TransientDomainInfo tdi;
+ // will need container->get(info.id, tdi); once TransientDomainInfo grows
+ // more fields.
+ tdi.notified_serial = serial;
+ container->update(info.id, tdi);
}
}
static void deleteNSEC3RecordPair(const std::shared_ptr<RecordsRWTransaction>& txn, domainid_t domain_id, const DNSName& qname);
void writeNSEC3RecordPair(const std::shared_ptr<RecordsRWTransaction>& txn, domainid_t domain_id, const DNSName& qname, const DNSName& ordername);
+ // Transient DomainInfo data, not necessarily synchronized with the
+ // database.
+ struct TransientDomainInfo
+ {
+ uint32_t notified_serial{};
+ };
// Cache of DomainInfo notified_serial values
- class SerialCache : public boost::noncopyable
+ class TransientDomainInfoCache : public boost::noncopyable
{
public:
- bool get(domainid_t domainid, uint32_t& serial) const;
+ bool get(domainid_t domainid, TransientDomainInfo& data) const;
void remove(domainid_t domainid);
- void update(domainid_t domainid, uint32_t serial);
+ void update(domainid_t domainid, const TransientDomainInfo& data);
+ bool pop(domainid_t& domainid, TransientDomainInfo& data);
private:
- std::unordered_map<domainid_t, uint32_t> d_serials;
+ std::unordered_map<domainid_t, TransientDomainInfo> d_data;
};
- static SharedLockGuarded<SerialCache> s_notified_serial;
+ static SharedLockGuarded<TransientDomainInfoCache> s_transient_domain_info;
ZoneName d_lookupdomain;
DNSName d_lookupsubmatch;