19 currentLoad_ (0.0), currentLoadMem_(0.0), currentLoadStor_(0.0), currentLoadNet_(0.0),
20 eDVFS_enabled_(0.0), tskFailed_(0),tskComAgent(NULL), host(NULL), started_(false)
35 std::vector <std::vector<DcResource*> >::iterator iter;
37 std::vector<DcResource*>::iterator iter2;
38 for(iter2 = iter->begin(); iter2!=iter->end() ;iter2++){
48 std::vector <ResDemand*>::iterator u_res;
59 bool possible =
false;
61 std::vector <Capacity>::iterator req_cap_cons = (*u_res)->capacity.begin();
62 std::vector <Capacity *>::iterator loc_cap_cons = (*u_res)->capacity_location.begin();
63 std::vector <CoreScheduler*>::iterator u_core;
64 if((*u_res)->getType()==
Computing && (*u_res)->supported_virtual_resource){
65 u_core = ((
CPU*)((*u_res)->supported_virtual_resource))->cores_schedulers_.begin();
68 std::vector <DcResource*>::iterator p_res;
69 std::vector <CoreScheduler*>::iterator p_core;
74 if((*u_res)->getArch() <= (*p_res)->getArch()){
76 if((*u_res)->capacity.empty()==
true){
80 std::vector <Capacity>::iterator aval_cap_prov = (*p_res)->capacity.begin();
81 if((*u_res)->getType()==
Computing && (*u_res)->supported_virtual_resource){
82 p_core = ((
CPU*)(*p_res))->cores_schedulers_.begin();
86 for(; aval_cap_prov!= (*p_res)->capacity.end() ; ){
87 if((*aval_cap_prov)>=(*req_cap_cons)){
88 (*aval_cap_prov)-=(*req_cap_cons);
92 (*aval_cap_prov).virtual_capacities.push_back(req_cap_cons->virtual_capacities.at(0));
94 (*loc_cap_cons)=&(*aval_cap_prov);
95 if((*u_res)->getType()==
Computing && (*u_res)->supported_virtual_resource){
96 (*p_core)->addVcoreScheduler((*u_core));
100 if(req_cap_cons== (*u_res)->capacity.end()){
104 if((*u_res)->getType()==
Computing && (*u_res)->supported_virtual_resource){
110 if((*u_res)->getType()==
Computing && (*u_res)->supported_virtual_resource){
121 if(possible ==
true){
138 if((*rc).res_demands.empty()){
139 std::cerr <<
"Nothing to release \n";
143 std::vector <ResDemand*>::iterator u_res;
148 std::vector <Capacity>::iterator consumption;
149 std::vector <Capacity *>::iterator location;
150 for(consumption=(*u_res)->capacity.begin(),
151 location=(*u_res)->capacity_location.begin();
152 consumption!=(*u_res)->capacity.end();
153 consumption++,location++){
154 if((*location)==NULL){
156 **location = (**location)+(*consumption);
162 if((*u_res)->supported_virtual_resource != NULL){
163 if( (*u_res)->supported_virtual_resource->getType()==
Computing){
164 CPU* cpu = (
CPU*)(*u_res)->supported_virtual_resource;
165 std::vector<CoreScheduler* >::iterator cs;
204 ((newVm))->setHost(
this);
232 vector<CloudTask*>::iterator iter;
244 std::vector <CoreScheduler*>::iterator core_s;
245 std::vector <DcResource*>::iterator cpu_iter;
250 CPU* cpu = (
CPU*) (*cpu_iter);
252 (*core_s)->startTaskExecution(tskobj);
258 std::cout <<
"Task failed due to insufficient resources";
263 std::cerr <<
"It is not a task!";
278 event_.time_ = Scheduler::instance().clock();
286 std::vector <CoreScheduler*>::iterator core_s;
287 std::vector <DcResource*>::iterator cpu_iter;
289 CPU* cpu = (
CPU*) (*cpu_iter);
291 (*core_s)->updateTskList();
301 std::vector <ResourceConsumer*>::iterator vm_iter;
303 VM* vm =
static_cast<VM*
>(*vm_iter);
310 std::vector <DcResource*>::iterator dc_res;
312 std::vector <Capacity>::iterator free_cap_iter;
313 for(free_cap_iter = (*dc_res)->capacity.begin();
314 free_cap_iter != (*dc_res)->capacity.end();
316 free_cap += *free_cap_iter;
329 std::vector<VmMigrationSink*>::iterator vms;
331 double recent_bytes = (*vms)->resetBytesSince();
332 down_link_util += recent_bytes; }
333 result += (down_link_util/elapsed_time);
340 std::vector<ProviderOutAgent*>::iterator poa;
342 double recent_bytes = (*poa)->updateAgentDataBytes();
343 up_link_util += recent_bytes;
354 std::vector <ResourceConsumer*>::iterator vm_iter;
356 VM* vm =
static_cast<VM*
>(*vm_iter);
364 double total_cap = 0;
365 std::vector <DcResource*>::iterator dc_res;
367 std::vector <Capacity>::iterator total_cap_iter;
368 for(total_cap_iter = (*dc_res)->specification->capacity.begin();
369 total_cap_iter != (*dc_res)->specification->capacity.end();
371 total_cap += *total_cap_iter;
394 double result = used_net_bytes/total_cap;
403 double result = 1 - (free_cap/total_cap);
416 double nominal_mips = 0;
417 double current_mips = 0;
418 std::vector <DcResource*>::iterator cpu_iter;
450 std::vector<TaskAlloc*> tmp_task_allocs;
451 tmp_task_allocs.clear();
453 std::vector<TaskAlloc*>::iterator iter;
456 bool core_found =
false;
457 tmp_task_allocs.push_back(task_alloc);
459 double tskrate = (double)task_alloc->
getMIPS()/(task_alloc->
getDeadline() - Scheduler::instance().clock());
461 std::vector <CoreScheduler*>::iterator core_s;
462 std::vector <DcResource*>::iterator cpu_iter;
464 CPU* cpu = (
CPU*) (*cpu_iter);
467 double maxrate = (*core_s)->getMostUrgentTaskRate();
468 if (tskrate > maxrate){maxrate = tskrate;}
469 if (maxrate*((*core_s)->getAllTasksNumber() + 1) <= (*core_s)->getAvailableMIPS()){
471 (*core_s)->assignTask(task_alloc);
476 if(core_found){
break;}
478 if(core_found==
false){
502 CPU* cpu_res =
static_cast<CPU*
>(res);
507 NIC* nic_res =
static_cast<NIC*
>(res);
508 nic_res->
setRp(
this);
518 (void)Scheduler::instance().schedule(
this, &
event_, delay);
521 (void)Scheduler::instance().cancel(&
event_);
527 std::cout <<
"printTasklist Status: (FUNCTION UNDER CONSTRUCTION)\n";
560 if (nextDeadline != DBL_MAX)
nextEvent(nextDeadline);
587 Tcl& tcl = Tcl::instance();
592 }
else if (argc == 3) {
593 if (strcmp(argv[1],
"attach-agent") == 0) {
596 tcl.resultf(
"no such agent %s", argv[2]);
601 else if (strcmp(argv[1],
"set-taskcomagent") == 0) {
609 else if (strcmp(argv[1],
"attach-vm-mig-sink") == 0) {
613 tcl.resultf(
"no such agent %s", argv[2]);
617 }
else if (strcmp(argv[1],
"attach-vm-mig-source") == 0) {
621 tcl.resultf(
"no such agent %s", argv[2]);
625 }
else if (strcmp(argv[1],
"detach-vm-mig-sink") == 0) {
629 tcl.resultf(
"no such agent %s", argv[2]);
633 }
else if (strcmp(argv[1],
"detach-vm-mig-source") == 0) {
637 tcl.resultf(
"no such agent %s", argv[2]);
641 }
else if (strcmp(argv[1],
"add-resource") == 0) {
644 tcl.resultf(
"no such resource %s", argv[2]);
649 }
else if (strcmp(argv[1],
"add-vm") == 0) {
650 VM* vm = (
VM*) TclObject::lookup(argv[2]);
652 tcl.resultf(
"no such vm %s", argv[2]);
659 std::cerr <<
"ERROR: A VM was allocated on a machine that has not enough resources. (Creation was called from Tcl)";
double getFreeCapRecursive(res_type type)
std::vector< std::vector< DcResource * > > resource_list
void setTskComAgent(TskComAgent *agnt)
CoreScheduler * getHostScheduler()
void scheduleNextExent(double nextDeadline)
void setTskComSink(TskComSink *tcs)
void detachSource(ProviderOutAgent *tcp_agent)
void setDVFS(int eDVFS_enabled_)
virtual ~ResourceProvider()
std::vector< CoreScheduler * > cores_schedulers_
void sendTaskOutput(CloudTask *task)
double updateResTypeUtil(res_type type)
std::vector< ProviderOutAgent * > vm_migration_sources_
int trySchedulingTsk(CloudTask *tskobj)
virtual void addResource(DcResource *res)
int updateAgentDataBytes()
static double useful_bytes
double getLastBytesSinceTime()
void attachSource(ProviderOutAgent *tcp_agent)
static double uplink_overhead
ProviderOutAgent * poagent_
double getResTypeUtil(res_type type)
TskComAgent * tskComAgent
double getTotalCap(res_type type)
virtual void printTasklist()
double getUsedNet(bool in, bool out)
std::vector< ResDemand * > res_demands
double getUsedNetRecursive(bool in, bool out)
void setProvider(ResourceProvider *provider)
TskComAgent * getTskComAgent()
std::vector< TaskAlloc * > task_allocations_
void attachSink(VmMigrationSink *vm_mig_sink)
int tryToAllocate(ResourceConsumer *rc)
void recv(ResourceConsumer *rcobj)
std::vector< VmMigrationSink * > vm_migration_sinks_
void fail(ResourceProvider *provider)
virtual void handle(Event *event)
double getFreeCap(res_type type)
void releaseAllTaskAllocs()
void setServerFinishTime(double time)
void removeVcoreScheduler(CoreScheduler *cs)
double resource_utilization[LastResType+1]
void nextEvent(double delay)
bool releaseAllocation(ResourceConsumer *rc)
void setAgent(ProviderOutAgent *agent)
std::vector< ResourceConsumer * > hosted_vms_
void detachSink(VmMigrationSink *vm_mig_sink)
ResourceProvider * getHost()
virtual void updateEnergyAndConsumption()=0
int testSchedulingPossibility(CloudTask *tskobj)
virtual int command(int argc, const char *const *argv)
void setResourceProvider(ResourceProvider *rp)
void _sched(double delay)
void sendmsg(int nbytes, void *pointer)
void setRp(ResourceProvider *rp)