Handle EPIPE Broken Pipe from Libvirt RPC
If Libvirt (virtqemud when modular or libvirtd when using monolith) is restarted while we are polling the RPC layer can return a EPIPE Broken Pipe (errcode 32) to us. We should retry when we get this as the service might be back again and we just got aborted because it was restarted. Change-Id: If273f6e9c26f992fb31fccf69d869d7494d41e30 Signed-off-by: Tobias Urdin <tobias.urdin@binero.com> (cherry picked from commit2a452552b3) (cherry picked from commitf1d638faa1)
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import errno
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
import tenacity
|
||||
@@ -107,11 +108,17 @@ def refresh_libvirt_connection(conf, klass):
|
||||
def is_disconnection_exception(e):
|
||||
if not libvirt:
|
||||
return False
|
||||
return (isinstance(e, libvirt.libvirtError)
|
||||
and e.get_error_code() in (libvirt.VIR_ERR_SYSTEM_ERROR,
|
||||
libvirt.VIR_ERR_INTERNAL_ERROR)
|
||||
and e.get_error_domain() in (libvirt.VIR_FROM_REMOTE,
|
||||
libvirt.VIR_FROM_RPC))
|
||||
if not isinstance(e, libvirt.libvirtError):
|
||||
return False
|
||||
is_libvirt_error = (
|
||||
e.get_error_code() in (libvirt.VIR_ERR_SYSTEM_ERROR,
|
||||
libvirt.VIR_ERR_INTERNAL_ERROR)
|
||||
and e.get_error_domain() in (libvirt.VIR_FROM_REMOTE,
|
||||
libvirt.VIR_FROM_RPC))
|
||||
is_system_error = (
|
||||
e.get_error_domain() == libvirt.VIR_FROM_RPC
|
||||
and e.get_error_code() == errno.EPIPE)
|
||||
return is_libvirt_error or is_system_error
|
||||
|
||||
|
||||
retry_on_disconnect = tenacity.retry(
|
||||
|
||||
Reference in New Issue
Block a user