record_android_trace: allow temporary ADB failures
In some occasions the ADB connection can be lost while waiting
for the background process. This can be either the user accidentally
pulling the cable or some service restarting ADB.
Allow temporary ADB failures up to 10 x 2s = 20 seconds.
Test: manual: start recording a trace; pull the USB cable; replug it; CTRL-C; check the trace file
Change-Id: I22045ed1cd82f9577608a90ab6301b08a9dd533a
diff --git a/tools/record_android_trace b/tools/record_android_trace
index 7fcffc6..f4c2d4b 100755
--- a/tools/record_android_trace
+++ b/tools/record_android_trace
@@ -51,6 +51,8 @@
'x86_64': 'x64',
}
+MAX_ADB_FAILURES = 15 # 2 seconds between retries, 30 seconds total.
+
devnull = open(os.devnull, 'rb')
adb_path = None
procs = []
@@ -256,17 +258,34 @@
'1')
ctrl_c_count = 0
+ adb_failure_count = 0
while ctrl_c_count < 2:
try:
- poll = adb('shell', 'test -d /proc/' + bg_pid)
- if poll.wait() != 0:
- break
- time.sleep(0.5)
+ poll = adb('shell', 'test -d /proc/%s || exit 42' % bg_pid)
+ poll_res = poll.wait()
+ if poll_res == 42:
+ break # Process terminated
+ if poll_res == 0:
+ # The 'perfetto' cmdline client is still running. If previously we had
+ # an ADB error, tell the user now it's all right again.
+ if adb_failure_count > 0:
+ adb_failure_count = 0
+ prt('ADB connection re-established, the trace is still ongoing',
+ ANSI.BLUE)
+ time.sleep(0.5)
+ continue
+ # Some ADB error happened. This can happen when tracing soon after boot,
+ # before logging in, when adb gets restarted.
+ adb_failure_count += 1
+ if adb_failure_count >= MAX_ADB_FAILURES:
+ prt('Too many unrecoverable ADB failures, bailing out', ANSI.RED)
+ sys.exit(1)
+ time.sleep(2)
except KeyboardInterrupt:
sig = 'TERM' if ctrl_c_count == 0 else 'KILL'
ctrl_c_count += 1
prt('Stopping the trace (SIG%s)' % sig, ANSI.BLACK + ANSI.BG_YELLOW)
- res = adb('shell', 'kill -%s %s' % (sig, bg_pid)).wait()
+ adb('shell', 'kill -%s %s' % (sig, bg_pid)).wait()
logcat.kill()
logcat.wait()