summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorerikchen <erikchen@chromium.org>2015-10-21 16:43:35 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-21 23:44:28 +0000
commit9d997abec9056fc987ff4028b765793a83d6f60c (patch)
tree80357833018815ac26b12836b8cd096c1951854c
parent70dd5863813a50a6f0ba47e0ef3ae6b89cb802e8 (diff)
downloadchromium_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}
-rw-r--r--tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py19
-rw-r--r--tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket_unittest.py17
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"})