Skip to content

Commit 8c879d4

Browse files
committed
adaptive packetcache cleaning interval
1 parent 8c03126 commit 8c879d4

File tree

3 files changed

+34
-23
lines changed

3 files changed

+34
-23
lines changed

pdns/packetcache.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ PacketCache::PacketCache()
4343
d_ttl=-1;
4444
d_recursivettl=-1;
4545

46+
d_lastclean=time(0);
47+
d_cleanskipped=false;
48+
d_nextclean=d_cleaninterval=4096;
49+
4650
S.declare("packetcache-hit");
4751
S.declare("packetcache-miss");
4852
S.declare("packetcache-size");
@@ -429,3 +433,28 @@ void PacketCache::cleanup()
429433

430434
DLOG(L<<"Done with cache clean"<<endl);
431435
}
436+
437+
void PacketCache::cleanupIfNeeded()
438+
{
439+
if (d_ops++ == d_nextclean) {
440+
int timediff = max((int)(time(0) - d_lastclean), 1);
441+
442+
DLOG(L<<"cleaninterval: "<<d_cleaninterval<<", timediff: "<<timediff<<endl);
443+
444+
if (d_cleaninterval == 300000 && timediff < 30) {
445+
d_cleanskipped = true;
446+
d_nextclean += d_cleaninterval;
447+
448+
DLOG(L<<"cleaning skipped, timediff: "<<timediff<<endl);
449+
450+
return;
451+
}
452+
if(d_cleanskipped) {
453+
d_cleanskipped = false;
454+
}
455+
456+
d_nextclean += d_cleaninterval;
457+
d_lastclean=time(0);
458+
cleanup();
459+
}
460+
}

pdns/packetcache.hh

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,7 @@ public:
6868

6969

7070
int size() { return *d_statnumentries; } //!< number of entries in the cache
71-
void cleanupIfNeeded()
72-
{
73-
if(!(++d_ops % 300000)) {
74-
if(d_lastclean + 30 < time(0)) {
75-
d_lastclean=time(0);
76-
cleanup();
77-
}
78-
}
79-
}
71+
void cleanupIfNeeded();
8072
void cleanup(); //!< force the cache to preen itself from expired packets
8173
int purge();
8274
int purge(const std::string& match); // could be $ terminated. Is not a dnsname!
@@ -147,7 +139,10 @@ private:
147139
}
148140

149141
AtomicCounter d_ops;
150-
time_t d_lastclean{0}; // doesn't need to be atomic
142+
time_t d_lastclean; // doesn't need to be atomic
143+
unsigned long d_nextclean;
144+
int d_cleaninterval;
145+
bool d_cleanskipped;
151146
AtomicCounter *d_statnumhit;
152147
AtomicCounter *d_statnummiss;
153148
AtomicCounter *d_statnumentries;

regression-tests/startpdns

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)