X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8f606525aaba6b44e0e2d9059c6d60dbf479598f..22e6546d2c6f14864cc93c4ed1470d8e8c1e2d95:/src/plugins/vm/VirtualMachineImpl.cpp diff --git a/src/plugins/vm/VirtualMachineImpl.cpp b/src/plugins/vm/VirtualMachineImpl.cpp index a3b4a0a596..f815594473 100644 --- a/src/plugins/vm/VirtualMachineImpl.cpp +++ b/src/plugins/vm/VirtualMachineImpl.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015. The SimGrid Team. +/* Copyright (c) 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -6,7 +6,7 @@ #include "src/plugins/vm/VirtualMachineImpl.hpp" #include "src/simix/ActorImpl.hpp" -#include "src/simix/smx_host_private.h" +#include "src/simix/smx_host_private.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm, surf, "Logging specific to the SURF VM module"); @@ -41,8 +41,24 @@ std::deque VirtualMachineImpl::allVms_; * The total CPU share these processes get is smaller than that of the VM process gets on a host operating system. * FIXME: add a configuration flag for this */ -// const double virt_overhead = 0.95; -const double virt_overhead = 1; +const double virt_overhead = 1; // 0.95 + +static void hostStateChange(s4u::Host& host) +{ + if (host.isOff()) { // just turned off. + std::vector trash; + /* Find all VMs living on that host */ + for (s4u::VirtualMachine* const& vm : VirtualMachineImpl::allVms_) + if (vm->getPm() == &host) + trash.push_back(vm); + for (s4u::VirtualMachine* vm : trash) + vm->pimpl_vm_->shutdown(SIMIX_process_self()); + } +} +VMModel::VMModel() +{ + s4u::Host::onStateChange.connect(hostStateChange); +} double VMModel::nextOccuringEvent(double now) { @@ -71,7 +87,7 @@ double VMModel::nextOccuringEvent(double now) **/ /* iterate for all virtual machines */ - for (s4u::VirtualMachine* ws_vm : VirtualMachineImpl::allVms_) { + for (s4u::VirtualMachine* const& ws_vm : VirtualMachineImpl::allVms_) { surf::Cpu* cpu = ws_vm->pimpl_cpu; xbt_assert(cpu, "cpu-less host"); @@ -79,8 +95,6 @@ double VMModel::nextOccuringEvent(double now) ->value; // this is X1 in comment above, what this VM got in the sharing on the PM XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value, ws_vm->getCname(), ws_vm->pimpl_vm_->getPm()->getCname()); - // TODO: check lmm_update_constraint_bound() works fine instead of the below manual substitution. - // cpu_cas01->constraint->bound = solved_value; xbt_assert(cpu->model() == surf_cpu_model_vm); lmm_system_t vcpu_system = cpu->model()->getMaxminSystem(); lmm_update_constraint_bound(vcpu_system, cpu->constraint(), virt_overhead * solved_value); @@ -160,7 +174,7 @@ void VirtualMachineImpl::suspend(smx_actor_t issuer) if (getState() != SURF_VM_STATE_RUNNING) THROWF(vm_error, 0, "Cannot suspend VM %s: it is not running.", piface_->getCname()); if (issuer->host == piface_) - THROWF(vm_error, 0, "Actor %s cannot suspend the VM %s in which it runs", issuer->cname(), piface_->getCname()); + THROWF(vm_error, 0, "Actor %s cannot suspend the VM %s in which it runs", issuer->getCname(), piface_->getCname()); xbt_swag_t process_list = piface_->extension()->process_list; XBT_DEBUG("suspend VM(%s), where %d processes exist", piface_->getCname(), xbt_swag_size(process_list)); @@ -192,7 +206,7 @@ void VirtualMachineImpl::resume() smx_actor_t smx_process; smx_actor_t smx_process_safe; xbt_swag_foreach_safe(smx_process, smx_process_safe, process_list) { - XBT_DEBUG("resume %s", smx_process->cname()); + XBT_DEBUG("resume %s", smx_process->getCname()); smx_process->resume(); } @@ -224,7 +238,7 @@ void VirtualMachineImpl::shutdown(smx_actor_t issuer) THROW_IMPOSSIBLE; break; } - XBT_VERB("Shuting down the VM %s even if it's not running but %s", piface_->getCname(), stateName); + XBT_VERB("Shutting down the VM %s even if it's not running but %s", piface_->getCname(), stateName); } xbt_swag_t process_list = piface_->extension()->process_list; @@ -233,7 +247,8 @@ void VirtualMachineImpl::shutdown(smx_actor_t issuer) smx_actor_t smx_process; smx_actor_t smx_process_safe; xbt_swag_foreach_safe(smx_process, smx_process_safe, process_list) { - XBT_DEBUG("kill %s", smx_process->cname()); + XBT_DEBUG("kill %s@%s on behalf of %s which shutdown that VM.", smx_process->getCname(), + smx_process->host->getCname(), issuer->getCname()); SIMIX_process_kill(smx_process, issuer); }