summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2015-08-19 17:06:11 -0700
committerMark Salyzyn <salyzyn@google.com>2015-08-20 11:33:57 -0700
commit0c5ab13a72f4ab76fe37b111550d8a64e70b5e7c (patch)
treee9b4e2c51b6fbb1011c0408347fd2933605313cb /logd
parentc2f7eee26b07498c0adf357fa8970716d8fac31f (diff)
downloadsystem_core-0c5ab13a72f4ab76fe37b111550d8a64e70b5e7c.zip
system_core-0c5ab13a72f4ab76fe37b111550d8a64e70b5e7c.tar.gz
system_core-0c5ab13a72f4ab76fe37b111550d8a64e70b5e7c.tar.bz2
logd: worst uid record watermark
(cherry pick from commit c892ea3fa80dfd3d35c5a3b8bfdc73e7b85eaede) Hold on to last worst uid watermark and bypass a spike to O(n*n*x) (n=samples, x=number of spammers) wrt chatty trimming. Bug: 23327476 Change-Id: I9f21ce95e969b67e576417a760f75c4d86acf364
Diffstat (limited to 'logd')
-rw-r--r--logd/LogBuffer.cpp19
-rw-r--r--logd/LogBuffer.h5
2 files changed, 23 insertions, 1 deletions
diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp
index 85f770a..db3f26c 100644
--- a/logd/LogBuffer.cpp
+++ b/logd/LogBuffer.cpp
@@ -240,7 +240,12 @@ void LogBuffer::maybePrune(log_id_t id) {
LogBufferElementCollection::iterator LogBuffer::erase(LogBufferElementCollection::iterator it) {
LogBufferElement *e = *it;
+ log_id_t id = e->getLogId();
+ LogBufferIteratorMap::iterator f = mLastWorstUid[id].find(e->getUid());
+ if ((f != mLastWorstUid[id].end()) && (it == f->second)) {
+ mLastWorstUid[id].erase(f);
+ }
it = mLogElements.erase(it);
stats.subtract(e);
delete e;
@@ -399,8 +404,17 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
bool kick = false;
bool leading = true;
+ it = mLogElements.begin();
+ if (worst != (uid_t) -1) {
+ LogBufferIteratorMap::iterator f = mLastWorstUid[id].find(worst);
+ if ((f != mLastWorstUid[id].end())
+ && (f->second != mLogElements.end())) {
+ leading = false;
+ it = f->second;
+ }
+ }
LogBufferElementLast last;
- for(it = mLogElements.begin(); it != mLogElements.end();) {
+ while (it != mLogElements.end()) {
LogBufferElement *e = *it;
if (oldest && (oldest->mStart <= e->getSequence())) {
@@ -450,8 +464,10 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
continue;
}
+ // unmerged drop message
if (dropped) {
last.add(e);
+ mLastWorstUid[id][e->getUid()] = it;
++it;
continue;
}
@@ -496,6 +512,7 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
delete e;
} else {
last.add(e);
+ mLastWorstUid[id][e->getUid()] = it;
++it;
}
}
diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h
index 76571c6..e94598c 100644
--- a/logd/LogBuffer.h
+++ b/logd/LogBuffer.h
@@ -40,6 +40,11 @@ class LogBuffer {
LogStatistics stats;
PruneList mPrune;
+ // watermark of any worst/chatty uid processing
+ typedef std::unordered_map<uid_t,
+ LogBufferElementCollection::iterator>
+ LogBufferIteratorMap;
+ LogBufferIteratorMap mLastWorstUid[LOG_ID_MAX];
unsigned long mMaxSize[LOG_ID_MAX];