summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2015-05-15 15:58:17 -0700
committerMark Salyzyn <salyzyn@google.com>2015-05-20 10:03:11 -0700
commit94a811ab19006ec6c4d8057f3bf81d79308d28f6 (patch)
tree1dbd299be1d23da8a231bcbeb72d0a7058cd14d5 /logd
parent7eb3abdb3ba500d3acca82b95705f34128251015 (diff)
downloadsystem_core-94a811ab19006ec6c4d8057f3bf81d79308d28f6.zip
system_core-94a811ab19006ec6c4d8057f3bf81d79308d28f6.tar.gz
system_core-94a811ab19006ec6c4d8057f3bf81d79308d28f6.tar.bz2
logd: worst-UID only to preserve a day
(cherry pick from commit 833a9b1e38ce65f2cdf3ebd095aaa99a92eb9467) Do not invoke worst-UID pruning in the face of other UIDs logs that are more than a day old, switch to pruning oldest only. Change-Id: Icf988b8d5458400a660d0f8e9d2df3f9d9a4c2d9
Diffstat (limited to 'logd')
-rw-r--r--logd/LogBuffer.cpp22
-rw-r--r--logd/LogBufferElement.h5
2 files changed, 26 insertions, 1 deletions
diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp
index c33dca6..8c0a0be 100644
--- a/logd/LogBuffer.cpp
+++ b/logd/LogBuffer.cpp
@@ -295,7 +295,8 @@ public:
ssize_t index = -1;
while((index = next(index)) >= 0) {
LogBufferElement *l = editEntryAt(index).getLast();
- if ((l->getDropped() >= 4) && (current > l->getRealTime().nsec())) {
+ if ((l->getDropped() >= EXPIRE_THRESHOLD)
+ && (current > l->getRealTime().nsec())) {
removeAt(index);
index = -1;
}
@@ -387,6 +388,7 @@ 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,11 +448,29 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
}
if (e->getUid() != worst) {
+ if (start != log_time::EPOCH) {
+ static const timespec too_old = {
+ EXPIRE_HOUR_THRESHOLD * 60 * 60, 0
+ };
+ start = e->getRealTime() + too_old;
+ }
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;
diff --git a/logd/LogBufferElement.h b/logd/LogBufferElement.h
index 5dabaac..3dcf9d1 100644
--- a/logd/LogBufferElement.h
+++ b/logd/LogBufferElement.h
@@ -48,6 +48,11 @@ static inline bool worstUidEnabledForLogid(log_id_t id) {
class LogBuffer;
+#define EXPIRE_HOUR_THRESHOLD 24 // Only expire chatty UID logs to preserve
+ // non-chatty UIDs less than this age in hours
+#define EXPIRE_THRESHOLD 4 // A smaller expire count is considered too
+ // chatty for the temporal expire messages
+
class LogBufferElement {
const log_id_t mLogId;
const uid_t mUid;