From df272f8dbedad72dae95295616e2923ec8a8ad59 Mon Sep 17 00:00:00 2001 From: "Ruben S. Montero" Date: Fri, 11 Jun 2010 20:09:06 +0200 Subject: [PATCH] feature #258: Added support to limit the number of VMs submitted to a host at a time --- src/scheduler/include/Scheduler.h | 8 ++++++- src/scheduler/include/VirtualMachineXML.h | 5 ++++- src/scheduler/src/pool/VirtualMachineXML.cc | 19 +++++++++++++---- src/scheduler/src/sched/Scheduler.cc | 4 +++- src/scheduler/src/sched/mm_sched.cc | 23 ++++++++++++++++----- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/scheduler/include/Scheduler.h b/src/scheduler/include/Scheduler.h index bd972185ff..f32b09915a 100644 --- a/src/scheduler/include/Scheduler.h +++ b/src/scheduler/include/Scheduler.h @@ -45,13 +45,14 @@ public: protected: Scheduler(string& _url, time_t _timer, - int _machines_limit, int _dispatch_limit): + int _machines_limit, int _dispatch_limit, int _host_dispatch_limit): hpool(0), vmpool(0), timer(_timer), url(_url), machines_limit(_machines_limit), dispatch_limit(_dispatch_limit), + host_dispatch_limit(_host_dispatch_limit), threshold(0.9), client(0) { @@ -141,6 +142,11 @@ private: */ unsigned int dispatch_limit; + /** + * Limit of virtual machines to be deployed simultaneously to a given host. + */ + unsigned int host_dispatch_limit; + /** * Threshold value to round up freecpu */ diff --git a/src/scheduler/include/VirtualMachineXML.h b/src/scheduler/include/VirtualMachineXML.h index 01433fce58..96428fdab9 100644 --- a/src/scheduler/include/VirtualMachineXML.h +++ b/src/scheduler/include/VirtualMachineXML.h @@ -59,7 +59,10 @@ public: /** * */ - int get_host(int& hid, HostPoolXML * hpool); + int get_host(int& hid, + HostPoolXML * hpool, + map& host_vms, + int max_vms); void get_requirements (int& cpu, int& memory, int& disk); diff --git a/src/scheduler/src/pool/VirtualMachineXML.cc b/src/scheduler/src/pool/VirtualMachineXML.cc index e5943fee99..cae51e9ea4 100644 --- a/src/scheduler/src/pool/VirtualMachineXML.cc +++ b/src/scheduler/src/pool/VirtualMachineXML.cc @@ -130,7 +130,10 @@ void VirtualMachineXML::set_priorities(vector& total) /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -int VirtualMachineXML::get_host(int& hid, HostPoolXML * hpool) +int VirtualMachineXML::get_host(int& hid, + HostPoolXML * hpool, + map& host_vms, + int max_vms) { vector::reverse_iterator i; @@ -141,6 +144,8 @@ int VirtualMachineXML::get_host(int& hid, HostPoolXML * hpool) int mem; int dsk; + pair::iterator,bool> rc; + get_requirements(cpu,mem,dsk); for (i=hosts.rbegin();i!=hosts.rend();i++) @@ -154,10 +159,16 @@ int VirtualMachineXML::get_host(int& hid, HostPoolXML * hpool) if (host->test_capacity(cpu,mem,dsk)==true) { - host->add_capacity(cpu,mem,dsk); - hid = (*i)->hid; + rc = host_vms.insert(make_pair((*i)->hid,0)); - return 0; + if ( rc.first->second < max_vms ) + { + host->add_capacity(cpu,mem,dsk); + hid = (*i)->hid; + + rc.first->second++; + return 0; + } } } diff --git a/src/scheduler/src/sched/Scheduler.cc b/src/scheduler/src/sched/Scheduler.cc index 383161d76e..c66ad3fdbb 100644 --- a/src/scheduler/src/sched/Scheduler.cc +++ b/src/scheduler/src/sched/Scheduler.cc @@ -393,6 +393,8 @@ void Scheduler::dispatch() map::const_iterator vm_it; const map pending_vms = vmpool->get_objects(); + map host_vms; + oss << "Select hosts" << endl; oss << "\tPRI\tHID" << endl; oss << "\t-------------------" << endl; @@ -414,7 +416,7 @@ void Scheduler::dispatch() { vm = static_cast(vm_it->second); - rc = vm->get_host(hid,hpool); + rc = vm->get_host(hid,hpool,host_vms,host_dispatch_limit); if (rc == 0) { diff --git a/src/scheduler/src/sched/mm_sched.cc b/src/scheduler/src/sched/mm_sched.cc index 619bbeb1c1..6c309e7420 100644 --- a/src/scheduler/src/sched/mm_sched.cc +++ b/src/scheduler/src/sched/mm_sched.cc @@ -34,8 +34,13 @@ public: RankScheduler(string url, time_t timer, unsigned int machines_limit, - unsigned int dispatch_limit - ):Scheduler(url,timer,machines_limit, dispatch_limit),rp(0){}; + unsigned int dispatch_limit, + unsigned int host_dispatch_limit + ):Scheduler(url, + timer, + machines_limit, + dispatch_limit, + host_dispatch_limit),rp(0){}; ~RankScheduler() { @@ -64,11 +69,12 @@ int main(int argc, char **argv) time_t timer= 30; unsigned int machines_limit = 400; unsigned int dispatch_limit = 300; + unsigned int host_dispatch_limit = 3; char opt; ostringstream oss; - while((opt = getopt(argc,argv,"p:t:m:d:")) != -1) + while((opt = getopt(argc,argv,"p:t:m:d:h:")) != -1) { switch(opt) { @@ -84,9 +90,12 @@ int main(int argc, char **argv) case 'd': dispatch_limit = atoi(optarg); break; + case 'h': + host_dispatch_limit = atoi(optarg); + break; default: cerr << "usage: " << argv[0] << " [-p port] [-t timer] "; - cerr << "[-m machines limit] [-d dispatch limit]\n"; + cerr << "[-m machines limit] [-d dispatch limit] [-h host_dispatch_limit]\n"; exit(-1); break; } @@ -96,7 +105,11 @@ int main(int argc, char **argv) oss << "http://localhost:" << port << "/RPC2"; - ss = new RankScheduler(oss.str(),timer, machines_limit, dispatch_limit); + ss = new RankScheduler(oss.str(), + timer, + machines_limit, + dispatch_limit, + host_dispatch_limit); try {