/* FIXME: Where should the VM state be defined? */
typedef enum {
SURF_VM_STATE_CREATED, /**< created, but not yet started */
-
SURF_VM_STATE_RUNNING,
- SURF_VM_STATE_MIGRATING,
-
SURF_VM_STATE_SUSPENDED, /**< Suspend/resume does not involve disk I/O, so we assume there is no transition states. */
SURF_VM_STATE_SAVING, /**< Save/restore involves disk I/O, so there should be transition states. */
SURF_VM_STATE_SAVED,
SURF_VM_STATE_RESTORING,
-
} e_surf_vm_state_t;
/***************************/
*/
int MSG_vm_is_migrating(msg_vm_t vm)
{
- return __MSG_vm_is_state(vm, SURF_VM_STATE_MIGRATING);
+ msg_host_priv_t priv = msg_host_resource_priv(vm);
+ return priv->is_migrating;
}
/** @brief Returns whether the given VM is currently suspended, not running.
*/
void MSG_vm_destroy(msg_vm_t vm)
{
+ if (MSG_vm_is_migrating(vm))
+ THROWF(vm_error, 0, "VM(%s) is migrating", sg_host_name(vm));
+
/* First, terminate all processes on the VM if necessary */
if (MSG_vm_is_running(vm))
simcall_vm_shutdown(vm);
msg_host_t old_pm = simcall_vm_get_pm(vm);
- if (simcall_vm_get_state(vm) != SURF_VM_STATE_RUNNING)
+ if (!MSG_vm_is_running(vm))
THROWF(vm_error, 0, "VM(%s) is not running", sg_host_name(vm));
- do_migration(vm, old_pm, new_pm);
+ if (MSG_vm_is_migrating(vm))
+ THROWF(vm_error, 0, "VM(%s) is already migrating", sg_host_name(vm));
+
+ msg_host_priv_t priv = msg_host_resource_priv(vm);
+ priv->is_migrating = 1;
+ do_migration(vm, old_pm, new_pm);
+ priv->is_migrating = 0;
XBT_DEBUG("VM(%s) moved from PM(%s) to PM(%s)", vm->key, old_pm->key, new_pm->key);
*/
void MSG_vm_suspend(msg_vm_t vm)
{
+ if (MSG_vm_is_migrating(vm))
+ THROWF(vm_error, 0, "VM(%s) is migrating", sg_host_name(vm));
+
simcall_vm_suspend(vm);
XBT_DEBUG("vm_suspend done");
*/
void MSG_vm_save(msg_vm_t vm)
{
+ if (MSG_vm_is_migrating(vm))
+ THROWF(vm_error, 0, "VM(%s) is migrating", sg_host_name(vm));
+
simcall_vm_save(vm);
#ifdef HAVE_TRACING
TRACE_msg_vm_save(vm);