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_INTERVALcls._periodic_tasks.append((name, task))cls._periodic_spacing[name] = task._periodic_spacingreturn 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 = Noneself.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_INTERVALfor task_name, task in self._periodic_tasks:if (task._periodic_external_ok and notself.conf.run_external_periodic_tasks):continuecls_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 skipidle_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)continueLOG.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:raiseLOG.exception(_LE("Error during %(full_task_name)s"),{"full_task_name": full_task_name})time.sleep(0)return idle_for

转载于:https://www.cnblogs.com/d-monkey/p/5299222.html

Openstack Periodic Task相关推荐

  1. nova中periodic task的实现

    作为个人学习笔记分享,有任何问题欢迎交流! 本文主要分析nova中periodic task的实现过程,周期性任务有如跟踪资源的变化,虚拟机状态的变化等.它的实现使用的python中的metaclas ...

  2. openstack 遇到的error

    也算是第一次搭建这个玩意,遇到的问题也是奇奇怪怪,这里记录一下,有些是绕过去的(完全不知道的怎么着手),所以仅供参考吧,版本为q版,系统是麒麟V10 查看注册节点 添加新的compute节点,一直注册 ...

  3. OpenStack Heat服务介绍

     http://zhenhua2000.blog.51cto.com/3167594/1324883 这篇博文开始介绍一下OpenStack中的Orchestration Service:Heat ...

  4. Test multipath feature by openstack lioadm (by quqi99)

    版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99) 问题 之前写过一篇关于使用tgtadm测试OpenS ...

  5. openstack虚拟机热迁移优化(victoria版)(附源码分析以及日志分析)

    优化目标 提高热迁移成功率 热迁移认知 热迁移是转移内存(或存储)的过程.源主机不断把虚拟机的内存转移到目的主机,直到源主机仅仅省一部分可以一次转移完成的内存未被转移,此时把源主机上的虚拟机暂停,转移 ...

  6. openstack学习笔记 glance

    glance-api glance-api 是系统后台运行的服务进程. 对外提供 REST API,响应 image 查询.获取和存储的调用. glance-api 不会真正处理请求. 如果操作是与 ...

  7. OpenStack集成Docker

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

  8. 在Ubuntu14.04上OpenStack Juno安装部署

    0 安装方式 0.1 安装方式 安装方式 说明 目标 备注 单结点 一台服务器运行所有的nova-xxx组件,同时也驱动虚拟实例. 这种配置只为尝试Nova,或者为了开发目的进行安装.   1控制节点 ...

  9. linux无任务内存被占满,centos服务器CPU被GC task占满,程序无内存溢出

    jstack查看获得如下信息: "VM Thread" prio=10 tid=0x00007f5ac4095800 nid=0xa599 runnable "GC ta ...

  10. Nova如何统计节点硬件资源

    引言 当我们在使用那些建设在OpenStack之上的云平台服务的时候,往往在概览页面都有一个明显的位置用来展示当前集群的一些资源使用情况,如,CPU,内存,硬盘等资源的总量.使用量.剩余量.而且,每当 ...

最新文章

  1. kali安装vscode和无法启动解决方法
  2. P1164 小A点菜
  3. 设计模式之美:Adapter(适配器)
  4. 域名无法加入域解决方法
  5. Linux(Ubuntu)下MySQL的安装与配置
  6. 163免费邮使用体验
  7. gcc编译多个源代码文件的过程(引出makefile)
  8. win7中能对窗口的排列方法是_win7系统窗口排列方式怎么修改?修改窗口排列方式方法...
  9. mac linux 权限 常用命令
  10. Bootstrap3 滚动监听插件的方法
  11. 波音737-800座位图哪个好_留学生坐飞机出国千万别选这些座位!航空公司不会告诉你的选座秘密........
  12. ArduPilot日志系统探索(一)
  13. 基于HTML5、JavaScript和CSS3的网页开发应用技术的网页
  14. S5P4418裸机之SDIO程序
  15. excel减法函数_会计小白的EXCEL学习笔记
  16. 不评价别人的生活,是一个人最基本的修养 // 转
  17. 苏宁并购家乐福是零售市场必然走向
  18. c语言求abc大小时要怎么输入,C语言 有3个数a,b,c,要求按大小顺序把它们输出。,急!!!!!有三个数abc,要求按大小顺序输出. 请问用C语...
  19. 网友整理的Android面试题集-附网友提供的参考答案
  20. 【Android 电量优化】电量优化 ( 唤醒锁定 | 使用 WeakLock 保持服务唤醒 | 屏幕唤醒 )

热门文章

  1. 计算机通识培训,通识培训研修日志
  2. @linux下tar解压失败a lone zero解决方法
  3. Linu下安装Jdk
  4. 基于STC单片机串口扩展网络通信的应用
  5. 简谈即时聊天系统设计
  6. 计算机技术与软件专业技术资格考试(初级程序员)(一)
  7. Windows 服务(1) (from MSDN)
  8. windows虚机使用IIS服务搭建ftp
  9. php把数组作为函数参数传递,使用关联数组作为函数的参数《 PHP 基础 》
  10. 什么是自然语言处理,自然语言处理能做什么,主要有哪些哪点?