在nova/virt/libvirt/driver.py 中通过FixedIntervalLoopingCall 实现了一个定时任务
def _wait_for_destroy(expected_domid):
"""Called at an interval until the VM is gone."""
# NOTE(vish): If the instance disappears during the destroy
# we ignore it so the cleanup can still be
# attempted because we would prefer destroy to
# never fail.
try:
dom_info = self.get_info(instance)
state = dom_info.state
new_domid = dom_info.id
except exception.InstanceNotFound:
LOG.info(_LI("During wait destroy, instance disappeared."),
instance=instance)
raise loopingcall.LoopingCallDone()
if state == power_state.SHUTDOWN:
LOG.info(_LI("Instance destroyed successfully."),
instance=instance)
//通过raise 异常的方式结束time
raise loopingcall.LoopingCallDone()
//这里from oslo_service import loopingcall。通过loopingcall.FixedIntervalLoopingCall 就会得到一个time,这个time的回调函数同样是_wait_for_destroy
timer = loopingcall.FixedIntervalLoopingCall(_wait_for_destroy,
old_domid)
在0.5s后启动这个time,并通过wait等待其运行结束。
timer.start(interval=0.5).wait()
if kwargs['is_running']:
LOG.info(_LI("Going to destroy instance again."),
instance=instance)
self._destroy(instance)
else:
# NOTE(GuanQiang): teardown container to avoid resource leak
if CONF.libvirt.virt_type == 'lxc':
self._teardown_container(instance)
nova中通过FixedIntervalLoopingCall实现的定时任务
最新推荐文章于 2020-03-25 16:22:56 发布