// this function can clean any cache that has a getTTD() method on its entries, a preRemoval() method and a 'sequence' index as its second index
// the ritual is that the oldest entries are in *front* of the sequence collection, so on a hit, move an item to the end
// and optionally, on a miss, move it to the beginning
-template <typename S, typename C, typename T> void pruneCollection(C& container, T& collection, size_t maxCached, size_t scanFraction = 1000)
+template <typename S, typename C, typename T>
+void pruneCollection(C& container, T& collection, size_t maxCached, size_t scanFraction = 1000)
{
const time_t now = time(nullptr);
size_t toTrim = 0;
auto& sidx = collection.template get<S>();
- // two modes - if toTrim is 0, just look through 1/scanFraction of all records
+ // two modes - if toTrim is 0, just look through 1/scanFraction of all records
// and nuke everything that is expired
// otherwise, scan first 5*toTrim records, and stop once we've nuked enough
const size_t lookAt = toTrim ? 5 * toTrim : cacheSize / scanFraction;
size_t tried = 0, erased = 0;
- for (auto iter = sidx.begin(); iter != sidx.end() && tried < lookAt ; ++tried) {
+ for (auto iter = sidx.begin(); iter != sidx.end() && tried < lookAt; ++tried) {
if (iter->getTTD() < now) {
iter = sidx.erase(iter);
erased++;
}
// note: this expects iterator from first index
-template <typename S, typename T> void moveCacheItemToFrontOrBack(T& collection, typename T::iterator& iter, bool front)
+template <typename S, typename T>
+void moveCacheItemToFrontOrBack(T& collection, typename T::iterator& iter, bool front)
{
typedef typename T::template index<S>::type sequence_t;
- sequence_t& sidx=collection.template get<S>();
- typename sequence_t::iterator si=collection.template project<S>(iter);
- if(front)
+ sequence_t& sidx = collection.template get<S>();
+ typename sequence_t::iterator si = collection.template project<S>(iter);
+ if (front)
sidx.relocate(sidx.begin(), si); // at the beginning of the delete queue
else
- sidx.relocate(sidx.end(), si); // back
+ sidx.relocate(sidx.end(), si); // back
}
-template <typename S, typename T> void moveCacheItemToFront(T& collection, typename T::iterator& iter)
+template <typename S, typename T>
+void moveCacheItemToFront(T& collection, typename T::iterator& iter)
{
moveCacheItemToFrontOrBack<S>(collection, iter, true);
}
-template <typename S, typename T> void moveCacheItemToBack(T& collection, typename T::iterator& iter)
+template <typename S, typename T>
+void moveCacheItemToBack(T& collection, typename T::iterator& iter)
{
moveCacheItemToFrontOrBack<S>(collection, iter, false);
}
-template <typename S, typename T> uint64_t pruneLockedCollectionsVector(std::vector<T>& maps)
+template <typename S, typename T>
+uint64_t pruneLockedCollectionsVector(std::vector<T>& maps)
{
uint64_t totErased = 0;
time_t now = time(nullptr);
- for(auto& mc : maps) {
+ for (auto& mc : maps) {
auto map = mc.d_map.write_lock();
uint64_t lookAt = (map->size() + 9) / 10; // Look at 10% of this shard
uint64_t erased = 0;
auto& sidx = boost::multi_index::get<S>(*map);
- for(auto i = sidx.begin(); i != sidx.end() && lookAt > 0; lookAt--) {
- if(i->ttd < now) {
+ for (auto i = sidx.begin(); i != sidx.end() && lookAt > 0; lookAt--) {
+ if (i->ttd < now) {
i = sidx.erase(i);
erased++;
- } else {
+ }
+ else {
++i;
}
}
return totErased;
}
-template <typename S, typename C, typename T> uint64_t pruneMutexCollectionsVector(C& container, std::vector<T>& maps, uint64_t maxCached, uint64_t cacheSize)
+template <typename S, typename C, typename T>
+uint64_t pruneMutexCollectionsVector(C& container, std::vector<T>& maps, uint64_t maxCached, uint64_t cacheSize)
{
time_t now = time(nullptr);
uint64_t totErased = 0;
if (cacheSize > maxCached) {
toTrim = cacheSize - maxCached;
lookAt = 5 * toTrim;
- } else {
+ }
+ else {
lookAt = cacheSize / 10;
}
i = sidx.erase(i);
erased++;
--content.d_entriesCount;
- } else {
+ }
+ else {
++i;
}
return totErased;
}
-template <typename T> uint64_t purgeLockedCollectionsVector(std::vector<T>& maps)
+template <typename T>
+uint64_t purgeLockedCollectionsVector(std::vector<T>& maps)
{
- uint64_t delcount=0;
+ uint64_t delcount = 0;
- for(auto& mc : maps) {
+ for (auto& mc : maps) {
auto map = mc.d_map.write_lock();
delcount += map->size();
map->clear();
return delcount;
}
-template <typename N, typename T> uint64_t purgeLockedCollectionsVector(std::vector<T>& maps, const std::string& match)
+template <typename N, typename T>
+uint64_t purgeLockedCollectionsVector(std::vector<T>& maps, const std::string& match)
{
- uint64_t delcount=0;
+ uint64_t delcount = 0;
std::string prefix(match);
- prefix.resize(prefix.size()-1);
+ prefix.resize(prefix.size() - 1);
DNSName dprefix(prefix);
- for(auto& mc : maps) {
+ for (auto& mc : maps) {
auto map = mc.d_map.write_lock();
auto& idx = boost::multi_index::get<N>(*map);
auto iter = idx.lower_bound(dprefix);
auto start = iter;
- for(; iter != idx.end(); ++iter) {
- if(!iter->qname.isPartOf(dprefix)) {
+ for (; iter != idx.end(); ++iter) {
+ if (!iter->qname.isPartOf(dprefix)) {
break;
}
delcount++;
return delcount;
}
-template <typename N, typename T> uint64_t purgeExactLockedCollection(T& mc, const DNSName& qname)
+template <typename N, typename T>
+uint64_t purgeExactLockedCollection(T& mc, const DNSName& qname)
{
- uint64_t delcount=0;
+ uint64_t delcount = 0;
auto map = mc.d_map.write_lock();
auto& idx = boost::multi_index::get<N>(*map);
auto range = idx.equal_range(qname);
- if(range.first != range.second) {
+ if (range.first != range.second) {
delcount += distance(range.first, range.second);
idx.erase(range.first, range.second);
}
return delcount;
}
-template<typename S, typename Index>
+template <typename S, typename Index>
bool lruReplacingInsert(Index& i, const typename Index::value_type& x)
{
auto inserted = i.insert(x);