资源信息的更新。调用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对象缓存的过期节点信息。