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

Commit 80eccf9a authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Switch to optimized implementation of NetworkStats.subtract

Bug: 384838422
Test: atest PowerStatsTests; atest PowerStatsTestsRavenwood
Flag: EXEMPT bugfix
Change-Id: I80eabe778137ceaeefeab84fbc40a4e460291d95
parent 0fd6b40d
Loading
Loading
Loading
Loading
+24 −89
Original line number Diff line number Diff line
@@ -2205,6 +2205,11 @@ public class BatteryStatsImpl extends BatteryStats {
                getWakelockDurationRetriever() {
            return mWakelockDurationRetriever;
        }
        @Override
        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
            return BatteryStatsImpl.this.networkStatsDelta(stats, oldStats);
        }
    }
    private final PowerStatsCollectorInjector mPowerStatsCollectorInjector =
@@ -12392,83 +12397,13 @@ public class BatteryStatsImpl extends BatteryStats {
        return networkStatsManager.getWifiUidStats();
    }
    static class NetworkStatsDelta {
        int mUid;
        int mSet;
        long mRxBytes;
        long mRxPackets;
        long mTxBytes;
        long mTxPackets;
        public int getUid() {
            return mUid;
        }
        public int getSet() {
            return mSet;
        }
        public long getRxBytes() {
            return mRxBytes;
        }
        public long getRxPackets() {
            return mRxPackets;
        }
        public long getTxBytes() {
            return mTxBytes;
        }
        public long getTxPackets() {
            return mTxPackets;
        }
        @Override
        public String toString() {
            return "NetworkStatsDelta{mUid=" + mUid + ", mSet=" + mSet + ", mRxBytes=" + mRxBytes
                    + ", mRxPackets=" + mRxPackets + ", mTxBytes=" + mTxBytes + ", mTxPackets="
                    + mTxPackets + '}';
        }
    }
    static List<NetworkStatsDelta> computeDelta(NetworkStats currentStats,
            NetworkStats lastStats) {
        List<NetworkStatsDelta> deltaList = new ArrayList<>();
        for (NetworkStats.Entry entry : currentStats) {
            NetworkStatsDelta delta = new NetworkStatsDelta();
            delta.mUid = entry.getUid();
            delta.mSet = entry.getSet();
            NetworkStats.Entry lastEntry = null;
            if (lastStats != null) {
                for (NetworkStats.Entry e : lastStats) {
                    if (e.getUid() == entry.getUid() && e.getSet() == entry.getSet()
                            && e.getTag() == entry.getTag()
                            && e.getMetered() == entry.getMetered()
                            && e.getRoaming() == entry.getRoaming()
                            && e.getDefaultNetwork() == entry.getDefaultNetwork()
                            /*&& Objects.equals(e.getIface(), entry.getIface())*/) {
                        lastEntry = e;
                        break;
                    }
                }
            }
            if (lastEntry != null) {
                delta.mRxBytes = Math.max(0, entry.getRxBytes() - lastEntry.getRxBytes());
                delta.mRxPackets = Math.max(0, entry.getRxPackets() - lastEntry.getRxPackets());
                delta.mTxBytes = Math.max(0, entry.getTxBytes() - lastEntry.getTxBytes());
                delta.mTxPackets = Math.max(0, entry.getTxPackets() - lastEntry.getTxPackets());
            } else {
                delta.mRxBytes = entry.getRxBytes();
                delta.mRxPackets = entry.getRxPackets();
                delta.mTxBytes = entry.getTxBytes();
                delta.mTxPackets = entry.getTxPackets();
            }
            deltaList.add(delta);
    @VisibleForTesting
    protected NetworkStats networkStatsDelta(@NonNull NetworkStats stats,
            @Nullable NetworkStats oldStats) {
        if (oldStats == null) {
            return stats;
        }
        return deltaList;
        return stats.subtract(oldStats);
    }
    /**
@@ -12486,12 +12421,12 @@ public class BatteryStatsImpl extends BatteryStats {
            }
        }
        NetworkStats delta;
        // Grab a separate lock to acquire the network stats, which may do I/O.
        List<NetworkStatsDelta> delta;
        synchronized (mWifiNetworkLock) {
            final NetworkStats latestStats = readWifiNetworkStatsLocked(networkStatsManager);
            if (latestStats != null) {
                delta = computeDelta(latestStats, mLastWifiNetworkStats);
                delta = networkStatsDelta(latestStats, mLastWifiNetworkStats);
                mLastWifiNetworkStats = latestStats;
            } else {
                delta = null;
@@ -12501,15 +12436,15 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    private void onWifiPowerStatsRetrieved(WifiActivityEnergyInfo wifiActivityEnergyInfo,
            List<NetworkStatsDelta> networkStatsDeltas, long elapsedRealtimeMs, long uptimeMs) {
            NetworkStats networkStatsDelta, long elapsedRealtimeMs, long uptimeMs) {
        // Do not populate consumed energy, because energy attribution is done by
        // WifiPowerStatsProcessor.
        updateWifiBatteryStats(wifiActivityEnergyInfo, networkStatsDeltas, POWER_DATA_UNAVAILABLE,
        updateWifiBatteryStats(wifiActivityEnergyInfo, networkStatsDelta, POWER_DATA_UNAVAILABLE,
                elapsedRealtimeMs, uptimeMs);
    }
    private void updateWifiBatteryStats(WifiActivityEnergyInfo info,
            List<NetworkStatsDelta> delta, long consumedChargeUC, long elapsedRealtimeMs,
            NetworkStats delta, long consumedChargeUC, long elapsedRealtimeMs,
            long uptimeMs) {
        synchronized (this) {
            if (!mOnBatteryInternal || mIgnoreNextExternalStats) {
@@ -12535,7 +12470,7 @@ public class BatteryStatsImpl extends BatteryStats {
            long totalTxPackets = 0;
            long totalRxPackets = 0;
            if (delta != null) {
                for (NetworkStatsDelta entry : delta) {
                for (NetworkStats.Entry entry : delta) {
                    if (DEBUG_ENERGY) {
                        Slog.d(TAG, "Wifi uid " + entry.getUid()
                                + ": delta rx=" + entry.getRxBytes()
@@ -12875,11 +12810,11 @@ public class BatteryStatsImpl extends BatteryStats {
        mLastModemActivityInfo = activityInfo;
        // Grab a separate lock to acquire the network stats, which may do I/O.
        List<NetworkStatsDelta> delta = null;
        NetworkStats delta = null;
        synchronized (mModemNetworkLock) {
            final NetworkStats latestStats = readMobileNetworkStatsLocked(networkStatsManager);
            if (latestStats != null) {
                delta = computeDelta(latestStats, mLastModemNetworkStats);
                delta = networkStatsDelta(latestStats, mLastModemNetworkStats);
                mLastModemNetworkStats = latestStats;
            }
        }
@@ -12888,15 +12823,15 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    private void onMobileRadioPowerStatsRetrieved(ModemActivityInfo modemActivityInfo,
            List<NetworkStatsDelta> networkStatsDeltas, long elapsedRealtimeMs, long uptimeMs) {
            NetworkStats networkStatsDelta, long elapsedRealtimeMs, long uptimeMs) {
        // Do not populate consumed energy, because energy attribution is done by
        // MobileRadioPowerStatsProcessor.
        updateCellularBatteryStats(modemActivityInfo, networkStatsDeltas, POWER_DATA_UNAVAILABLE,
        updateCellularBatteryStats(modemActivityInfo, networkStatsDelta, POWER_DATA_UNAVAILABLE,
                elapsedRealtimeMs, uptimeMs);
    }
    private void updateCellularBatteryStats(@Nullable ModemActivityInfo deltaInfo,
            @Nullable List<NetworkStatsDelta> delta, long consumedChargeUC, long elapsedRealtimeMs,
            @Nullable NetworkStats delta, long consumedChargeUC, long elapsedRealtimeMs,
            long uptimeMs) {
        // Add modem tx power to history.
        addModemTxPowerToHistory(deltaInfo, elapsedRealtimeMs, uptimeMs);
@@ -12999,7 +12934,7 @@ public class BatteryStatsImpl extends BatteryStats {
            long totalRxPackets = 0;
            long totalTxPackets = 0;
            if (delta != null) {
                for (NetworkStatsDelta entry : delta) {
                for (NetworkStats.Entry entry : delta) {
                    if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                        continue;
                    }
@@ -13040,7 +12975,7 @@ public class BatteryStatsImpl extends BatteryStats {
                // Now distribute proportional blame to the apps that did networking.
                long totalPackets = totalRxPackets + totalTxPackets;
                if (totalPackets > 0) {
                    for (NetworkStatsDelta entry : delta) {
                    for (NetworkStats.Entry entry : delta) {
                        if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                            continue;
                        }
+7 −8
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.MobileRadioPowerStatsLayout;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.LongSupplier;
@@ -71,7 +70,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
    interface Observer {
        void onMobileRadioPowerStatsRetrieved(
                @Nullable ModemActivityInfo modemActivityDelta,
                @Nullable List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas,
                @Nullable NetworkStats networkStatsDeltas,
                long elapsedRealtimeMs, long uptimeMs);
    }

@@ -86,6 +85,8 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
        TelephonyManager getTelephonyManager();
        LongSupplier getCallDurationSupplier();
        LongSupplier getPhoneSignalScanDurationSupplier();

        NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats);
    }

    private final Injector mInjector;
@@ -190,7 +191,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
        mPowerStats.uidStats.clear();

        ModemActivityInfo modemActivityDelta = collectModemActivityInfo();
        List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas = collectNetworkStats();
        NetworkStats networkStatsDeltas = collectNetworkStats();

        mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);

@@ -288,17 +289,15 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
        return deltaInfo;
    }

    private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
    private NetworkStats collectNetworkStats() {
        NetworkStats networkStats = mNetworkStatsSupplier.get();
        if (networkStats == null) {
            return null;
        }

        List<BatteryStatsImpl.NetworkStatsDelta> delta =
                BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
        NetworkStats delta = mInjector.networkStatsDelta(networkStats, mLastNetworkStats);
        mLastNetworkStats = networkStats;
        for (int i = delta.size() - 1; i >= 0; i--) {
            BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
        for (NetworkStats.Entry uidDelta : delta) {
            long rxBytes = uidDelta.getRxBytes();
            long txBytes = uidDelta.getTxBytes();
            long rxPackets = uidDelta.getRxPackets();
+7 −8
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.WifiPowerStatsLayout;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
@@ -43,7 +42,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {

    interface Observer {
        void onWifiPowerStatsRetrieved(WifiActivityEnergyInfo info,
                List<BatteryStatsImpl.NetworkStatsDelta> delta, long elapsedRealtimeMs,
                NetworkStats delta, long elapsedRealtimeMs,
                long uptimeMs);
    }

@@ -66,6 +65,8 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {
        Supplier<NetworkStats> getWifiNetworkStatsSupplier();
        WifiManager getWifiManager();
        WifiStatsRetriever getWifiStatsRetriever();

        NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats);
    }

    private final Injector mInjector;
@@ -161,7 +162,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {
        } else {
            collectWifiActivityStats();
        }
        List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas = collectNetworkStats();
        NetworkStats networkStatsDeltas = collectNetworkStats();
        collectWifiScanTime();

        mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);
@@ -227,17 +228,15 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {
        mPowerStats.durationMs = duration;
    }

    private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
    private NetworkStats collectNetworkStats() {
        NetworkStats networkStats = mNetworkStatsSupplier.get();
        if (networkStats == null) {
            return null;
        }

        List<BatteryStatsImpl.NetworkStatsDelta> delta =
                BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
        NetworkStats delta = mInjector.networkStatsDelta(networkStats, mLastNetworkStats);
        mLastNetworkStats = networkStats;
        for (int i = delta.size() - 1; i >= 0; i--) {
            BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
        for (NetworkStats.Entry uidDelta : delta) {
            long rxBytes = uidDelta.getRxBytes();
            long txBytes = uidDelta.getTxBytes();
            long rxPackets = uidDelta.getRxPackets();
+5 −0
Original line number Diff line number Diff line
@@ -158,6 +158,11 @@ public class MobileRadioPowerStatsCollectorTest {
        public LongSupplier getPhoneSignalScanDurationSupplier() {
            return mScanDurationSupplier;
        }

        @Override
        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
            return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
        }
    };

    @Before
+5 −0
Original line number Diff line number Diff line
@@ -283,6 +283,11 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
    protected void updateBatteryPropertiesLocked() {
    }

    @Override
    protected NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
        return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
    }

    public static class DummyExternalStatsSync implements ExternalStatsSync {
        public int flags = 0;

Loading