diff options
author | erikchen <erikchen@chromium.org> | 2015-10-21 16:43:35 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-21 23:44:28 +0000 |
commit | 9d997abec9056fc987ff4028b765793a83d6f60c (patch) | |
tree | 80357833018815ac26b12836b8cd096c1951854c | |
parent | 70dd5863813a50a6f0ba47e0ef3ae6b89cb802e8 (diff) | |
download | chromium_src-9d997abec9056fc987ff4028b765793a83d6f60c.zip chromium_src-9d997abec9056fc987ff4028b765793a83d6f60c.tar.gz chromium_src-9d997abec9056fc987ff4028b765793a83d6f60c.tar.bz2 |
telemetry: Handle errno.EAGAIN in inspector_websocket.py
BUG=545853
Review URL: https://codereview.chromium.org/1413573005
Cr-Commit-Position: refs/heads/master@{#355437}
2 files changed, 35 insertions, 1 deletions
diff --git a/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py b/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py index 7eaaaea..a1fee26 100644 --- a/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py +++ b/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py @@ -2,8 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import errno import json import logging +import socket +import time from telemetry.core import exceptions from telemetry.internal.backends.chrome_inspector import websocket @@ -140,7 +143,21 @@ class InspectorWebsocket(object): raise WebSocketDisconnected() self._SetTimeout(timeout) - data = self._socket.recv() + + keep_trying = True + while keep_trying: + try: + data = self._socket.recv() + keep_trying = False + except socket.error, e: + if e.errno == errno.EAGAIN: + # Resource is temporarily unavailable. Try again. + # See https://code.google.com/p/chromium/issues/detail?id=545853#c3 + # for more details. + time.sleep(0.1) + continue + keep_trying = False + result = json.loads(data) if logging.getLogger().isEnabledFor(logging.DEBUG): logging.debug( diff --git a/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket_unittest.py b/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket_unittest.py index 1bffb77..6db8893 100644 --- a/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket_unittest.py +++ b/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket_unittest.py @@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import errno +import socket import unittest from telemetry import decorators @@ -37,6 +39,8 @@ class FakeSocket(object): raise websocket.WebSocketTimeoutException() self._mock_timer.SetTime(time) + if isinstance(response, Exception): + raise response return response def settimeout(self, timeout): @@ -155,3 +159,16 @@ class InspectorWebsocketUnittest(unittest.TestCase): fake_socket.AddResponse('{"id": 6666666, "result": {}}', 1) inspector.DispatchNotifications() self.assertEqual(2, response_count[0]) + + def testEAGAIN(self): + inspector = inspector_websocket.InspectorWebsocket() + fake_socket = FakeSocket(self._mock_timer) + # pylint: disable=protected-access + inspector._socket = fake_socket + + error = socket.error(errno.EAGAIN, "error string") + fake_socket.AddResponse(error, 4) + fake_socket.AddResponse('{"asdf": "qwer"}', 5) + + result = inspector._Receive() + self.assertEqual(result, {"asdf" : "qwer"}) |