Skip to content

Commit ab338a6

Browse files
author
Zhang Wenhao
committed
<fix>[kvm]: remove TPM from VM individually instead of batch delete
Change the TPM deletion logic from batch SQL delete to individual deletion using While loop. This ensures proper cleanup for each TPM by calling removeTpmFromVm method. Added error handling to continue even if deletion fails for individual TPM. Changes: - Replace batch SQL delete with While loop iteration - Call removeTpmFromVm for each TPM to ensure proper cleanup - Add error handling to continue on individual failures - Log warnings for failed TPM deletions Resolves: ZSV-11439 Related: ZSV-11310 Change-Id: I616d746d6a6f677a6772796f63676e6177676371
1 parent 912b02f commit ab338a6

1 file changed

Lines changed: 30 additions & 4 deletions

File tree

plugin/kvm/src/main/java/org/zstack/kvm/tpm/KvmTpmManager.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,10 @@ public String getName() {
305305
static class RemoveTpmFromVmContext {
306306
String vmInstanceUuid;
307307
String tpmUuid;
308+
309+
// enable when TPM delete/VM delete ...
310+
boolean force;
311+
308312
List<VmHostFileVO> hostFiles;
309313

310314
static RemoveTpmFromVmContext valueOf(RemoveTpmMsg msg) {
@@ -318,6 +322,7 @@ static RemoveTpmFromVmContext valueOf(RemoveTpmMsg msg) {
318322
private void removeTpmFromVm(RemoveTpmFromVmContext context, Completion completion) {
319323
SimpleFlowChain.of("remove-tpm-from-vm-" + context.vmInstanceUuid)
320324
.then(Flow.of("check-vm-status")
325+
.skipIf(data -> context.force)
321326
.handle(trigger -> {
322327
VmInstanceVO vm = Q.New(VmInstanceVO.class)
323328
.eq(VmInstanceVO_.uuid, context.vmInstanceUuid)
@@ -457,10 +462,31 @@ public void rollback(FlowRollback trigger, Map data) {
457462
trigger.rollback();
458463
return;
459464
}
460-
SQL.New(TpmVO.class)
461-
.in(TpmVO_.uuid, transform(reply.getInventories(), TpmInventory::getUuid))
462-
.delete();
463-
trigger.rollback();
465+
466+
new While<>(reply.getInventories()).each((tpm, whileCompletion) -> {
467+
RemoveTpmFromVmContext removeContext = new RemoveTpmFromVmContext();
468+
removeContext.vmInstanceUuid = tpm.getVmInstanceUuid();
469+
removeContext.tpmUuid = tpm.getUuid();
470+
removeContext.force = true;
471+
removeTpmFromVm(removeContext, new Completion(whileCompletion) {
472+
@Override
473+
public void success() {
474+
whileCompletion.done();
475+
}
476+
477+
@Override
478+
public void fail(ErrorCode errorCode) {
479+
logger.warn(String.format("failed to delete tpm for VM[%s] but still continue: %s",
480+
tpm.getVmInstanceUuid(), errorCode.getReadableDetails()));
481+
whileCompletion.done();
482+
}
483+
});
484+
}).run(new WhileDoneCompletion(trigger) {
485+
@Override
486+
public void done(ErrorCodeList errorCodeList) {
487+
trigger.rollback();
488+
}
489+
});
464490
}
465491
}).then(new NoRollbackFlow() {
466492
String __name__ = "clone-encrypted-resource-key-if-needed";

0 commit comments

Comments
 (0)