Skip to content

Commit da5651a

Browse files
abh1sarshwstppr
authored andcommitted
Set state Restoring on the volume on which upload image transfer is running.
State Transition Initial: Ready Create Image Transfer -> Restoring Finalize Image transfer -> Ready
1 parent 5595971 commit da5651a

2 files changed

Lines changed: 35 additions & 5 deletions

File tree

server/src/main/java/org/apache/cloudstack/backup/KVMBackupExportServiceImpl.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
import javax.inject.Inject;
3535

36+
import com.cloud.utils.fsm.NoTransitionException;
37+
import com.cloud.utils.fsm.StateMachine2;
3638
import org.apache.cloudstack.api.command.admin.backup.CreateImageTransferCmd;
3739
import org.apache.cloudstack.api.command.admin.backup.DeleteVmCheckpointCmd;
3840
import org.apache.cloudstack.api.command.admin.backup.FinalizeBackupCmd;
@@ -639,6 +641,14 @@ private ImageTransferVO createUploadImageTransfer(VolumeVO volume, ImageTransfer
639641
imageTransfer.setTransferUrl(transferAnswer.getTransferUrl());
640642
imageTransfer.setSignedTicketId(transferAnswer.getImageTransferId());
641643
imageTransfer = imageTransferDao.persist(imageTransfer);
644+
645+
try {
646+
final StateMachine2<Volume.State, Volume.Event, Volume> stateMachine = Volume.State.getStateMachine();
647+
stateMachine.transitTo(volume, Volume.Event.RestoreRequested, null, volumeDao);
648+
} catch (NoTransitionException e) {
649+
throw new CloudRuntimeException("Failed to transition volume " + volume.getUuid(), e);
650+
}
651+
642652
return imageTransfer;
643653

644654
}
@@ -742,24 +752,41 @@ private boolean stopNBDServer(ImageTransferVO imageTransfer) {
742752
return answer.getResult();
743753
}
744754

745-
private void finalizeUploadImageTransfer(ImageTransferVO imageTransfer) {
755+
private String finalizeUploadImageTransferWithResult(ImageTransferVO imageTransfer) {
746756
String transferId = imageTransfer.getUuid();
747-
748757
boolean stopNbdServerResult = stopNBDServer(imageTransfer);
749758
if (!stopNbdServerResult) {
750-
throw new CloudRuntimeException("Failed to stop the nbd server");
759+
return "Failed to stop the nbd server";
751760
}
752761

753762
FinalizeImageTransferCommand finalizeCmd = new FinalizeImageTransferCommand(transferId);
754763
Answer answer;
755764
try {
756765
answer = agentManager.send(imageTransfer.getHostId(), finalizeCmd);
757766
} catch (AgentUnavailableException | OperationTimedoutException e) {
758-
throw new CloudRuntimeException("Failed to communicate with agent", e);
767+
return "Failed to communicate with agent";
759768
}
760769

761770
if (!answer.getResult()) {
762-
throw new CloudRuntimeException("Failed to finalize image transfer: " + answer.getDetails());
771+
return "Failed to finalize image transfer: " + answer.getDetails();
772+
}
773+
return null;
774+
}
775+
776+
private void finalizeUploadImageTransfer(ImageTransferVO imageTransfer) {
777+
String failureReason = finalizeUploadImageTransferWithResult(imageTransfer);
778+
Volume.Event event = failureReason == null ? Volume.Event.RestoreSucceeded : Volume.Event.RestoreFailed;
779+
780+
VolumeVO volume = volumeDao.findById(imageTransfer.getVolumeId());
781+
try {
782+
final StateMachine2<Volume.State, Volume.Event, Volume> stateMachine = Volume.State.getStateMachine();
783+
stateMachine.transitTo(volume, event, null, volumeDao);
784+
} catch (NoTransitionException e) {
785+
throw new CloudRuntimeException("Failed to transition state during upload finalize image transfer for volume " + volume.getUuid(), e);
786+
}
787+
788+
if (failureReason != null) {
789+
throw new CloudRuntimeException(failureReason);
763790
}
764791
}
765792

server/src/test/java/org/apache/cloudstack/backup/KVMBackupExportServiceImplTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.junit.Assert.assertThrows;
2222
import static org.mockito.ArgumentMatchers.any;
2323
import static org.mockito.ArgumentMatchers.eq;
24+
import static org.mockito.ArgumentMatchers.isNull;
2425
import static org.mockito.Mockito.mock;
2526
import static org.mockito.Mockito.mockStatic;
2627
import static org.mockito.Mockito.never;
@@ -363,6 +364,7 @@ public void createImageTransfer_uploadFileBackend_success() throws Exception {
363364

364365
when(volumeDao.findById(601L)).thenReturn(volume);
365366
when(volume.getId()).thenReturn(601L);
367+
when(volume.getState()).thenReturn(Volume.State.Ready);
366368
when(volume.getDataCenterId()).thenReturn(1L);
367369
when(volume.getPoolId()).thenReturn(701L);
368370
when(volume.getPath()).thenReturn("vol-601.qcow2");
@@ -398,6 +400,7 @@ public void createImageTransfer_uploadFileBackend_success() throws Exception {
398400
assertNotNull(created);
399401
assertEquals(901L, created.getId());
400402
assertEquals(ImageTransfer.Direction.upload, created.getDirection());
403+
verify(volumeDao).updateState(eq(Volume.State.Ready), eq(Volume.Event.RestoreRequested), eq(Volume.State.Restoring), eq(volume), isNull());
401404
verify(agentManager, times(1)).send(eq(801L), any(Command.class));
402405
}
403406
}

0 commit comments

Comments
 (0)