diff options
author | Mark Salyzyn <salyzyn@google.com> | 2015-05-15 15:58:17 -0700 |
---|---|---|
committer | Mark Salyzyn <salyzyn@google.com> | 2015-05-20 10:03:11 -0700 |
commit | 94a811ab19006ec6c4d8057f3bf81d79308d28f6 (patch) | |
tree | 1dbd299be1d23da8a231bcbeb72d0a7058cd14d5 /logd | |
parent | 7eb3abdb3ba500d3acca82b95705f34128251015 (diff) | |
download | system_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.cpp | 22 | ||||
-rw-r--r-- | logd/LogBufferElement.h | 5 |
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; |