From: Dunrong Huang Date: Wed, 14 Jan 2015 05:56:43 +0000 (+0800) Subject: Fix eqlx endless loop when server closes the connection X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=a762665595f0f38bacb50d1a032df1c82b3a4c60;p=openstack-build%2Fcinder-build.git Fix eqlx endless loop when server closes the connection The eqlx driver would identify one CLI command completion by looking for the system name prompt in the output ("ARRAY_NAME>"). But some cases where there is no "ARRAY_NAME>" in the output. The eqlx server closes the ssh connection immediately after sends such message, which lead to a infinite loop in _get_output() and 100% CPU utilization. What the patch does is to check the return of chan.recv(), if the length of returned string is zero, which means server has closed the connection, the loop will be exited. Closes-Bug: #1410627 Signed-off-by: Dunrong Huang Change-Id: I600c38d98f0f808c98df010a89ac58ca8e43f1a3 --- diff --git a/cinder/volume/drivers/eqlx.py b/cinder/volume/drivers/eqlx.py index 646221901..7739b5111 100644 --- a/cinder/volume/drivers/eqlx.py +++ b/cinder/volume/drivers/eqlx.py @@ -136,7 +136,16 @@ class DellEQLSanISCSIDriver(SanISCSIDriver): out = '' ending = '%s> ' % self.configuration.eqlx_group_name while out.find(ending) == -1: - out += chan.recv(102400) + ret = chan.recv(102400) + if len(ret) == 0: + # According to paramiko.channel.Channel documentation, which + # says "If a string of length zero is returned, the channel + # stream has closed". So we can confirm that the EQL server + # has closed the connection. + msg = _("The EQL array has closed the connection.") + LOG.error(msg) + raise processutils.ProcessExecutionError(description=msg) + out += ret LOG.debug("CLI output\n%s", out) return out.splitlines()