From 90ed2f5c28e7b6f10b0798be81d23f71a19c262f Mon Sep 17 00:00:00 2001 From: "Ruben S. Montero" Date: Wed, 25 Jan 2017 23:37:50 +0100 Subject: [PATCH] F #2347: Re-evaluate host requirements in dispatch loop to fulfil anti-affinity rules --- src/scheduler/src/pool/VMGroupXML.cc | 6 ++--- src/scheduler/src/sched/Scheduler.cc | 33 +++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/scheduler/src/pool/VMGroupXML.cc b/src/scheduler/src/pool/VMGroupXML.cc index 60a496e4cd..60ddcbe11d 100644 --- a/src/scheduler/src/pool/VMGroupXML.cc +++ b/src/scheduler/src/pool/VMGroupXML.cc @@ -351,12 +351,12 @@ static void schecule_affined_set(std::set vms, } else { - std::ostringstream oss; + std::ostringstream oss_reqs; std::string reqs; - VMGroupRole::host_requirements(hosts, "=", "|", oss); + VMGroupRole::host_requirements(hosts, "=", "|", oss_reqs); - reqs = oss.str(); + reqs = oss_reqs.str(); for ( it = vms.begin() ; it != vms.end() ; ++it ) { diff --git a/src/scheduler/src/sched/Scheduler.cc b/src/scheduler/src/sched/Scheduler.cc index 0217969cf0..1d96d72a38 100644 --- a/src/scheduler/src/sched/Scheduler.cc +++ b/src/scheduler/src/sched/Scheduler.cc @@ -598,7 +598,8 @@ static bool match_host(AclXML * acls, UserPoolXML * upool, VirtualMachineXML* vm if (matched == false) { - error = "It does not fulfill SCHED_REQUIREMENTS."; + error = "It does not fulfill SCHED_REQUIREMENTS: " + + vm->get_requirements(); return false; } } @@ -873,7 +874,8 @@ void Scheduler::match_schedule() vmpool->update(vm); - log_match(vm->get_oid(), "Cannot schedule VM, there is no suitable host."); + log_match(vm->get_oid(), + "Cannot schedule VM, there is no suitable host."); continue; } @@ -1072,7 +1074,8 @@ void Scheduler::dispatch() int hid, dsid, cid; unsigned int dispatched_vms = 0; - bool dispatched; + bool dispatched, matched; + char * estr; map::const_iterator vm_it; @@ -1137,6 +1140,26 @@ void Scheduler::dispatch() cid = host->get_cid(); + //------------------------------------------------------------------ + // Check host still match requirements for ANTI_AFFINITY rules + //------------------------------------------------------------------ + if ( host->eval_bool(vm->get_requirements(), matched, &estr) != 0 ) + { + free(estr); + continue; + } + + if (matched == false) + { + std::ostringstream mss; + + mss << "Host " << hid << " no longer meets requirements for VM " + << vm->get_oid() << "\n"; + + NebulaLog::log("SCHED", Log::DEBUG, mss); + continue; + } + //------------------------------------------------------------------ // Test host capacity //------------------------------------------------------------------ @@ -1415,11 +1438,11 @@ void Scheduler::do_vm_groups() oss << *grp << "\n"; + grp->set_affinity_requirements(vmpool, vm_roles_pool, oss); + grp->set_antiaffinity_requirements(vmpool, oss); grp->set_host_requirements(vmpool, oss); - - grp->set_affinity_requirements(vmpool, vm_roles_pool, oss); } NebulaLog::log("VMGRP", Log::DDDEBUG, oss);