d_ttl=-1;
d_recursivettl=-1;
+ d_lastclean=time(0);
+ d_cleanskipped=false;
+ d_nextclean=d_cleaninterval=4096;
+
S.declare("packetcache-hit");
S.declare("packetcache-miss");
S.declare("packetcache-size");
DLOG(L<<"Starting cache clean, cacheSize: "<<cacheSize<<", lookAt: "<<lookAt<<", toTrim: "<<toTrim<<endl);
- time_t now=time(0);
+ time_t now = time(0);
unsigned int totErased = 0;
for(auto& mc : d_maps) {
WriteLock wl(&mc.d_mut);
DLOG(L<<"Done with cache clean, cacheSize: "<<*d_statnumentries<<", totErased"<<totErased<<endl);
}
+
+void PacketCache::cleanupIfNeeded()
+{
+ if (d_ops++ == d_nextclean) {
+ int timediff = max((int)(time(0) - d_lastclean), 1);
+
+ DLOG(L<<"cleaninterval: "<<d_cleaninterval<<", timediff: "<<timediff<<endl);
+
+ if (d_cleaninterval == 300000 && timediff < 30) {
+ d_cleanskipped = true;
+ d_nextclean += d_cleaninterval;
+
+ DLOG(L<<"cleaning skipped, timediff: "<<timediff<<endl);
+
+ return;
+ }
+
+ if(!d_cleanskipped) {
+ d_cleaninterval=(int)(0.6*d_cleaninterval)+(0.4*d_cleaninterval*(30.0/timediff));
+ d_cleaninterval=std::max(d_cleaninterval, 1000);
+ d_cleaninterval=std::min(d_cleaninterval, 300000);
+
+ DLOG(L<<"new cleaninterval: "<<d_cleaninterval<<endl);
+ } else {
+ d_cleanskipped = false;
+ }
+
+ d_nextclean += d_cleaninterval;
+ d_lastclean=time(0);
+ cleanup();
+ }
+}
int size() { return *d_statnumentries; } //!< number of entries in the cache
- void cleanupIfNeeded()
- {
- if(!(++d_ops % 300000)) {
- if(d_lastclean + 30 < time(0)) {
- d_lastclean=time(0);
- cleanup();
- }
- }
- }
+ void cleanupIfNeeded();
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!
}
AtomicCounter d_ops;
- time_t d_lastclean{0}; // doesn't need to be atomic
+ time_t d_lastclean; // doesn't need to be atomic
+ unsigned long d_nextclean;
+ int d_cleaninterval;
+ bool d_cleanskipped;
AtomicCounter *d_statnumhit;
AtomicCounter *d_statnummiss;
AtomicCounter *d_statnumentries;