method of MapCombo. Likewise for negcache.
}
for (auto& content : maps) {
- auto mc = C::lock(content.d_content);
+ auto mc = content.d_content.lock();
mc->invalidate();
auto& sidx = boost::multi_index::get<S>(mc->d_map);
uint64_t erased = 0, lookedAt = 0;
toTrim -= totErased;
- while (true) {
+ while (true) {
size_t pershard = toTrim / maps_size + 1;
for (auto& content : maps) {
- auto mc = C::lock(content.d_content);
+ auto mc = content.d_content.lock();
mc->invalidate();
auto& sidx = boost::multi_index::get<S>(mc->d_map);
size_t removed = 0;
{
uint64_t c = 0, a = 0;
for (auto& mc : d_maps) {
- auto content = lock(mc.d_content);
+ auto content = mc.d_content.lock();
c += content->d_contended_count;
a += content->d_acquired_count;
}
// XXX!
size_t count = 0;
for (auto& mc : d_maps) {
- auto content = lock(mc.d_content);
+ auto content = mc.d_content.lock();
count += content->d_ecsIndex.size();
}
return count;
{
size_t ret = 0;
for (auto& mc : d_maps) {
- auto m = lock(mc.d_content);
+ auto m = mc.d_content.lock();
for (const auto& i : m->d_map) {
ret += sizeof(struct CacheEntry);
ret += i.d_qname.toString().length();
}
auto& mc = getMap(qname);
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
/* If we don't have any netmask-specific entries at all, let's just skip this
to be able to use the nice d_cachecache hack. */
void MemRecursorCache::replace(time_t now, const DNSName &qname, const QType qt, const vector<DNSRecord>& content, const vector<shared_ptr<RRSIGRecordContent>>& signatures, const std::vector<std::shared_ptr<DNSRecord>>& authorityRecs, bool auth, const DNSName& authZone, boost::optional<Netmask> ednsmask, const OptTag& routingTag, vState state, boost::optional<ComboAddress> from)
{
auto& mc = getMap(qname);
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
map->d_cachecachevalid = false;
if (ednsmask) {
if (!sub) {
auto& mc = getMap(name);
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
map->d_cachecachevalid = false;
auto& idx = map->d_map.get<OrderedTag>();
auto range = idx.equal_range(name);
}
else {
for (auto& mc : d_maps) {
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
map->d_cachecachevalid = false;
auto& idx = map->d_map.get<OrderedTag>();
for (auto i = idx.lower_bound(name); i != idx.end(); ) {
bool MemRecursorCache::doAgeCache(time_t now, const DNSName& name, const QType qtype, uint32_t newTTL)
{
auto& mc = getMap(name);
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
cache_t::iterator iter = map->d_map.find(tie(name, qtype));
if (iter == map->d_map.end()) {
return false;
}
auto& mc = getMap(qname);
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
bool updated = false;
if (!map->d_ecsIndex.empty() && !routingTag) {
uint64_t count = 0;
for (auto& mc : d_maps) {
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
const auto& sidx = map->d_map.get<SequencedTag>();
time_t now = time(nullptr);
LockGuarded<LockedContent> d_content;
std::atomic<uint64_t> d_entriesCount{0};
+
+ LockGuardedTryHolder<LockedContent> lock()
+ {
+ auto locked = d_content.try_lock();
+ if (!locked.owns_lock()) {
+ locked.lock();
+ ++locked->d_contended_count;
+ }
+ ++locked->d_acquired_count;
+ return locked;
+ }
};
vector<MapCombo> d_maps;
time_t handleHit(MapCombo::LockedContent& content, OrderedTagIterator_t& entry, const DNSName& qname, uint32_t& origTTL, vector<DNSRecord>* res, vector<std::shared_ptr<RRSIGRecordContent>>* signatures, std::vector<std::shared_ptr<DNSRecord>>* authorityRecs, bool* variable, boost::optional<vState>& state, bool* wasAuth, DNSName* authZone);
public:
- static LockGuardedTryHolder<MapCombo::LockedContent> lock(LockGuarded<MapCombo::LockedContent>& content)
- {
- auto locked = content.try_lock();
- if (!locked.owns_lock()) {
- locked.lock();
- ++locked->d_contended_count;
- }
- ++locked->d_acquired_count;
- return locked;
- }
-
void preRemoval(MapCombo::LockedContent& map, const CacheEntry& entry)
{
if (entry.d_netmask.empty()) {
DNSName lastLabel = qname.getLastLabel();
auto& map = getMap(lastLabel);
- auto content = lock(map.d_content);
+ auto content = map.d_content.lock();
negcache_t::const_iterator ni = content->d_map.find(tie(lastLabel, qtnull));
bool NegCache::get(const DNSName& qname, const QType& qtype, const struct timeval& now, NegCacheEntry& ne, bool typeMustMatch)
{
auto& map = getMap(qname);
- auto content = lock(map.d_content);
+ auto content = map.d_content.lock();
const auto& idx = content->d_map.get<NegCacheEntry>();
auto range = idx.equal_range(qname);
{
bool inserted = false;
auto& map = getMap(ne.d_name);
- auto content = lock(map.d_content);
+ auto content = map.d_content.lock();
inserted = lruReplacingInsert<SequenceTag>(content->d_map, ne);
if (inserted) {
++map.d_entriesCount;
void NegCache::updateValidationStatus(const DNSName& qname, const QType& qtype, const vState newState, boost::optional<time_t> capTTD)
{
auto& mc = getMap(qname);
- auto map = lock(mc.d_content);
+ auto map = mc.d_content.lock();
auto range = map->d_map.equal_range(tie(qname, qtype));
if (range.first != range.second) {
size_t NegCache::count(const DNSName& qname)
{
auto& map = getMap(qname);
- auto content = lock(map.d_content);
+ auto content = map.d_content.lock();
return content->d_map.count(tie(qname));
}
size_t NegCache::count(const DNSName& qname, const QType qtype)
{
auto& map = getMap(qname);
- auto content = lock(map.d_content);
+ auto content = map.d_content.lock();
return content->d_map.count(tie(qname, qtype));
}
size_t ret = 0;
if (subtree) {
for (auto& map : d_maps) {
- auto m = lock(map.d_content);
+ auto m = map.d_content.lock();
for (auto i = m->d_map.lower_bound(tie(name)); i != m->d_map.end();) {
if (!i->d_name.isPartOf(name))
break;
}
auto& map = getMap(name);
- auto content = lock(map.d_content);
+ auto content = map.d_content.lock();
auto range = content->d_map.equal_range(tie(name));
auto i = range.first;
while (i != range.second) {
void NegCache::clear()
{
for (auto& map : d_maps) {
- auto m = lock(map.d_content);
+ auto m = map.d_content.lock();
m->d_map.clear();
map.d_entriesCount = 0;
}
size_t ret = 0;
for (auto& mc : d_maps) {
- auto m = lock(mc.d_content);
+ auto m = mc.d_content.lock();
auto& sidx = m->d_map.get<SequenceTag>();
for (const NegCacheEntry& ne : sidx) {
ret++;
};
LockGuarded<LockedContent> d_content;
std::atomic<uint64_t> d_entriesCount{0};
+
+ LockGuardedTryHolder<MapCombo::LockedContent> lock()
+ {
+ auto locked = d_content.try_lock();
+ if (!locked.owns_lock()) {
+ locked.lock();
+ ++locked->d_contended_count;
+ }
+ ++locked->d_acquired_count;
+ return locked;
+ }
};
vector<MapCombo> d_maps;
}
public:
- static LockGuardedTryHolder<MapCombo::LockedContent> lock(LockGuarded<MapCombo::LockedContent>& content)
- {
- auto locked = content.try_lock();
- if (!locked.owns_lock()) {
- locked.lock();
- ++locked->d_contended_count;
- }
- ++locked->d_acquired_count;
- return locked;
- }
void preRemoval(MapCombo::LockedContent& map, const NegCacheEntry& entry)
{