资源信息的更新。调用HostManager对象的get_all_host_states方法获取所有活动的计算节点列表

get_all_host_states方法定义如下:hosts = self.host_manager.get_all_host_states(elevated)

/nova/scheduler/host_manager.py


class HostManger(object):
    def get_all_host_states(self, context):
        #获取所有计算节点
        compute_nodes = db.compute_node_get_all(context)
        seen_nodes = set()         #保存当前数据库中存在的节点
        for compute in compute_nodes:
            #获取节点的服务信息
            service = compute['service']
            #节点上没有服务,可能是过期节点
            if not service:
                continue
            #获取节点的主机名
            host = service['host']
            node = compute.get('hypervisor_hostname')  #节点的hypervisor主机名
            state_key = (host, node)
            #<strong><span style="color:#ff0000;">获取HostManager对象缓存的服务状态和节点状态信息</span></strong>
            capabilities = self.service_states.get(state_key,None)
            host_state = self.host_state_map.get(state_key)
            #如果host_state存在,说明是旧节点
            if host_state:
                #<span style="color:#ff0000;"><strong>更新节点的性能信息</strong></span>
                host_state.update_capabilities(capabilities, dict(service.iteritems))
            else:
                #<strong><span style="color:#ff0000;">添加新节点的状态信息</span></strong>
                host_state = self.host_state_cls(host, node,capabilities=capabilities,service=dict(service.iteritems()))
                self.host_state_map[state_key] = host_state
            #更新计算节点的硬件资源信息
            host_state.update_from_compute_node(compute)
            seen_nodes.add(state_key)
        #获取不活动的节点列表
        dead_nodes = set(self.host_state_map.keys()) - seen_nodes
        #删除不活动节点的缓存信息
        for state_key in dead_nodes:
            host, node = state_key
            del self.host_state_map[state_key]
        return self.host_state_map.itervalues()

主要完成两个功能:

1、获取当前所有活动的计算节点列表

2、更新和维护HostManager对象缓存的节点状态信息

(1)、调用db.compute_node_get_all方法获取数据库中当前活动的计算节点信息列表。列表中保存可用计算节点的

CPU、内存和硬盘等资源的最新信息。

  a)、数据库中计算节点的硬件资源信息由Nova Compute服务维护。当Nova Compute服务执行完虚拟机操作之后,

都会更新数据库中相对应计算节点的硬件资源信息。

  b)、为了保证数据库中计算节点硬件资源信息的实时性,Nova Compute服务设置了一个(后面介绍)

update_available_resource定时任务,定时更新计算节点的硬件资源信息。

(2)、获取计算节点的主机名和Hypervisor主机名。hostname查看主机名,virsh hostname。一般相同。

(3)、变量capabilities存储的是HostManager对象缓存的计算节点性能信息(包括计算节点节点的CPU、内存、硬盘

的使用状况,也包括计算节点Hypervisor支持的特性)。该性能信息也是由Nova Compute服务的定时任务

(update_capabilities)定时向Nova Scheduler服务报告节点的性能信息。

(4)、host_state变量的update_from_compute_node方法更新计算节点的硬件资源信息。 host_state变量是一个

HostState对象。HostState类的update_from_compute_node方法定义:


def update_from_compute_node(self, compute):
        """Update information about a host from a ComputeNode object."""
        if (self.updated and compute.updated_at #如果缓存的信息新,则不更新
                and self.updated > compute.updated_at):
            return
...

注意:update_from_compute_node更新计算节点的硬件资源信息,始终认为越新的数据越准。

(5)、HostManager类get_all_host_states方法最后几行代码  删除HostManager对象缓存的过期节点信息。