If too many clients try to connect to the master at the same time, some of them might fail if the master doesn't accept the connections fast enough.
Signed-off-by: Michael Hanselmann <[email protected]> --- lib/luxi.py | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/luxi.py b/lib/luxi.py index f062816..97333dc 100644 --- a/lib/luxi.py +++ b/lib/luxi.py @@ -37,6 +37,7 @@ import errno from ganeti import serializer from ganeti import constants from ganeti import errors +from ganeti import utils KEY_METHOD = 'method' @@ -156,15 +157,25 @@ class Transport: try: self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.socket.settimeout(self._ctimeout) + + def _Connect(): + self.socket.settimeout(self._ctimeout) + try: + self.socket.connect(address) + except socket.timeout, err: + raise TimeoutError("Connect timed out: %s" % str(err)) + except socket.error, err: + if err.args[0] in (errno.ENOENT, errno.ECONNREFUSED): + raise NoMasterError(address) + if err.args[0] == errno.EAGAIN: + raise utils.RetryAgain() + raise + try: - self.socket.connect(address) - except socket.timeout, err: - raise TimeoutError("Connect timed out: %s" % str(err)) - except socket.error, err: - if err.args[0] in (errno.ENOENT, errno.ECONNREFUSED): - raise NoMasterError(address) - raise + utils.Retry(_Connect, 1.0, self._ctimeout) + except utils.RetryTimeout: + raise TimeoutError("Connect timed out") + self.socket.settimeout(self._rwtimeout) except (socket.error, NoMasterError): if self.socket is not None: -- 1.6.6
