@@ -342,7 +342,8 @@ protected void wakeupWorkers() {
342342 @ Override
343343 public boolean scheduleMigration (final VMInstanceVO vm ) {
344344 if (vm .getHostId () != null ) {
345- final HaWorkVO work = new HaWorkVO (vm .getId (), vm .getType (), WorkType .Migration , Step .Scheduled , vm .getHostId (), vm .getState (), 0 , vm .getUpdated ());
345+ Long hostId = VirtualMachine .State .Migrating .equals (vm .getState ()) ? vm .getLastHostId () : vm .getHostId ();
346+ final HaWorkVO work = new HaWorkVO (vm .getId (), vm .getType (), WorkType .Migration , Step .Scheduled , hostId , vm .getState (), 0 , vm .getUpdated ());
346347 _haDao .persist (work );
347348 s_logger .info ("Scheduled migration work of VM " + vm .getUuid () + " from host " + _hostDao .findById (vm .getHostId ()) + " with HAWork " + work );
348349 wakeupWorkers ();
@@ -716,6 +717,14 @@ public Long migrate(final HaWorkVO work) {
716717 s_logger .info ("Unable to find vm: " + vmId + ", skipping migrate." );
717718 return null ;
718719 }
720+ if (VirtualMachine .State .Stopped .equals (vm .getState ())) {
721+ s_logger .info (String .format ("vm %s is Stopped, skipping migrate." , vm ));
722+ return null ;
723+ }
724+ if (VirtualMachine .State .Running .equals (vm .getState ()) && srcHostId != vm .getHostId ()) {
725+ s_logger .info (String .format ("VM %s is running on a different host %s, skipping migration" , vm , vm .getHostId ()));
726+ return null ;
727+ }
719728 s_logger .info ("Migration attempt: for VM " + vm .getUuid () + "from host id " + srcHostId +
720729 ". Starting attempt: " + (1 + work .getTimesTried ()) + "/" + _maxRetries + " times." );
721730 try {
@@ -1022,6 +1031,13 @@ public WorkerThread(String name) {
10221031
10231032 @ Override
10241033 public void run () {
1034+ try {
1035+ synchronized (this ) {
1036+ wait (_timeToSleep );
1037+ }
1038+ } catch (final InterruptedException e ) {
1039+ s_logger .info ("Interrupted" );
1040+ }
10251041 s_logger .info ("Starting work" );
10261042 while (!_stopped ) {
10271043 _managedContext .runWithContext (new Runnable () {
0 commit comments