Openstack Periodic Task

周期性任务在各个模块的manager.py(computer,scheduler,cell,network)中添加。



添加方法:在模块manager类实现中添加方法,并用装饰器periodic_task.periodic_task装饰。

实现机制

以ComputerManager类为例。

模块mananger类添加方法

在资源上报方法为例,装饰器指定该方法为周期性任务,并通过spacing参数指定任务执行间隔,不指定spacing参数则默认为60.0s。

nova.computer.manager.ComputerManager

@periodic_task.periodic_task(spacing=CONF.update_resources_interval)
  def update_available_resource
     …

periodic_task装饰器

periodic_task装饰器指明方法是周期性任务,并给周期性方法增加一些属性,包括周期型任务名称,任务执行间隔等。

oslo_service.periodic_task.periodic_task

def periodic_task(*args, **kwargs):
...

Manager类继承关系

nova.computer.manager.ComputerManager

nova.manager.Manager

nova.manager.PeriodicTask

oslo_service.periodic_task.PeriodicTask

PeriodicTask类对象通过元类PeriodicTasksMeta创建。

@six.add_metaclass(_PeriodicTasksMeta)
class PeriodicTasks(object):
  ...

PeriodicTasksMeta元类

PeriodicTasksMeta元类收集模块manager类中定义的周期性任务,并保存在_periodic_tasks列表中。

oslo_service.PeriodicTasksMeta

DEFAULT_INTERVAL = 60.0
class _PeriodicTasksMeta(type):
def _add_periodic_task(cls, task):
   """Add a periodic task to the list of periodic tasks.
   The task should already be decorated by @periodic_task.
  :return: whether task was actually enabled
  """
  name = task._periodic_name
  …
  if task._periodic_spacing == 0:
    task._periodic_spacing = DEFAULT_INTERVAL
  cls._periodic_tasks.append((name, task))
  cls._periodic_spacing[name] = task._periodic_spacing
  return True def __init__(cls, names, bases, dict_):
   """Metaclass that allows us to collect decorated periodic tasks."""
  …
  for value in cls.__dict__.values():
    if getattr(value, '_periodic_task', False):
      cls._add_periodic_task(value)

触发执行周期性任务

Computer进程启动时调用service的start方法,start方法中创建定时器,定时执行periodic_tasks方法。

1、nova.service.Service.

class Service(service.Service):
"""Service object for binaries running on hosts.
def start(self):
  …
  if self.periodic_enable:
    if self.periodic_fuzzy_delay:
      initial_delay = random.randint(0, self.periodic_fuzzy_delay)
     else:
      initial_delay = None
    self.tg.add_dynamic_timer(self.periodic_tasks,
        initial_delay=initial_delay,
        periodic_interval_max=
        self.periodic_interval_max)
def periodic_tasks(self, raise_on_error=False):
  """Tasks to be run at a periodic interval."""
  ctxt = context.get_admin_context()
  return self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error)

2、nova.manager.Manger

class Manager(base.Base, PeriodicTasks):
  def periodic_tasks(self, context, raise_on_error=False):
    """Tasks to be run at a periodic interval."""
    return self.run_periodic_tasks(context, raise_on_error=raise_on_error)

3、oslo_service.periodic_task.PeriodicTask

run_periodic_tasks方法遍历执行_periodic_tasks中收集的周期性任务。

class PeriodicTasks(object):
  def run_periodic_tasks(self, context, raise_on_error=False):
    """Tasks to be run at a periodic interval."""
    idle_for = DEFAULT_INTERVAL
    for task_name, task in self._periodic_tasks:
      if (task._periodic_external_ok and not
      self.conf.run_external_periodic_tasks):
      continue
    cls_name = reflection.get_class_name(self, fully_qualified=False)
    full_task_name = '.'.join([cls_name, task_name])
    spacing = self._periodic_spacing[task_name]
    last_run = self._periodic_last_run[task_name]
    # Check if due, if not skip
    idle_for = min(idle_for, spacing)
    if last_run is not None:
      delta = last_run + spacing - now()
      if delta > 0:
        idle_for = min(idle_for, delta)
        continue
    LOG.debug("Running periodic task %(full_task_name)s",
        {"full_task_name": full_task_name})
    self._periodic_last_run[task_name] = _nearest_boundary(
        last_run, spacing)
    try:
      task(self, context)
    except Exception:
        if raise_on_error:
          raise
        LOG.exception(_LE("Error during %(full_task_name)s"),
          {"full_task_name": full_task_name})
    time.sleep(0)
    return idle_for

Openstack Periodic Task的更多相关文章

  1. 探索 OpenStack 之(11):cinder-api Service 启动过程分析 以及 WSGI / Paste deploy / Router 等介绍

    OpenStack 中的每一个提供 REST API Service 的组件,比如 cinder-api,nova-api 等,其实是一个 WSGI App,其主要功能是接受客户端发来的 HTTP R ...

  2. OpenStack集成Docker

    声明:绝对原创,欢迎转载,但请标明出处,谢谢! 最近在做openstack与Docker的集成工作,走了不少弯路,遇到不少问题,不过最终搭建成功了.现在将过程分享出来,以供参考. 一.环境介绍 1.软 ...

  3. openstack中运行定时任务的两种方法及源代码分析

    启动一个进程,如要想要这个进程的某个方法定时得进行执行的话,在openstack有两种方式: 一种是通过继承 periodic_task.PeriodicTasks,另一种是使用loopingcall ...

  4. openstack(liberty):部署实验平台(三,简单版本软件安装 之cinder,swift)

    今天这里追加存储相关的部署,主要是Block和Object,为了看到效果,简单的部署在单节点上,即Block一个节点,Object对应一个节点. 读者可能会觉得我这个图和之前的两个post有点点不同, ...

  5. openstack(liberty):部署实验平台(二,简单版本软件安装 part2)

    继续前面的part1,将后续的compute以及network部分的安装过程记录完毕! 首先说说compute部分nova的安装. n1.准备工作.创建数据库,配置权限!(密码依旧是openstack ...

  6. openstack grizzly版network网络节点安装

    版本以及源的配置和控制节点一致 1.安装完操作系统已经apt源配置完成之后,一定要执行 apt-get update root@cloud:~# mv /etc/apt/sources.list /e ...

  7. OpenStack Heat总结之:Icehouse中通过Heat+Ceilometer实现Autoscaling

    在I版本号中,Heat中加入了对于AutoScaling资源的支持.github上也提供了相应的AutoScaling的模板(https://github.com/openstack/heat-tem ...

  8. Openstack Nova 源码分析 — Create instances (nova-conductor阶段)

    目录 目录 前言 Instance Flavor Instance Status Virt Driver Resource Tracker nova-conductor Create Instance ...

  9. 与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)

    原文:与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任 ...

随机推荐

  1. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  2. LDR详解

    ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是"LDR Rn,=expr".下面举一个例子来说明它的用法. COUNT EQU       ...

  3. ABP文档 - 嵌入的资源文件

    文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...

  4. 【.net 深呼吸】启动一个进程并实时获取状态信息

    地球人和火星人都知道,Process类既可以获取正在运行的进程,也可以启动一个新的进程.在79.77%应用场合,我们只需要让目标进程顺利启动就完事了,至于它执行了啥,有没有出错,啥时候退出就不管了. ...

  5. 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  6. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

  7. 游戏AI系列内容 咋样才能做个有意思的AI呢

    游戏AI系列内容 咋样才能做个有意思的AI呢 写在前面的话 怪物AI怎么才能做的比较有意思.其实这个命题有点大,我作为一个仅仅进入游戏行业两年接触怪物AI还不到一年的程序员来说,来谈这个话题,我想我是 ...

  8. SHA-1算法

    SHA-1.h #ifndef _SHA1_H #define _SHA1_H #include<iostream> using namespace std; //4个函数 #define ...

  9. APP多版本共存,服务端如何兼容?

    做过APP产品的技术人员都知道,APP应用属于一种C/S架构的,所以在做多版本兼容,升级等处理则比较麻烦,不像web应用那么容易.下面将带大家分析几种常见的情况和应对方式: 小改动或者新加功能的 这种 ...

  10. PostGIS(解压版)安装

    1.软件下载 postgresql-9.6.1-1-windows-x64-binaries.zip https://www.postgresql.org/download/windows/ post ...