Index: build/android/pylib/base_test_sharder.py |
diff --git a/build/android/pylib/base_test_sharder.py b/build/android/pylib/base_test_sharder.py |
index 5306769155050ba032364650daeecaa1581e609b..1418cf0f6fd0d1b296ef3db41d0a6dd7b88c83a5 100644 |
--- a/build/android/pylib/base_test_sharder.py |
+++ b/build/android/pylib/base_test_sharder.py |
@@ -7,6 +7,7 @@ import android_commands |
import logging |
import multiprocessing |
+from android_commands import errors |
from test_result import TestResults |
@@ -43,7 +44,9 @@ class BaseTestSharder(object): |
def __init__(self, attached_devices): |
self.attached_devices = attached_devices |
- self.retries = 1 |
+ # Worst case scenario: a device will drop offline per run, so we need |
+ # to retry until we're out of devices. |
+ self.retries = len(self.attached_devices) |
self.tests = [] |
def CreateShardedTestRunner(self, device, index): |
@@ -83,12 +86,20 @@ class BaseTestSharder(object): |
logging.warning('Try %d of %d', retry + 1, self.retries) |
self.SetupSharding(self.tests) |
test_runners = [] |
- for index, device in enumerate(self.attached_devices): |
- logging.warning('*' * 80) |
- logging.warning('Creating shard %d for %s', index, device) |
- logging.warning('*' * 80) |
- test_runner = self.CreateShardedTestRunner(device, index) |
- test_runners += [test_runner] |
+ |
+ # Try to create N shards, and retrying on failure. |
+ try: |
Yaron
2012/10/31 17:18:51
Shouldn't this try be in the for loop? |device| is
bulach
2012/10/31 18:10:35
not really.. we need to create all shards at once,
|
+ for index, device in enumerate(self.attached_devices): |
+ logging.warning('*' * 80) |
+ logging.warning('Creating shard %d for %s', index, device) |
+ logging.warning('*' * 80) |
+ test_runner = self.CreateShardedTestRunner(device, index) |
+ test_runners += [test_runner] |
+ except errors.DeviceUnresponsiveError as e: |
+ logging.critical('****Failed to create a shard: [%s]', e) |
+ self.attached_devices.remove(device) |
+ continue |
Yaron
2012/10/31 17:18:51
By continuing, we're not updating |final_results|.
bulach
2012/10/31 18:10:35
this continue here would be for the loop on 85, so
Yaron
2012/10/31 18:37:23
Yes. My point was though that it looks like it's d
bulach
2012/10/31 19:18:17
ahn, yes, good point!
I added an else: clause to r
|
+ |
logging.warning('Starting...') |
pool = multiprocessing.Pool(len(self.attached_devices), |
SetTestsContainer, |
@@ -96,8 +107,12 @@ class BaseTestSharder(object): |
# map can't handle KeyboardInterrupt exception. It's a python bug. |
# So use map_async instead. |
async_results = pool.map_async(_ShardedTestRunnable, test_runners) |
- results_lists = async_results.get(999999) |
- |
+ try: |
+ results_lists = async_results.get(999999) |
Yaron
2012/10/31 17:18:51
Will the exception get thrown while the other shar
bulach
2012/10/31 18:10:35
it's not clear from the python documentation if th
Yaron
2012/10/31 18:37:23
Ah, right. Thanks.
|
+ except errors.DeviceUnresponsiveError as e: |
+ logging.critical('****Failed to run test: [%s]', e) |
+ self.attached_devices = android_commands.GetAttachedDevices() |
+ continue |
test_results = TestResults.FromTestResults(results_lists) |
# Re-check the attached devices for some devices may |
# become offline |