From a48649002970b2150d24d0622a100f54045443c5 Mon Sep 17 00:00:00 2001 From: "Lisak, Peter" Date: Mon, 12 Oct 2015 14:42:01 +0200 Subject: [PATCH] swift-recon fails with socket.timeout exception If some server is overloaded or timeout set too low, swift-recon fails with raised socket.timeout exception. This error should be processed the same way as HTTPError/URLError. Change-Id: Ide8843977ab224fa866097d0f0b765d6899c66b8 --- swift/cli/recon.py | 6 +++--- test/unit/cli/test_recon.py | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/swift/cli/recon.py b/swift/cli/recon.py index f77a00ff09..a13dde1095 100644 --- a/swift/cli/recon.py +++ b/swift/cli/recon.py @@ -18,7 +18,7 @@ from __future__ import print_function -from eventlet.green import urllib2 +from eventlet.green import urllib2, socket from six.moves.urllib.parse import urlparse from swift.common.utils import SWIFT_CONF_FILE from swift.common.ring import Ring @@ -88,7 +88,7 @@ class Scout(object): print("-> %s: %s" % (url, err)) content = err status = err.code - except urllib2.URLError as err: + except (urllib2.URLError, socket.timeout) as err: if not self.suppress_errors or self.verbose: print("-> %s: %s" % (url, err)) content = err @@ -130,7 +130,7 @@ class Scout(object): print("-> %s: %s" % (url, err)) content = err status = err.code - except urllib2.URLError as err: + except (urllib2.URLError, socket.timeout) as err: if not self.suppress_errors or self.verbose: print("-> %s: %s" % (url, err)) content = err diff --git a/test/unit/cli/test_recon.py b/test/unit/cli/test_recon.py index 6fef1d3332..428f8b5b14 100644 --- a/test/unit/cli/test_recon.py +++ b/test/unit/cli/test_recon.py @@ -24,7 +24,7 @@ import tempfile import time import unittest -from eventlet.green import urllib2 +from eventlet.green import urllib2, socket from six import StringIO from six.moves import urllib @@ -86,6 +86,15 @@ class TestScout(unittest.TestCase): self.assertTrue(isinstance(content, urllib2.HTTPError)) self.assertEqual(status, 404) + @mock.patch('eventlet.green.urllib2.urlopen') + def test_scout_socket_timeout(self, mock_urlopen): + mock_urlopen.side_effect = socket.timeout("timeout") + url, content, status, ts_start, ts_end = self.scout_instance.scout( + ("127.0.0.1", "8080")) + self.assertTrue(isinstance(content, socket.timeout)) + self.assertEqual(url, self.url) + self.assertEqual(status, -1) + @mock.patch('eventlet.green.urllib2.urlopen') def test_scout_server_type_ok(self, mock_urlopen): def getheader(name): @@ -117,6 +126,15 @@ class TestScout(unittest.TestCase): self.assertTrue(isinstance(content, urllib2.HTTPError)) self.assertEqual(status, 404) + @mock.patch('eventlet.green.urllib2.urlopen') + def test_scout_server_type_socket_timeout(self, mock_urlopen): + mock_urlopen.side_effect = socket.timeout("timeout") + url, content, status = self.scout_instance.scout_server_type( + ("127.0.0.1", "8080")) + self.assertTrue(isinstance(content, socket.timeout)) + self.assertEqual(url, self.server_type_url) + self.assertEqual(status, -1) + class TestRecon(unittest.TestCase): def setUp(self, *_args, **_kwargs):