Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77e27d8c authored by Mark Salyzyn's avatar Mark Salyzyn Committed by Android (Google) Code Review
Browse files

Merge changes I9f21ce95,Ib0530b9d,I981d9fa6,Icc60dd06,I902ba6b4, ... into mnc-dr-dev

* changes:
  logd: worst uid record watermark
  logd: log buffer switch to std::list
  logd: white and black switch to std::list
  logd: logtimes switch to std::list
  logd: prune 10% or 256 entries max
  logd: sizes > 1M prune in smaller batches
parents a77a0487 0c5ab13a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ void FlushCommand::runSocketCommand(SocketClient *client) {
            return;
        }
        entry = new LogTimeEntry(mReader, client, mNonBlock, mTail, mLogMask, mPid, mStart);
        times.push_back(entry);
        times.push_front(entry);
    }

    client->incRef();
+29 −9
Original line number Diff line number Diff line
@@ -217,19 +217,22 @@ int LogBuffer::log(log_id_t log_id, log_time realtime,
    return len;
}

// If we're using more than 256K of memory for log entries, prune
// at least 10% of the log entries.
// Prune at most 10% of the log entries or 256, whichever is less.
//
// mLogElementsLock must be held when this function is called.
void LogBuffer::maybePrune(log_id_t id) {
    size_t sizes = stats.sizes(id);
    if (sizes > log_buffer_size(id)) {
        size_t sizeOver90Percent = sizes - ((log_buffer_size(id) * 9) / 10);
    unsigned long maxSize = log_buffer_size(id);
    if (sizes > maxSize) {
        size_t sizeOver = sizes - ((maxSize * 9) / 10);
        size_t elements = stats.elements(id);
        unsigned long pruneRows = elements * sizeOver90Percent / sizes;
        elements /= 10;
        if (pruneRows <= elements) {
            pruneRows = elements;
        size_t minElements = elements / 10;
        unsigned long pruneRows = elements * sizeOver / sizes;
        if (pruneRows <= minElements) {
            pruneRows = minElements;
        }
        if (pruneRows > 256) {
            pruneRows = 256;
        }
        prune(id, pruneRows);
    }
@@ -237,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;
@@ -396,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())) {
@@ -447,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;
            }
@@ -493,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;
                }
            }
+8 −2
Original line number Diff line number Diff line
@@ -19,9 +19,10 @@

#include <sys/types.h>

#include <list>

#include <log/log.h>
#include <sysutils/SocketClient.h>
#include <utils/List.h>

#include <private/android_filesystem_config.h>

@@ -30,7 +31,7 @@
#include "LogStatistics.h"
#include "LogWhiteBlackList.h"

typedef android::List<LogBufferElement *> LogBufferElementCollection;
typedef std::list<LogBufferElement *> LogBufferElementCollection;

class LogBuffer {
    LogBufferElementCollection mLogElements;
@@ -39,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];

+5 −3
Original line number Diff line number Diff line
@@ -20,8 +20,10 @@
#include <pthread.h>
#include <time.h>
#include <sys/types.h>

#include <list>

#include <sysutils/SocketClient.h>
#include <utils/List.h>
#include <log/log.h>

class LogReader;
@@ -107,6 +109,6 @@ public:
    static int FilterSecondPass(const LogBufferElement *element, void *me);
};

typedef android::List<LogTimeEntry *> LastLogTimes;
typedef std::list<LogTimeEntry *> LastLogTimes;

#endif
#endif // _LOGD_LOG_TIMES_H__
+11 −17
Original line number Diff line number Diff line
@@ -50,18 +50,14 @@ void Prune::format(char **strp) {
}

PruneList::PruneList() : mWorstUidEnabled(true) {
    mNaughty.clear();
    mNice.clear();
}

PruneList::~PruneList() {
    PruneCollection::iterator it;
    for (it = mNice.begin(); it != mNice.end();) {
        delete (*it);
        it = mNice.erase(it);
    }
    for (it = mNaughty.begin(); it != mNaughty.end();) {
        delete (*it);
        it = mNaughty.erase(it);
    }
}
@@ -70,11 +66,9 @@ int PruneList::init(char *str) {
    mWorstUidEnabled = true;
    PruneCollection::iterator it;
    for (it = mNice.begin(); it != mNice.end();) {
        delete (*it);
        it = mNice.erase(it);
    }
    for (it = mNaughty.begin(); it != mNaughty.end();) {
        delete (*it);
        it = mNaughty.erase(it);
    }

@@ -142,28 +136,28 @@ int PruneList::init(char *str) {
        // insert sequentially into list
        PruneCollection::iterator it = list->begin();
        while (it != list->end()) {
            Prune *p = *it;
            int m = uid - p->mUid;
            Prune &p = *it;
            int m = uid - p.mUid;
            if (m == 0) {
                if (p->mPid == p->pid_all) {
                if (p.mPid == p.pid_all) {
                    break;
                }
                if ((pid == p->pid_all) && (p->mPid != p->pid_all)) {
                if ((pid == p.pid_all) && (p.mPid != p.pid_all)) {
                    it = list->erase(it);
                    continue;
                }
                m = pid - p->mPid;
                m = pid - p.mPid;
            }
            if (m <= 0) {
                if (m < 0) {
                    list->insert(it, new Prune(uid,pid));
                    list->insert(it, Prune(uid,pid));
                }
                break;
            }
            ++it;
        }
        if (it == list->end()) {
            list->push_back(new Prune(uid,pid));
            list->push_back(Prune(uid,pid));
        }
        if (!*str) {
            break;
@@ -193,7 +187,7 @@ void PruneList::format(char **strp) {

    for (it = mNice.begin(); it != mNice.end(); ++it) {
        char *a = NULL;
        (*it)->format(&a);
        (*it).format(&a);

        string.appendFormat(fmt, a);
        fmt = nice_format;
@@ -205,7 +199,7 @@ void PruneList::format(char **strp) {
    fmt = naughty_format + (*fmt != ' ');
    for (it = mNaughty.begin(); it != mNaughty.end(); ++it) {
        char *a = NULL;
        (*it)->format(&a);
        (*it).format(&a);

        string.appendFormat(fmt, a);
        fmt = naughty_format;
@@ -223,7 +217,7 @@ void PruneList::format(char **strp) {
bool PruneList::naughty(LogBufferElement *element) {
    PruneCollection::iterator it;
    for (it = mNaughty.begin(); it != mNaughty.end(); ++it) {
        if (!(*it)->cmp(element)) {
        if (!(*it).cmp(element)) {
            return true;
        }
    }
@@ -233,7 +227,7 @@ bool PruneList::naughty(LogBufferElement *element) {
bool PruneList::nice(LogBufferElement *element) {
    PruneCollection::iterator it;
    for (it = mNice.begin(); it != mNice.end(); ++it) {
        if (!(*it)->cmp(element)) {
        if (!(*it).cmp(element)) {
            return true;
        }
    }
Loading