logd: KISS & fix preserve a day

Code in 833a9b1e38 was borken,
simpler approach is to simply check last entry (to save a
syscall) minus EXPIRE_HOUR_THRESHOLD. This does make longer logs
less likely to call upon the spam detection than the algorithm
being replaced, but sadly we ended up with a log entry in the
future at the beginning of the logs confounding the previous
algorithm.

Bug: 21555259
Change-Id: I04fad67e95c8496521dbabb73b5f32c19d6a16c2
This commit is contained in:
Mark Salyzyn 2015-06-01 09:41:19 -07:00
parent 5392aac95d
commit 5921276a16

View file

@ -388,7 +388,6 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
bool kick = false;
bool leading = true;
LogBufferElementLast last;
log_time start(log_time::EPOCH);
for(it = mLogElements.begin(); it != mLogElements.end();) {
LogBufferElement *e = *it;
@ -446,30 +445,24 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
}
if (e->getUid() != worst) {
leading = false;
if (start != log_time::EPOCH) {
if (leading) {
static const timespec too_old = {
EXPIRE_HOUR_THRESHOLD * 60 * 60, 0
};
start = e->getRealTime() + too_old;
LogBufferElementCollection::iterator last;
last = mLogElements.end();
--last;
if ((e->getRealTime() < ((*last)->getRealTime() - too_old))
|| (e->getRealTime() > (*last)->getRealTime())) {
break;
}
}
leading = false;
last.clear(e);
++it;
continue;
}
if ((start != log_time::EPOCH) && (e->getRealTime() > start)) {
// KISS. Really a heuristic rather than algorithmically strong,
// a crude mechanism, the following loops will move the oldest
// watermark possibly wiping out the extra EXPIRE_HOUR_THRESHOLD
// we just thought we were preserving. We count on the typical
// pruneRows of 10% of total not being a sledgehammer.
// A stronger algorithm would have us loop back to the top if
// we have worst-UID enabled and we start expiring messages
// below less than EXPIRE_HOUR_THRESHOLD old.
break;
}
pruneRows--;
if (pruneRows == 0) {
break;