diff options
Diffstat (limited to 'logd/LogBuffer.cpp')
-rw-r--r-- | logd/LogBuffer.cpp | 169 |
1 files changed, 87 insertions, 82 deletions
diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp index 2693583..d11b129 100644 --- a/logd/LogBuffer.cpp +++ b/logd/LogBuffer.cpp @@ -27,8 +27,6 @@ #include "LogBuffer.h" #include "LogReader.h" -#include "LogStatistics.h" -#include "LogWhiteBlackList.h" // Default #define LOG_BUFFER_SIZE (256 * 1024) // Tuned on a per-platform basis here? @@ -193,7 +191,7 @@ void LogBuffer::log(log_id_t log_id, log_time realtime, LogTimeEntry::unlock(); } - stats.add(len, log_id, uid, pid); + stats.add(elem); maybePrune(log_id); pthread_mutex_unlock(&mLogElementsLock); } @@ -216,6 +214,16 @@ void LogBuffer::maybePrune(log_id_t id) { } } +LogBufferElementCollection::iterator LogBuffer::erase(LogBufferElementCollection::iterator it) { + LogBufferElement *e = *it; + + it = mLogElements.erase(it); + stats.subtract(e); + delete e; + + return it; +} + // prune "pruneRows" of type "id" from the buffer. // // mLogElementsLock must be held when this function is called. @@ -250,12 +258,8 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { continue; } - uid_t uid = e->getUid(); - - if (uid == caller_uid) { - it = mLogElements.erase(it); - stats.subtract(e->getMsgLen(), id, uid, e->getPid()); - delete e; + if (e->getUid() == caller_uid) { + it = erase(it); pruneRows--; if (pruneRows == 0) { break; @@ -269,6 +273,7 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { } // prune by worst offender by uid + bool hasBlacklist = mPrune.naughty(); while (pruneRows > 0) { // recalculate the worst offender on every batched pass uid_t worst = (uid_t) -1; @@ -276,19 +281,23 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { size_t second_worst_sizes = 0; if ((id != LOG_ID_CRASH) && mPrune.worstUidEnabled()) { - LidStatistics &l = stats.id(id); - l.sort(); - UidStatisticsCollection::iterator iu = l.begin(); - if (iu != l.end()) { - UidStatistics *u = *iu; - worst = u->getUid(); - worst_sizes = u->sizes(); - if (++iu != l.end()) { - second_worst_sizes = (*iu)->sizes(); + const UidEntry **sorted = stats.sort(2, id); + + if (sorted) { + if (sorted[0] && sorted[1]) { + worst = sorted[0]->getKey(); + worst_sizes = sorted[0]->getSizes(); + second_worst_sizes = sorted[1]->getSizes(); } + delete [] sorted; } } + // skip if we have neither worst nor naughty filters + if ((worst == (uid_t) -1) && !hasBlacklist) { + break; + } + bool kick = false; for(it = mLogElements.begin(); it != mLogElements.end();) { LogBufferElement *e = *it; @@ -304,24 +313,28 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { uid_t uid = e->getUid(); - if ((uid == worst) || mPrune.naughty(e)) { // Worst or BlackListed - it = mLogElements.erase(it); - unsigned short len = e->getMsgLen(); - stats.subtract(len, id, uid, e->getPid()); - delete e; - pruneRows--; - if (uid == worst) { - kick = true; - if ((pruneRows == 0) || (worst_sizes < second_worst_sizes)) { - break; - } - worst_sizes -= len; - } else if (pruneRows == 0) { - break; - } - } else { + // !Worst and !BlackListed? + if ((uid != worst) && (!hasBlacklist || !mPrune.naughty(e))) { ++it; + continue; + } + + unsigned short len = e->getMsgLen(); + it = erase(it); + pruneRows--; + if (pruneRows == 0) { + break; + } + + if (uid != worst) { + continue; + } + + kick = true; + if (worst_sizes < second_worst_sizes) { + break; } + worst_sizes -= len; } if (!kick || !mPrune.worstUidEnabled()) { @@ -330,58 +343,63 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { } bool whitelist = false; + bool hasWhitelist = mPrune.nice(); it = mLogElements.begin(); while((pruneRows > 0) && (it != mLogElements.end())) { LogBufferElement *e = *it; - if (e->getLogId() == id) { - if (oldest && (oldest->mStart <= e->getSequence())) { - if (!whitelist) { - if (stats.sizes(id) > (2 * log_buffer_size(id))) { - // kick a misbehaving log reader client off the island - oldest->release_Locked(); - } else { - oldest->triggerSkip_Locked(id, pruneRows); - } - } + + if (e->getLogId() != id) { + it++; + continue; + } + + if (oldest && (oldest->mStart <= e->getSequence())) { + if (whitelist) { break; } - if (mPrune.nice(e)) { // WhiteListed - whitelist = true; - it++; - continue; + if (stats.sizes(id) > (2 * log_buffer_size(id))) { + // kick a misbehaving log reader client off the island + oldest->release_Locked(); + } else { + oldest->triggerSkip_Locked(id, pruneRows); } + break; + } - it = mLogElements.erase(it); - stats.subtract(e->getMsgLen(), id, e->getUid(), e->getPid()); - delete e; - pruneRows--; - } else { + if (hasWhitelist && mPrune.nice(e)) { // WhiteListed + whitelist = true; it++; + continue; } + + it = erase(it); + pruneRows--; } + // Do not save the whitelist if we are reader range limited if (whitelist && (pruneRows > 0)) { it = mLogElements.begin(); while((it != mLogElements.end()) && (pruneRows > 0)) { LogBufferElement *e = *it; - if (e->getLogId() == id) { - if (oldest && (oldest->mStart <= e->getSequence())) { - if (stats.sizes(id) > (2 * log_buffer_size(id))) { - // kick a misbehaving log reader client off the island - oldest->release_Locked(); - } else { - oldest->triggerSkip_Locked(id, pruneRows); - } - break; + + if (e->getLogId() != id) { + ++it; + continue; + } + + if (oldest && (oldest->mStart <= e->getSequence())) { + if (stats.sizes(id) > (2 * log_buffer_size(id))) { + // kick a misbehaving log reader client off the island + oldest->release_Locked(); + } else { + oldest->triggerSkip_Locked(id, pruneRows); } - it = mLogElements.erase(it); - stats.subtract(e->getMsgLen(), id, e->getUid(), e->getPid()); - delete e; - pruneRows--; - } else { - it++; + break; } + + it = erase(it); + pruneRows--; } } @@ -487,22 +505,9 @@ uint64_t LogBuffer::flushTo( } void LogBuffer::formatStatistics(char **strp, uid_t uid, unsigned int logMask) { - uint64_t oldest = UINT64_MAX; - pthread_mutex_lock(&mLogElementsLock); - // Find oldest element in the log(s) - LogBufferElementCollection::iterator it; - for (it = mLogElements.begin(); it != mLogElements.end(); ++it) { - LogBufferElement *element = *it; - - if ((logMask & (1 << element->getLogId()))) { - oldest = element->getSequence(); - break; - } - } - - stats.format(strp, uid, logMask, oldest); + stats.format(strp, uid, logMask); pthread_mutex_unlock(&mLogElementsLock); } |