summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2015-06-04 13:35:30 -0700
committerMark Salyzyn <salyzyn@google.com>2015-06-05 10:20:55 -0700
commitc1e9d6dada4fe20c0537c13cf3ff5a010d208ba1 (patch)
tree12f49bb34b85a86c9f6724c87ca4eb41d325eda2 /logd
parent5a9233444b519cb866cc657a4dce27c45f089a97 (diff)
downloadsystem_core-c1e9d6dada4fe20c0537c13cf3ff5a010d208ba1.zip
system_core-c1e9d6dada4fe20c0537c13cf3ff5a010d208ba1.tar.gz
system_core-c1e9d6dada4fe20c0537c13cf3ff5a010d208ba1.tar.bz2
logd: filters remove leading expire messages and rate
(cherry pick from commit 047cc0729fd837a03b99db901941c1421ef15f96) - Cleanup resulting from experience and feedback - When filtering inside logd, drop any leading expire messages, they are cluttering up leading edge of tombstones (which filter by pid) - Increase and introduce EXPIRE_RATELIMIT from 1 to 10 seconds - Increase EXPIRE_THRESHOLD from 4 to 10 count - Improve the expire messages from: logd : uid=1000(system) too chatty comm=com.google.android.phone, expire 2800 lines change tag to be more descriptive, and reduce accusatory tone to: chatty : uid=1000(system) com.google.android.phone expire 2800 lines - if the UID name forms a prefix for comm name, then drop UID name Change-Id: Ied7cc04c0ab3ae02167649a0b97378e44ef7b588
Diffstat (limited to 'logd')
-rw-r--r--logd/LogBuffer.cpp3
-rw-r--r--logd/LogBufferElement.cpp24
-rw-r--r--logd/LogBufferElement.h3
-rw-r--r--logd/LogTimes.cpp19
-rw-r--r--logd/LogTimes.h1
5 files changed, 39 insertions, 11 deletions
diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp
index 80fc9f5..4373e2a 100644
--- a/logd/LogBuffer.cpp
+++ b/logd/LogBuffer.cpp
@@ -281,7 +281,8 @@ public:
}
void clear(LogBufferElement *e) {
- uint64_t current = e->getRealTime().nsec() - NS_PER_SEC;
+ uint64_t current = e->getRealTime().nsec()
+ - (EXPIRE_RATELIMIT * NS_PER_SEC);
for(LogBufferElementMap::iterator it = map.begin(); it != map.end();) {
LogBufferElement *l = it->second;
if ((l->getDropped() >= EXPIRE_THRESHOLD)
diff --git a/logd/LogBufferElement.cpp b/logd/LogBufferElement.cpp
index 3d7237e..8238a52 100644
--- a/logd/LogBufferElement.cpp
+++ b/logd/LogBufferElement.cpp
@@ -104,8 +104,8 @@ char *android::tidToName(pid_t tid) {
// assumption: mMsg == NULL
size_t LogBufferElement::populateDroppedMessage(char *&buffer,
LogBuffer *parent) {
- static const char tag[] = "logd";
- static const char format_uid[] = "uid=%u%s too chatty%s, expire %u line%s";
+ static const char tag[] = "chatty";
+ static const char format_uid[] = "uid=%u%s%s expire %u line%s";
char *name = parent->uidToName(mUid);
char *commName = android::tidToName(mTid);
@@ -115,9 +115,15 @@ size_t LogBufferElement::populateDroppedMessage(char *&buffer,
if (!commName) {
commName = parent->pidToName(mPid);
}
- if (name && commName && !strcmp(name, commName)) {
- free(commName);
- commName = NULL;
+ size_t len = name ? strlen(name) : 0;
+ if (len && commName && !strncmp(name, commName, len)) {
+ if (commName[len] == '\0') {
+ free(commName);
+ commName = NULL;
+ } else {
+ free(name);
+ name = NULL;
+ }
}
if (name) {
char *p = NULL;
@@ -129,16 +135,16 @@ size_t LogBufferElement::populateDroppedMessage(char *&buffer,
}
if (commName) {
char *p = NULL;
- asprintf(&p, " comm=%s", commName);
+ asprintf(&p, " %s", commName);
if (p) {
free(commName);
commName = p;
}
}
// identical to below to calculate the buffer size required
- size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "",
- commName ? commName : "",
- mDropped, (mDropped > 1) ? "s" : "");
+ len = snprintf(NULL, 0, format_uid, mUid, name ? name : "",
+ commName ? commName : "",
+ mDropped, (mDropped > 1) ? "s" : "");
size_t hdrLen;
if (mLogId == LOG_ID_EVENTS) {
diff --git a/logd/LogBufferElement.h b/logd/LogBufferElement.h
index 3dcf9d1..ca2c3a6 100644
--- a/logd/LogBufferElement.h
+++ b/logd/LogBufferElement.h
@@ -50,8 +50,9 @@ 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
+#define EXPIRE_THRESHOLD 10 // A smaller expire count is considered too
// chatty for the temporal expire messages
+#define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration
class LogBufferElement {
const log_id_t mLogId;
diff --git a/logd/LogTimes.cpp b/logd/LogTimes.cpp
index ec67c07..68a0680 100644
--- a/logd/LogTimes.cpp
+++ b/logd/LogTimes.cpp
@@ -31,6 +31,7 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client,
mRelease(false),
mError(false),
threadRunning(false),
+ leadingDropped(false),
mReader(reader),
mLogMask(logMask),
mPid(pid),
@@ -123,6 +124,8 @@ void *LogTimeEntry::threadStart(void *obj) {
bool privileged = FlushCommand::hasReadLogs(client);
+ me->leadingDropped = true;
+
lock();
while (me->threadRunning && !me->isError_Locked()) {
@@ -132,6 +135,7 @@ void *LogTimeEntry::threadStart(void *obj) {
if (me->mTail) {
logbuf.flushTo(client, start, privileged, FilterFirstPass, me);
+ me->leadingDropped = true;
}
start = logbuf.flushTo(client, start, privileged, FilterSecondPass, me);
@@ -163,6 +167,14 @@ int LogTimeEntry::FilterFirstPass(const LogBufferElement *element, void *obj) {
LogTimeEntry::lock();
+ if (me->leadingDropped) {
+ if (element->getDropped()) {
+ LogTimeEntry::unlock();
+ return false;
+ }
+ me->leadingDropped = false;
+ }
+
if (me->mCount == 0) {
me->mStart = element->getSequence();
}
@@ -190,6 +202,13 @@ int LogTimeEntry::FilterSecondPass(const LogBufferElement *element, void *obj) {
goto skip;
}
+ if (me->leadingDropped) {
+ if (element->getDropped()) {
+ goto skip;
+ }
+ me->leadingDropped = false;
+ }
+
// Truncate to close race between first and second pass
if (me->mNonBlock && me->mTail && (me->mIndex >= me->mCount)) {
goto stop;
diff --git a/logd/LogTimes.h b/logd/LogTimes.h
index ae2f92b..783bce6 100644
--- a/logd/LogTimes.h
+++ b/logd/LogTimes.h
@@ -32,6 +32,7 @@ class LogTimeEntry {
bool mRelease;
bool mError;
bool threadRunning;
+ bool leadingDropped;
pthread_cond_t threadTriggeredCondition;
pthread_t mThread;
LogReader &mReader;