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

Commit fef69a12 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Don't time out when fetching tether offload stats.

Currently, fetching tethering offload stats has a 1000ms timeout,
after which we return stats of zero. However, returning zero is
invalid and will cause various parts of the network stats
accounting code to complain that statistics are moving backwards,
causing at least a log.wtf, and possibly a crash.

This CL removes the timeout entirely.

An alternative would have been to keep the timeout and return
null if the stats fetch failed. However, this complicates the
code, and if the HAL is persistently slow, could cause no stats
to be counted, ever. Given the impact of such behaviour on users'
data plans it is likely better to block until the stats are
collected.

Bug: 29337859
Bug: 32163131
Test: builds
Test: OffloadControllerTest passes
Change-Id: I9c9413d757f44e87a51ea7ca82b657cc6aa0d4ba
parent 8c253ade
Loading
Loading
Loading
Loading
+17 −29
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
@@ -58,8 +57,6 @@ import java.util.concurrent.TimeUnit;
public class OffloadController {
    private static final String TAG = OffloadController.class.getSimpleName();

    private static final int STATS_FETCH_TIMEOUT_MS = 1000;

    private final Handler mHandler;
    private final OffloadHardwareInterface mHwInterface;
    private final ContentResolver mContentResolver;
@@ -177,10 +174,10 @@ public class OffloadController {
        @Override
        public NetworkStats getTetherStats() {
            NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);
            CountDownLatch latch = new CountDownLatch(1);

            mHandler.post(() -> {
                try {
            // We can't just post to mHandler because we are mostly (but not always) called by
            // NetworkStatsService#performPollLocked, which is (currently) on the same thread as us.
            mHandler.runWithScissors(() -> {
                NetworkStats.Entry entry = new NetworkStats.Entry();
                entry.set = SET_DEFAULT;
                entry.tag = TAG_NONE;
@@ -194,16 +191,7 @@ public class OffloadController {
                    entry.txBytes = mForwardedStats.get(iface).txBytes;
                    stats.addValues(entry);
                }
                } finally {
                    latch.countDown();
                }
            });

            try {
                latch.await(STATS_FETCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                mLog.e("Tethering stats fetch timed out after " + STATS_FETCH_TIMEOUT_MS + "ms");
            }
            }, 0);

            return stats;
        }