am fba413d8: Merge changes I04fad67e,I5ab24bc7
* commit 'fba413d831766c3ed871b9787f60d9111045b36f':
logd: KISS & fix preserve a day
logd: deal with sloppy leading expire messages
diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp
index 8c0a0be..913e1f1 100644
--- a/logd/LogBuffer.cpp
+++ b/logd/LogBuffer.cpp
@@ -388,7 +388,6 @@
bool kick = false;
bool leading = true;
LogBufferElementLast last;
- log_time start(log_time::EPOCH);
for(it = mLogElements.begin(); it != mLogElements.end();) {
LogBufferElement *e = *it;
@@ -417,8 +416,6 @@
continue;
}
- leading = false;
-
if (hasBlacklist && mPrune.naughty(e)) {
last.clear(e);
it = erase(it);
@@ -448,29 +445,24 @@
}
if (e->getUid() != worst) {
- 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;
@@ -479,15 +471,21 @@
kick = true;
unsigned short len = e->getMsgLen();
- stats.drop(e);
- e->setDropped(1);
- if (last.merge(e, 1)) {
- it = mLogElements.erase(it);
- stats.erase(e);
- delete e;
+
+ // do not create any leading drops
+ if (leading) {
+ it = erase(it);
} else {
- last.add(e);
- ++it;
+ stats.drop(e);
+ e->setDropped(1);
+ if (last.merge(e, 1)) {
+ it = mLogElements.erase(it);
+ stats.erase(e);
+ delete e;
+ } else {
+ last.add(e);
+ ++it;
+ }
}
if (worst_sizes < second_worst_sizes) {
break;