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

Commit 985270a6 authored by Chenjie Yu's avatar Chenjie Yu Committed by android-build-merger
Browse files

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

am: 925a04b7

Change-Id: I1aac27b4a83158b336e0fcff16a18a06ab310615
parents 6541c421 925a04b7
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