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

Commit 24a76668 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Fix monotonic clock and deadlock in `dumpsys batterystats`

Bug: 315866543
Test: atest PowerStatsTests
Change-Id: Ib8d6c4fb3cd0854088b6cdaab085287903860d18
parent 556f2734
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BatteryStatsHistoryIterator;
import com.android.internal.os.CpuScalingPolicies;
import com.android.internal.os.MonotonicClock;
import com.android.internal.os.PowerStats;

import com.google.android.collect.Lists;
@@ -7484,7 +7485,8 @@ public abstract class BatteryStats {
        long baseTime = -1;
        boolean printed = false;
        HistoryEventTracker tracker = null;
        try (BatteryStatsHistoryIterator iterator = iterateBatteryStatsHistory(0, 0)) {
        try (BatteryStatsHistoryIterator iterator =
                     iterateBatteryStatsHistory(0, MonotonicClock.UNDEFINED)) {
            HistoryItem rec;
            while ((rec = iterator.next()) != null) {
                try {
@@ -8409,7 +8411,8 @@ public abstract class BatteryStats {
        long baseTime = -1;
        boolean printed = false;
        HistoryEventTracker tracker = null;
        try (BatteryStatsHistoryIterator iterator = iterateBatteryStatsHistory(0, 0)) {
        try (BatteryStatsHistoryIterator iterator =
                     iterateBatteryStatsHistory(0, MonotonicClock.UNDEFINED)) {
            HistoryItem rec;
            while ((rec = iterator.next()) != null) {
                lastTime = rec.time;
+2 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.util.proto.ProtoOutputStream;

import com.android.internal.os.BatteryStatsHistory;
import com.android.internal.os.BatteryStatsHistoryIterator;
import com.android.internal.os.MonotonicClock;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;

@@ -323,7 +324,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
            throw new IllegalStateException(
                    "Battery history was not requested in the BatteryUsageStatsQuery");
        }
        return new BatteryStatsHistoryIterator(mBatteryStatsHistory, 0, 0);
        return new BatteryStatsHistoryIterator(mBatteryStatsHistory, 0, MonotonicClock.UNDEFINED);
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ public class BatteryStatsHistory {
     * @param startTimeMs monotonic time (the HistoryItem.time field) to start iterating from,
     *                    inclusive
     * @param endTimeMs monotonic time to stop iterating, exclusive.
     *                  Pass 0 to indicate current time.
     *                  Pass {@link MonotonicClock#UNDEFINED} to indicate current time.
     */
    @NonNull
    public BatteryStatsHistoryIterator iterate(long startTimeMs, long endTimeMs) {
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ public class BatteryStatsHistoryIterator implements Iterator<BatteryStats.Histor
            long endTimeMs) {
        mBatteryStatsHistory = history;
        mStartTimeMs = startTimeMs;
        mEndTimeMs = (endTimeMs != 0) ? endTimeMs : Long.MAX_VALUE;
        mEndTimeMs = (endTimeMs != MonotonicClock.UNDEFINED) ? endTimeMs : Long.MAX_VALUE;
        mHistoryItem.clear();
    }

+19 −10
Original line number Diff line number Diff line
@@ -178,7 +178,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    final BatteryStatsImpl mStats;
    final CpuWakeupStats mCpuWakeupStats;
    private final PowerStatsStore mPowerStatsStore;
    private final PowerStatsAggregator mPowerStatsAggregator;
    private final PowerStatsScheduler mPowerStatsScheduler;
    private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
    private final Context mContext;
@@ -187,6 +186,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    private final AtomicFile mConfigFile;
    private final BatteryStats.BatteryStatsDumpHelper mDumpHelper;
    private final PowerStatsUidResolver mPowerStatsUidResolver;
    private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig;

    private volatile boolean mMonitorEnabled = true;

@@ -424,13 +424,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
        mStats.startTrackingSystemServerCpuTime();

        AggregatedPowerStatsConfig aggregatedPowerStatsConfig = getAggregatedPowerStatsConfig();
        mPowerStatsStore = new PowerStatsStore(systemDir, mHandler, aggregatedPowerStatsConfig);
        mPowerStatsAggregator = new PowerStatsAggregator(aggregatedPowerStatsConfig,
                mStats.getHistory());
        mAggregatedPowerStatsConfig = createAggregatedPowerStatsConfig();
        mPowerStatsStore = new PowerStatsStore(systemDir, mHandler, mAggregatedPowerStatsConfig);
        mPowerStatsScheduler = createPowerStatsScheduler(mContext);
        PowerStatsExporter powerStatsExporter =
                new PowerStatsExporter(mPowerStatsStore, mPowerStatsAggregator);
                new PowerStatsExporter(mPowerStatsStore,
                        new PowerStatsAggregator(mAggregatedPowerStatsConfig, mStats.getHistory()));
        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context,
                powerStatsExporter, mPowerProfile, mCpuScalingPolicies,
                mPowerStatsStore, Clock.SYSTEM_CLOCK);
@@ -452,12 +451,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                            onAlarmListener, aHandler);
                };
        return new PowerStatsScheduler(mStats::schedulePowerStatsSampleCollection,
                mPowerStatsAggregator, aggregatedPowerStatsSpanDuration,
                new PowerStatsAggregator(mAggregatedPowerStatsConfig,
                        mStats.getHistory()), aggregatedPowerStatsSpanDuration,
                powerStatsAggregationPeriod, mPowerStatsStore, alarmScheduler, Clock.SYSTEM_CLOCK,
                mMonotonicClock, () -> mStats.getHistory().getStartTime(), mHandler);
    }

    private AggregatedPowerStatsConfig getAggregatedPowerStatsConfig() {
    private AggregatedPowerStatsConfig createAggregatedPowerStatsConfig() {
        AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig();
        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CPU)
                .trackDeviceStates(
@@ -896,6 +896,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                SystemClock.elapsedRealtime(),
                mWorker.getLastCollectionTimeStamp())) {
            syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
            if (Flags.streamlinedBatteryStats()) {
                mStats.collectPowerStatsSamples();
            }
        }

        return mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, queries);
@@ -2725,7 +2728,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        }
    }

    private void dumpUsageStatsToProto(FileDescriptor fd, PrintWriter pw, int model,
    private void dumpUsageStats(FileDescriptor fd, PrintWriter pw, int model,
            boolean proto) {
        awaitCompletion();
        syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
@@ -2741,6 +2744,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        synchronized (mStats) {
            mStats.prepareForDumpLocked();
        }
        if (Flags.streamlinedBatteryStats()) {
            // Important: perform this operation outside the mStats lock, because it will
            // need to access BatteryStats from a handler thread
            mStats.collectPowerStatsSamples();
        }

        BatteryUsageStats batteryUsageStats =
                mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query);
        if (proto) {
@@ -2945,7 +2954,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                            }
                        }
                    }
                    dumpUsageStatsToProto(fd, pw, model, proto);
                    dumpUsageStats(fd, pw, model, proto);
                    return;
                } else if ("--wakeups".equals(arg)) {
                    mCpuWakeupStats.dump(new IndentingPrintWriter(pw, "  "),
Loading