Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
make tracing less tightly coupled to MSG
[simgrid.git] / src / plugins / vm / VmLiveMigration.cpp
index f0ec4ec..e3a21aa 100644 (file)
@@ -6,8 +6,10 @@
 #include <simgrid/plugins/live_migration.h>
 #include <simgrid/s4u.hpp>
 #include <simgrid/s4u/VirtualMachine.hpp>
+#include <simgrid/vm.h>
 #include <src/instr/instr_private.hpp>
 #include <src/plugins/vm/VirtualMachineImpl.hpp>
+#include <src/plugins/vm/VmHostExt.hpp>
 #include <src/plugins/vm/VmLiveMigration.hpp>
 #include <xbt/ex.hpp>
 
@@ -15,6 +17,13 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(vm_live_migration, "S4U virtual machines live migra
 
 namespace simgrid {
 namespace vm {
+simgrid::xbt::Extension<s4u::Host, VmMigrationExt> VmMigrationExt::EXTENSION_ID;
+
+void VmMigrationExt::ensureVmMigrationExtInstalled()
+{
+  if (not EXTENSION_ID.valid())
+    EXTENSION_ID = simgrid::s4u::Host::extension_create<VmMigrationExt>();
+}
 
 void MigrationRx::operator()()
 {
@@ -45,10 +54,10 @@ void MigrationRx::operator()()
   vm_->resume();
 
   // Now the VM is running on the new host (the migration is completed) (even if the SRC crash)
-  vm_->pimpl_vm_->isMigrating = false;
+  vm_->getImpl()->isMigrating = false;
   XBT_DEBUG("VM(%s) moved from PM(%s) to PM(%s)", vm_->getCname(), src_pm_->getCname(), dst_pm_->getCname());
 
-  if (TRACE_msg_vm_is_enabled()) {
+  if (TRACE_vm_is_enabled()) {
     static long long int counter = 0;
     std::string key              = std::to_string(counter);
     counter++;
@@ -58,9 +67,7 @@ void MigrationRx::operator()()
     simgrid::instr::Container::getRoot()->getLink("MSG_VM_LINK")->startEvent(msg, "M", key);
 
     // destroy existing container of this vm
-    container_t existing_container = simgrid::instr::Container::byName(vm_->getName());
-    existing_container->removeFromParent();
-    delete existing_container;
+    simgrid::instr::Container::byName(vm_->getName())->removeFromParent();
 
     // create new container on the new_host location
     new simgrid::instr::Container(vm_->getCname(), "MSG_VM", simgrid::instr::Container::byName(dst_pm_->getName()));
@@ -110,6 +117,7 @@ sg_size_t MigrationTx::sendMigrationData(sg_size_t size, int stage, int stage2_r
       XBT_VERB("timeout (%lf s) in sending_migration_data, remaining %llu bytes of %llu", timeout, remaining, size);
       sent -= remaining;
     }
+    delete msg;
   }
 
   double clock_end    = s4u::Engine::getClock();
@@ -280,6 +288,53 @@ void MigrationTx::operator()()
 }
 
 SG_BEGIN_DECL()
+
+static void onVirtualMachineShutdown(simgrid::s4u::VirtualMachine* vm)
+{
+  if (vm->getImpl()->isMigrating) {
+    vm->extension<simgrid::vm::VmMigrationExt>()->rx_->kill();
+    vm->extension<simgrid::vm::VmMigrationExt>()->tx_->kill();
+    vm->extension<simgrid::vm::VmMigrationExt>()->issuer_->kill();
+    vm->getImpl()->isMigrating = false;
+  }
+}
+
+void sg_vm_live_migration_plugin_init()
+{
+  sg_vm_dirty_page_tracking_init();
+  simgrid::vm::VmMigrationExt::ensureVmMigrationExtInstalled();
+  simgrid::s4u::VirtualMachine::onVmShutdown.connect(&onVirtualMachineShutdown);
+}
+
+/* Deprecated. Please use MSG_vm_create_migratable() instead */
+msg_vm_t MSG_vm_create(msg_host_t ind_pm, const char* name, int coreAmount, int ramsize, int mig_netspeed,
+                       int dp_intensity)
+{
+  return sg_vm_create_migratable(ind_pm, name, coreAmount, ramsize, mig_netspeed, dp_intensity);
+}
+
+simgrid::s4u::VirtualMachine* sg_vm_create_migratable(simgrid::s4u::Host* pm, const char* name, int coreAmount,
+                                                      int ramsize, int mig_netspeed, int dp_intensity)
+{
+  simgrid::vm::VmHostExt::ensureVmExtInstalled();
+
+  /* For the moment, intensity_rate is the percentage against the migration bandwidth */
+
+  sg_vm_t vm = new simgrid::s4u::VirtualMachine(name, pm, coreAmount, static_cast<sg_size_t>(ramsize) * 1024 * 1024);
+  sg_vm_set_dirty_page_intensity(vm, dp_intensity / 100.0);
+  sg_vm_set_working_set_memory(vm, vm->getRamsize() * 0.9); // assume working set memory is 90% of ramsize
+  sg_vm_set_migration_speed(vm, mig_netspeed * 1024 * 1024.0);
+
+  XBT_DEBUG("migspeed : %f intensity mem : %d", mig_netspeed * 1024 * 1024.0, dp_intensity);
+
+  return vm;
+}
+
+int sg_vm_is_migrating(simgrid::s4u::VirtualMachine* vm)
+{
+  return vm->getImpl()->isMigrating;
+}
+
 void sg_vm_migrate(simgrid::s4u::VirtualMachine* vm, simgrid::s4u::Host* dst_pm)
 {
   simgrid::s4u::Host* src_pm = vm->getPm();
@@ -290,10 +345,10 @@ void sg_vm_migrate(simgrid::s4u::VirtualMachine* vm, simgrid::s4u::Host* dst_pm)
     THROWF(vm_error, 0, "Cannot migrate VM '%s' to host '%s', which is offline.", vm->getCname(), dst_pm->getCname());
   if (vm->getState() != SURF_VM_STATE_RUNNING)
     THROWF(vm_error, 0, "Cannot migrate VM '%s' that is not running yet.", vm->getCname());
-  if (vm->isMigrating())
+  if (vm->getImpl()->isMigrating)
     THROWF(vm_error, 0, "Cannot migrate VM '%s' that is already migrating.", vm->getCname());
 
-  vm->pimpl_vm_->isMigrating = true;
+  vm->getImpl()->isMigrating = true;
 
   std::string rx_name =
       std::string("__pr_mig_rx:") + vm->getCname() + "(" + src_pm->getCname() + "-" + dst_pm->getCname() + ")";
@@ -305,15 +360,17 @@ void sg_vm_migrate(simgrid::s4u::VirtualMachine* vm, simgrid::s4u::Host* dst_pm)
   simgrid::s4u::ActorPtr tx =
       simgrid::s4u::Actor::createActor(tx_name.c_str(), src_pm, simgrid::vm::MigrationTx(vm, dst_pm));
 
+  vm->extension_set<simgrid::vm::VmMigrationExt>(new simgrid::vm::VmMigrationExt(simgrid::s4u::Actor::self(), rx, tx));
+
   /* wait until the migration have finished or on error has occurred */
   XBT_DEBUG("wait for reception of the final ACK (i.e. migration has been correctly performed");
   simgrid::s4u::MailboxPtr mbox_ctl = simgrid::s4u::Mailbox::byName(
       std::string("__mbox_mig_ctl:") + vm->getCname() + "(" + src_pm->getCname() + "-" + dst_pm->getCname() + ")");
   delete static_cast<std::string*>(mbox_ctl->get());
-
   tx->join();
   rx->join();
 
-  vm->pimpl_vm_->isMigrating = false;
-}
+  vm->getImpl()->isMigrating = false;
 }
+
+SG_END_DECL()