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

Commit 925a04b7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix StatsCompanionService pull on bucket ends" into pi-dev

parents 9434b66b 1a0a941c
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -79,8 +79,6 @@ StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap,
      mSendBroadcast(sendBroadcast),
      mTimeBaseSec(timeBaseSec),
      mLastLogTimestamp(0) {
    StatsPullerManager statsPullerManager;
    statsPullerManager.SetTimeBaseSec(mTimeBaseSec);
}

StatsLogProcessor::~StatsLogProcessor() {
@@ -177,7 +175,7 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event) {

    uint64_t curTimeSec = getElapsedRealtimeSec();
    if (curTimeSec - mLastPullerCacheClearTimeSec > StatsdStats::kPullerCacheClearIntervalSec) {
        mStatsPullerManager.ClearPullerCacheIfNecessary(curTimeSec);
        mStatsPullerManager.ClearPullerCacheIfNecessary(curTimeSec * NS_PER_SEC);
        mLastPullerCacheClearTimeSec = curTimeSec;
    }

+1 −1
Original line number Diff line number Diff line
@@ -595,7 +595,7 @@ status_t StatsService::cmd_log_app_breadcrumb(FILE* out, const Vector<String8>&
status_t StatsService::cmd_print_pulled_metrics(FILE* out, const Vector<String8>& args) {
    int s = atoi(args[1].c_str());
    vector<shared_ptr<LogEvent> > stats;
    if (mStatsPullerManager.Pull(s, &stats)) {
    if (mStatsPullerManager.Pull(s, getElapsedRealtimeNs(), &stats)) {
        for (const auto& it : stats) {
            fprintf(out, "Pull from %d: %s\n", s, it->ToString().c_str());
        }
+17 −12
Original line number Diff line number Diff line
@@ -35,26 +35,31 @@ void StatsPuller::SetUidMap(const sp<UidMap>& uidMap) { mUidMap = uidMap; }
// ValueMetric has a minimum bucket size of 10min so that we don't pull too frequently
StatsPuller::StatsPuller(const int tagId)
    : mTagId(tagId) {
    mCoolDownSec = StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.coolDownSec;
    VLOG("Puller for tag %d created. Cooldown set to %ld", mTagId, mCoolDownSec);
    mCoolDownNs = StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.coolDownNs;
    VLOG("Puller for tag %d created. Cooldown set to %lld", mTagId, (long long)mCoolDownNs);
}

bool StatsPuller::Pull(std::vector<std::shared_ptr<LogEvent>>* data) {
bool StatsPuller::Pull(const int64_t elapsedTimeNs, std::vector<std::shared_ptr<LogEvent>>* data) {
    lock_guard<std::mutex> lock(mLock);
    int64_t wallClockTimeNs = getWallClockNs();
    StatsdStats::getInstance().notePull(mTagId);
    long curTime = getElapsedRealtimeSec();
    if (curTime - mLastPullTimeSec < mCoolDownSec) {
    if (elapsedTimeNs - mLastPullTimeNs < mCoolDownNs) {
        (*data) = mCachedData;
        StatsdStats::getInstance().notePullFromCache(mTagId);
        return true;
    }
    if (mMinPullIntervalSec > curTime - mLastPullTimeSec) {
        mMinPullIntervalSec = curTime - mLastPullTimeSec;
        StatsdStats::getInstance().updateMinPullIntervalSec(mTagId, mMinPullIntervalSec);
    if (mMinPullIntervalNs > elapsedTimeNs - mLastPullTimeNs) {
        mMinPullIntervalNs = elapsedTimeNs - mLastPullTimeNs;
        StatsdStats::getInstance().updateMinPullIntervalSec(mTagId,
                                                            mMinPullIntervalNs / NS_PER_SEC);
    }
    mCachedData.clear();
    mLastPullTimeSec = curTime;
    mLastPullTimeNs = elapsedTimeNs;
    bool ret = PullInternal(&mCachedData);
    for (const shared_ptr<LogEvent>& data : mCachedData) {
        data->setElapsedTimestampNs(elapsedTimeNs);
        data->setLogdWallClockTimestampNs(wallClockTimeNs);
    }
    if (ret) {
      mergeIsolatedUidsToHostUid(mCachedData, mUidMap, mTagId);
      (*data) = mCachedData;
@@ -70,12 +75,12 @@ int StatsPuller::clearCache() {
    lock_guard<std::mutex> lock(mLock);
    int ret = mCachedData.size();
    mCachedData.clear();
    mLastPullTimeSec = 0;
    mLastPullTimeNs = 0;
    return ret;
}

int StatsPuller::ClearCacheIfNecessary(long timestampSec) {
    if (timestampSec - mLastPullTimeSec > mCoolDownSec) {
int StatsPuller::ClearCacheIfNecessary(int64_t timestampNs) {
    if (timestampNs - mLastPullTimeNs > mCoolDownNs) {
        return clearCache();
    } else {
        return 0;
+5 −5
Original line number Diff line number Diff line
@@ -37,13 +37,13 @@ public:

    virtual ~StatsPuller() {}

    bool Pull(std::vector<std::shared_ptr<LogEvent>>* data);
    bool Pull(const int64_t timeNs, std::vector<std::shared_ptr<LogEvent>>* data);

    // Clear cache immediately
    int ForceClearCache();

    // Clear cache if elapsed time is more than cooldown time
    int ClearCacheIfNecessary(long timestampSec);
    int ClearCacheIfNecessary(int64_t timestampNs);

    static void SetUidMap(const sp<UidMap>& uidMap);

@@ -59,9 +59,9 @@ private:
    // If a pull request comes before cooldown, a cached version from purevious pull
    // will be returned.
    // The actual value should be determined by individual pullers.
    long mCoolDownSec;
    int64_t mCoolDownNs;
    // For puller stats
    long mMinPullIntervalSec = LONG_MAX;
    int64_t mMinPullIntervalNs = LONG_MAX;

    virtual bool PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) = 0;

@@ -69,7 +69,7 @@ private:
    // cached data will be returned.
    std::vector<std::shared_ptr<LogEvent>> mCachedData;

    long mLastPullTimeSec;
    int64_t mLastPullTimeNs;

    int clearCache();

+8 −13
Original line number Diff line number Diff line
@@ -26,10 +26,9 @@ class StatsPullerManager {
 public:
    virtual ~StatsPullerManager() {}

    virtual void RegisterReceiver(int tagId,
                                  wp <PullDataReceiver> receiver,
                                  long intervalMs) {
        mPullerManager.RegisterReceiver(tagId, receiver, intervalMs);
    virtual void RegisterReceiver(int tagId, wp<PullDataReceiver> receiver, int64_t nextPullTimeNs,
                                  int64_t intervalNs) {
        mPullerManager.RegisterReceiver(tagId, receiver, nextPullTimeNs, intervalNs);
    };

    virtual void UnRegisterReceiver(int tagId, wp <PullDataReceiver> receiver) {
@@ -45,13 +44,9 @@ class StatsPullerManager {
        mPullerManager.OnAlarmFired();
    }

    virtual bool
    Pull(const int tagId, vector<std::shared_ptr<LogEvent>>* data) {
        return mPullerManager.Pull(tagId, data);
    }

    void SetTimeBaseSec(const long timeBaseSec) {
        mPullerManager.SetTimeBaseSec(timeBaseSec);
    virtual bool Pull(const int tagId, const int64_t timesNs,
                      vector<std::shared_ptr<LogEvent>>* data) {
        return mPullerManager.Pull(tagId, timesNs, data);
    }

    int ForceClearPullerCache() {
@@ -62,8 +57,8 @@ class StatsPullerManager {
        mPullerManager.SetStatsCompanionService(statsCompanionService);
    }

    int ClearPullerCacheIfNecessary(long timestampSec) {
        return mPullerManager.ClearPullerCacheIfNecessary(timestampSec);
    int ClearPullerCacheIfNecessary(int64_t timestampNs) {
        return mPullerManager.ClearPullerCacheIfNecessary(timestampNs);
    }

 private:
Loading