Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix the cloud API, nicely this time.
authorSamuel Lepetit <samuel.lepetit@inria.fr>
Thu, 14 Jun 2012 14:33:33 +0000 (16:33 +0200)
committerSamuel Lepetit <samuel.lepetit@inria.fr>
Thu, 14 Jun 2012 14:33:47 +0000 (16:33 +0200)
examples/msg/cloud/masterslave_virtual_machines.c
src/msg/msg_private.h
src/msg/msg_process.c
src/msg/msg_vm.c

index 0ed5b90..7db2605 100644 (file)
@@ -87,7 +87,7 @@ int master(int argc, char *argv[]) {
   XBT_INFO("Sleep long enough for everyone to be done with previous batch of work");
   MSG_process_sleep(1000-MSG_get_clock());
 
-  XBT_INFO("Add one more process per VM, and dispatch a batch of work to everyone");
+  XBT_INFO("Add one more process per VM");
   for (i=0;i<xbt_dynar_length(vms);i++) {
     msg_vm_t vm = xbt_dynar_get_as(vms,i,msg_vm_t);
     char slavename[64];
@@ -98,7 +98,6 @@ int master(int argc, char *argv[]) {
     argv[2] = NULL;
     MSG_vm_bind(vm, MSG_process_create_with_arguments(slavename,slave_fun,NULL,slaves[i],2,argv));
   }
-  work_batch(slaves_count*2);
 
   XBT_INFO("Migrate everyone to the second host.");
   for (i=0;i<xbt_dynar_length(vms);i++)
@@ -112,7 +111,7 @@ int master(int argc, char *argv[]) {
     MSG_vm_resume(vm);
   }
 
-
+  work_batch(slaves_count*2);
 
   XBT_INFO("Let's shut down the simulation. 10 first processes will be shut down cleanly while the second half will forcefully get killed");
   for (i = 0; i < slaves_count; i++) {
index 23699dd..30448ca 100644 (file)
@@ -70,6 +70,9 @@ typedef struct simdata_process {
   char **argv;                  /* arguments table if any */
   int argc;                     /* arguments number if any */
   MSG_error_t last_errno;       /* the last value returned by a MSG_function */
+
+  msg_vm_t vm;                                                                 /* virtual machine the process is in */
+
   void* data;                   /* user data */
 } s_simdata_process_t, *simdata_process_t;
 
index 50c8fa1..2c03e8d 100644 (file)
@@ -51,6 +51,12 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc)
     msg_global->process_data_cleanup(msg_proc->data);
   }
 
+  // remove the process from its virtual machine
+  if (msg_proc->vm) {
+       int pos = xbt_dynar_search(msg_proc->vm->processes,&smx_proc);
+       xbt_dynar_remove_at(msg_proc->vm->processes,pos, NULL);
+  }
+
   // free the MSG process
   xbt_free(msg_proc);
 }
index b31536f..7469ef0 100644 (file)
@@ -65,6 +65,19 @@ int MSG_vm_is_running(msg_vm_t vm) {
  * @bug for now, if a binded process terminates, every VM functions will segfault. Baaaad.
  */
 void MSG_vm_bind(msg_vm_t vm, m_process_t process) {
+       /* check if the process is already in a VM */
+       simdata_process_t simdata = simcall_process_get_data(process);
+       if (simdata->vm) {
+               msg_vm_t old_vm = simdata->vm;
+               int pos = xbt_dynar_search(old_vm->processes,&process);
+               xbt_dynar_remove_at(old_vm->processes,pos, NULL);
+       }
+       /* check if the host is in the right host */
+       if (simdata->m_host != vm->location) {
+               MSG_process_migrate(process,vm->location);
+       }
+       simdata->vm = vm;
+
   xbt_dynar_push_as(vm->processes,m_process_t,process);
 }
 /** @brief Removes the given process from the given VM, and kill it
@@ -107,7 +120,7 @@ void MSG_vm_suspend(msg_vm_t vm) {
   unsigned int cpt;
   m_process_t process;
   xbt_dynar_foreach(vm->processes,cpt,process) {
-    XBT_INFO("suspend process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process)));
+    XBT_DEBUG("suspend process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process)));
     MSG_process_suspend(process);
   }
 }
@@ -123,7 +136,7 @@ void MSG_vm_resume(msg_vm_t vm) {
   unsigned int cpt;
   m_process_t process;
   xbt_dynar_foreach(vm->processes,cpt,process) {
-    XBT_INFO("resume process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process)));
+       XBT_DEBUG("resume process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process)));
     MSG_process_resume(process);
   }
 }
@@ -138,6 +151,6 @@ void MSG_vm_shutdown(msg_vm_t vm) {
   unsigned int cpt;
   m_process_t process;
   xbt_dynar_foreach(vm->processes,cpt,process) {
-    MSG_process_kill(process);
+       MSG_process_kill(process);
   }
 }