summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-02-08 23:03:27 +0000
committerGerrit Code Review <review@openstack.org>2012-02-08 23:03:27 +0000
commite456d2b4e258880f7a34044aacf13eb02cbfd532 (patch)
tree7620204d5b8a27d75266a54ccfa413770fb62870
parent4f9994be44cb3329d13f9158f50aa64609e48348 (diff)
parent6ab291fb54591836ea3798ec214555e5d63e7f22 (diff)
downloadnova-e456d2b4e258880f7a34044aacf13eb02cbfd532.tar.gz
nova-e456d2b4e258880f7a34044aacf13eb02cbfd532.tar.xz
nova-e456d2b4e258880f7a34044aacf13eb02cbfd532.zip
Merge "Stop using LoopingCall in nova.virt.xenapi_conn:wait_for_task()"
-rw-r--r--nova/virt/xenapi_conn.py80
1 files changed, 35 insertions, 45 deletions
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index bbbc62df7..f43390a7d 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -65,7 +65,7 @@ import time
import urlparse
import xmlrpclib
-from eventlet import event
+from eventlet import greenthread
from eventlet import queue
from eventlet import tpool
from eventlet import timeout
@@ -563,54 +563,44 @@ class XenAPISession(object):
def wait_for_task(self, task, uuid=None):
"""Return the result of the given task. The task is polled
until it completes."""
- done = event.Event()
- loop = utils.LoopingCall(f=None)
-
- def _poll_task():
+ while True:
"""Poll the given XenAPI task, and return the result if the
action was completed successfully or not.
"""
- try:
- ctxt = context.get_admin_context()
- name = self.call_xenapi("task.get_name_label", task)
- status = self.call_xenapi("task.get_status", task)
-
- # Ensure action is never > 255
- action = dict(action=name[:255], error=None)
- log_instance_actions = (FLAGS.xenapi_log_instance_actions and
- uuid)
+ ctxt = context.get_admin_context()
+ name = self.call_xenapi("task.get_name_label", task)
+ status = self.call_xenapi("task.get_status", task)
+
+ # Ensure action is never > 255
+ action = dict(action=name[:255], error=None)
+ log_instance_actions = (FLAGS.xenapi_log_instance_actions and
+ uuid)
+ if log_instance_actions:
+ action["instance_uuid"] = uuid
+
+ if status == "pending":
+ pass
+ elif status == "success":
+ result = self.call_xenapi("task.get_result", task)
+ LOG.info(_("Task [%(name)s] %(task)s status:"
+ " success %(result)s") % locals())
+
if log_instance_actions:
- action["instance_uuid"] = uuid
-
- if status == "pending":
- return
- elif status == "success":
- result = self.call_xenapi("task.get_result", task)
- LOG.info(_("Task [%(name)s] %(task)s status:"
- " success %(result)s") % locals())
-
- if log_instance_actions:
- db.instance_action_create(ctxt, action)
-
- done.send(_parse_xmlrpc_value(result))
- else:
- error_info = self.call_xenapi("task.get_error_info", task)
- LOG.warn(_("Task [%(name)s] %(task)s status:"
- " %(status)s %(error_info)s") % locals())
-
- if log_instance_actions:
- action["error"] = str(error_info)
- db.instance_action_create(ctxt, action)
-
- done.send_exception(self.XenAPI.Failure(error_info))
- except self.XenAPI.Failure, exc:
- LOG.warn(exc)
- done.send_exception(*sys.exc_info())
- loop.stop()
-
- loop.f = _poll_task
- loop.start(FLAGS.xenapi_task_poll_interval, now=True)
- return done.wait()
+ db.instance_action_create(ctxt, action)
+
+ return _parse_xmlrpc_value(result)
+ else:
+ error_info = self.call_xenapi("task.get_error_info", task)
+ LOG.warn(_("Task [%(name)s] %(task)s status:"
+ " %(status)s %(error_info)s") % locals())
+
+ if log_instance_actions:
+ action["error"] = str(error_info)
+ db.instance_action_create(ctxt, action)
+
+ raise self.XenAPI.Failure(error_info)
+
+ greenthread.sleep(FLAGS.xenapi_task_poll_interval)
def _create_session(self, url):
"""Stubout point. This can be replaced with a mock session."""