Loading logd/LogBuffer.cpp +87 −82 Original line number Diff line number Diff line Loading @@ -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? Loading Loading @@ -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); } Loading @@ -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. Loading Loading @@ -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; Loading @@ -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; Loading @@ -276,17 +281,21 @@ 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; Loading @@ -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); // !Worst and !BlackListed? if ((uid != worst) && (!hasBlacklist || !mPrune.naughty(e))) { ++it; continue; } unsigned short len = e->getMsgLen(); stats.subtract(len, id, uid, e->getPid()); delete e; it = erase(it); pruneRows--; if (uid == worst) { kick = true; if ((pruneRows == 0) || (worst_sizes < second_worst_sizes)) { if (pruneRows == 0) { break; } worst_sizes -= len; } else if (pruneRows == 0) { break; if (uid != worst) { continue; } } else { ++it; kick = true; if (worst_sizes < second_worst_sizes) { break; } worst_sizes -= len; } if (!kick || !mPrune.worstUidEnabled()) { Loading @@ -330,42 +343,51 @@ 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 (e->getLogId() != id) { it++; continue; } if (oldest && (oldest->mStart <= e->getSequence())) { if (!whitelist) { if (whitelist) { break; } 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 (mPrune.nice(e)) { // WhiteListed if (hasWhitelist && mPrune.nice(e)) { // WhiteListed whitelist = true; it++; continue; } it = mLogElements.erase(it); stats.subtract(e->getMsgLen(), id, e->getUid(), e->getPid()); delete e; it = erase(it); pruneRows--; } else { it++; } } // 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 (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 Loading @@ -375,13 +397,9 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { } break; } it = mLogElements.erase(it); stats.subtract(e->getMsgLen(), id, e->getUid(), e->getPid()); delete e; it = erase(it); pruneRows--; } else { it++; } } } Loading Loading @@ -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); } logd/LogBuffer.h +1 −1 Original line number Diff line number Diff line Loading @@ -78,7 +78,7 @@ public: private: void maybePrune(log_id_t id); void prune(log_id_t id, unsigned long pruneRows, uid_t uid = AID_ROOT); LogBufferElementCollection::iterator erase(LogBufferElementCollection::iterator it); }; #endif // _LOGD_LOG_BUFFER_H__ logd/LogBufferElement.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,8 +17,9 @@ #ifndef _LOGD_LOG_BUFFER_ELEMENT_H__ #define _LOGD_LOG_BUFFER_ELEMENT_H__ #include <sys/types.h> #include <stdatomic.h> #include <sys/types.h> #include <sysutils/SocketClient.h> #include <log/log.h> #include <log/log_read.h> Loading Loading
logd/LogBuffer.cpp +87 −82 Original line number Diff line number Diff line Loading @@ -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? Loading Loading @@ -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); } Loading @@ -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. Loading Loading @@ -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; Loading @@ -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; Loading @@ -276,17 +281,21 @@ 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; Loading @@ -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); // !Worst and !BlackListed? if ((uid != worst) && (!hasBlacklist || !mPrune.naughty(e))) { ++it; continue; } unsigned short len = e->getMsgLen(); stats.subtract(len, id, uid, e->getPid()); delete e; it = erase(it); pruneRows--; if (uid == worst) { kick = true; if ((pruneRows == 0) || (worst_sizes < second_worst_sizes)) { if (pruneRows == 0) { break; } worst_sizes -= len; } else if (pruneRows == 0) { break; if (uid != worst) { continue; } } else { ++it; kick = true; if (worst_sizes < second_worst_sizes) { break; } worst_sizes -= len; } if (!kick || !mPrune.worstUidEnabled()) { Loading @@ -330,42 +343,51 @@ 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 (e->getLogId() != id) { it++; continue; } if (oldest && (oldest->mStart <= e->getSequence())) { if (!whitelist) { if (whitelist) { break; } 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 (mPrune.nice(e)) { // WhiteListed if (hasWhitelist && mPrune.nice(e)) { // WhiteListed whitelist = true; it++; continue; } it = mLogElements.erase(it); stats.subtract(e->getMsgLen(), id, e->getUid(), e->getPid()); delete e; it = erase(it); pruneRows--; } else { it++; } } // 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 (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 Loading @@ -375,13 +397,9 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { } break; } it = mLogElements.erase(it); stats.subtract(e->getMsgLen(), id, e->getUid(), e->getPid()); delete e; it = erase(it); pruneRows--; } else { it++; } } } Loading Loading @@ -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); }
logd/LogBuffer.h +1 −1 Original line number Diff line number Diff line Loading @@ -78,7 +78,7 @@ public: private: void maybePrune(log_id_t id); void prune(log_id_t id, unsigned long pruneRows, uid_t uid = AID_ROOT); LogBufferElementCollection::iterator erase(LogBufferElementCollection::iterator it); }; #endif // _LOGD_LOG_BUFFER_H__
logd/LogBufferElement.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,8 +17,9 @@ #ifndef _LOGD_LOG_BUFFER_ELEMENT_H__ #define _LOGD_LOG_BUFFER_ELEMENT_H__ #include <sys/types.h> #include <stdatomic.h> #include <sys/types.h> #include <sysutils/SocketClient.h> #include <log/log.h> #include <log/log_read.h> Loading