77import org .zstack .core .componentloader .PluginRegistry ;
88import org .zstack .core .db .*;
99import org .zstack .core .db .SimpleQuery .Op ;
10+ import org .zstack .core .defer .Defer ;
11+ import org .zstack .core .defer .Deferred ;
1012import org .zstack .core .thread .AsyncThread ;
1113import org .zstack .core .thread .ChainTask ;
1214import org .zstack .core .thread .SyncTaskChain ;
4951import org .zstack .storage .primary .local .MigrateBitsStruct .ResourceInfo ;
5052import org .zstack .utils .CollectionUtils ;
5153import org .zstack .utils .DebugUtils ;
54+ import org .zstack .utils .ShellUtils ;
5255import org .zstack .utils .Utils ;
5356import org .zstack .utils .function .Function ;
5457import org .zstack .utils .gson .JSONObjectUtil ;
@@ -268,7 +271,8 @@ class MigrateStruct {
268271 private boolean isRootVolume = false ;
269272 private OverlayMessage message ;
270273 private String vmUuid ;
271- private boolean isMigrated = false ;
274+ private boolean volumeStatusChanged = false ;
275+ private boolean vmStateChanged = false ;
272276
273277 public String getVmOriginState () {
274278 return vmOriginState ;
@@ -304,20 +308,28 @@ public void setVmUuid(String vmUuid) {
304308 this .vmUuid = vmUuid ;
305309 }
306310
307- public boolean isMigrated () {
308- return isMigrated ;
311+ public boolean isVolumeStatusChanged () {
312+ return volumeStatusChanged ;
309313 }
310314
311- public void setMigrated (boolean migrated ) {
312- isMigrated = migrated ;
315+ public void setVolumeStatusChanged (boolean volumeStatusChanged ) {
316+ this .volumeStatusChanged = volumeStatusChanged ;
317+ }
318+
319+ public boolean isVmStateChanged () {
320+ return vmStateChanged ;
321+ }
322+
323+ public void setVmStateChanged (boolean vmStateChanged ) {
324+ this .vmStateChanged = vmStateChanged ;
313325 }
314326 }
315327
316328 MigrateStruct struct = new MigrateStruct ();
317329 VolumeStatus originStatus = Q .New (VolumeVO .class ).select (VolumeVO_ .status ).eq (VolumeVO_ .uuid , msg .getVolumeUuid ()).findValue ();
318330 FlowChain chain = new SimpleFlowChain ();
319331 chain .setName (String .format ("local-storage-%s-migrate-volume-%s-to-host-%s" , msg .getPrimaryStorageUuid (), msg .getVolumeUuid (), msg .getDestHostUuid ()));
320- chain .then (new NoRollbackFlow () {
332+ chain .then (new Flow () {
321333 @ Override
322334 public void run (FlowTrigger trigger , Map data ) {
323335 String __name__ = "change-volume-status-to-migrating" ;
@@ -334,11 +346,25 @@ public void run(MessageReply reply) {
334346 return ;
335347 }
336348
349+ struct .setVolumeStatusChanged (true );
337350 trigger .next ();
338351 }
339352 });
340353 }
341- }).then (new NoRollbackFlow () {
354+
355+ @ Override
356+ public void rollback (FlowRollback trigger , Map data ) {
357+ if (struct .isVolumeStatusChanged ()) {
358+ ChangeVolumeStatusMsg rollbackMsg = new ChangeVolumeStatusMsg ();
359+ rollbackMsg .setStatus (originStatus );
360+ rollbackMsg .setVolumeUuid (msg .getVolumeUuid ());
361+ bus .makeTargetServiceIdByResourceUuid (rollbackMsg , VolumeConstant .SERVICE_ID , msg .getVolumeUuid ());
362+ bus .send (rollbackMsg );
363+ }
364+
365+ trigger .rollback ();
366+ }
367+ }).then (new Flow () {
342368 @ Override
343369 public void run (FlowTrigger trigger , Map data ) {
344370 String __name__ = "change-vm-state-to-volume-migrating" ;
@@ -370,10 +396,24 @@ public void run(MessageReply reply) {
370396 return ;
371397 }
372398
399+ struct .setVmStateChanged (true );
373400 trigger .next ();
374401 }
375402 });
376403 }
404+
405+ @ Override
406+ public void rollback (FlowRollback trigger , Map data ) {
407+ if (struct .isVmStateChanged ()) {
408+ ChangeVmStateMsg rollbackMsg = new ChangeVmStateMsg ();
409+ rollbackMsg .setStateEvent (struct .getVmOriginState ());
410+ rollbackMsg .setVmInstanceUuid (struct .getVmUuid ());
411+ bus .makeTargetServiceIdByResourceUuid (rollbackMsg , VmInstanceConstant .SERVICE_ID , struct .getVmUuid ());
412+ bus .send (rollbackMsg );
413+ }
414+
415+ trigger .rollback ();
416+ }
377417 }).then (new NoRollbackFlow () {
378418 @ Override
379419 public void run (FlowTrigger trigger , Map data ) {
@@ -412,7 +452,6 @@ public void run(MessageReply reply) {
412452
413453 MigrateVolumeOnLocalStorageReply mr = reply .castReply ();
414454 evt .setInventory (mr .getInventory ());
415- struct .setMigrated (true );
416455 trigger .next ();
417456 }
418457 });
0 commit comments