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

Commit 64cbb90c authored by Vova Sharaienko's avatar Vova Sharaienko
Browse files

AggregatedMobileDataStatsPuller improved performance

- moved networks stats baseline collection to bg thread
- added rate limiter to query network stats once per second at max

Bug: 309512867
Test: adb shell cmd stats print-stats | grep 10204
Change-Id: Ib5c22de205d9c3a31067ffe79a164d3a3f4cd190
parent 8e259dd8
Loading
Loading
Loading
Loading
+37 −16
Original line number Diff line number Diff line
@@ -30,7 +30,9 @@ import android.util.StatsEvent;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.selinux.RateLimiter;

import java.time.Duration;
import java.util.List;
import java.util.Map;

@@ -131,19 +133,36 @@ class AggregatedMobileDataStatsPuller {

    private final Handler mMobileDataStatsHandler;

    private final RateLimiter mRateLimiter;

    AggregatedMobileDataStatsPuller(NetworkStatsManager networkStatsManager) {
        if (DEBUG) {
            if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,
                        TAG + "-AggregatedMobileDataStatsPullerInit");
            }
        }

        mRateLimiter = new RateLimiter(/* window= */ Duration.ofSeconds(1));

        mUidStats = new ArrayMap<>();
        mUidPreviousState = new SparseIntArray();

        mNetworkStatsManager = networkStatsManager;

        if (mNetworkStatsManager != null) {
            updateNetworkStats(mNetworkStatsManager);
        }

        HandlerThread mMobileDataStatsHandlerThread = new HandlerThread("MobileDataStatsHandler");
        mMobileDataStatsHandlerThread.start();
        mMobileDataStatsHandler = new Handler(mMobileDataStatsHandlerThread.getLooper());

        if (mNetworkStatsManager != null) {
            mMobileDataStatsHandler.post(
                    () -> {
                        updateNetworkStats(mNetworkStatsManager);
                    });
        }
        if (DEBUG) {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

    public void noteUidProcessState(int uid, int state, long unusedElapsedRealtime,
@@ -180,8 +199,9 @@ class AggregatedMobileDataStatsPuller {
    }

    private void noteUidProcessStateImpl(int uid, int state) {
        // noteUidProcessStateLocked can be called back to back several times while
        // the updateNetworkStatsLocked loops over several stats for multiple uids
        if (mRateLimiter.tryAcquire()) {
            // noteUidProcessStateImpl can be called back to back several times while
            // the updateNetworkStats loops over several stats for multiple uids
            // and during the first call in a batch of proc state change event it can
            // contain info for uid with unknown previous state yet which can happen due to a few
            // reasons:
@@ -193,6 +213,7 @@ class AggregatedMobileDataStatsPuller {
            } else {
                Slog.w(TAG, "noteUidProcessStateLocked() can not get mNetworkStatsManager");
            }
        }
        mUidPreviousState.put(uid, state);
    }