From 85d6b15a14ebf09d1d3ae945c0579af82a00ff1a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 28 May 2026 17:22:15 +0800 Subject: [PATCH 1/2] [cloud]: emit vm and usedip delete events 1. Why? ZCF incremental sync depends on Cloud resource notifications. Some VM and UsedIp lifecycle paths changed rows through direct SQL hard delete or update operations, bypassing DB lifecycle extensions and leaving ZCF with stale resources. 2. How? Use DBFacade-aware delete/update paths for Created VM DB-only deletion, root volume deletion, UsedIp release, and UsedIp vmNic binding updates so ResNotify receives lifecycle callbacks. Keep EO cleanup for VM/root volume after the delete notifications are generated. 3. Side effects? Only notification-visible persistence paths change; the resources are still removed or updated in the same lifecycle flow. # Summary of changes (by module): - compute - network Resolves: ZCF-3961 Change-Id: I9a53cb036e11e742d1c420fa01444554f3b09285 --- .../main/java/org/zstack/compute/vm/VmInstanceBase.java | 8 ++++++-- .../main/java/org/zstack/network/l3/L3BasicNetwork.java | 2 +- .../java/org/zstack/network/l3/L3NetworkManagerImpl.java | 9 +++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 9ceb8000912..1c7651f3b7f 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -2798,11 +2798,15 @@ protected void scripts() { sql(VmNicVO.class).eq(VmNicVO_.vmInstanceUuid, self.getUuid()).hardDelete(); sql(VolumeVO.class).eq(VolumeVO_.vmInstanceUuid, self.getUuid()) .eq(VolumeVO_.type, VolumeType.Root) - .hardDelete(); + .delete(); sql(VmCdRomVO.class).eq(VmCdRomVO_.vmInstanceUuid, self.getUuid()).hardDelete(); - sql(VmInstanceVO.class).eq(VmInstanceVO_.uuid, self.getUuid()).hardDelete(); + sql(VmInstanceVO.class).eq(VmInstanceVO_.uuid, self.getUuid()).delete(); } }.execute(); + dbf.eoCleanup(VmInstanceVO.class, self.getUuid()); + if (inv.getRootVolumeUuid() != null) { + dbf.eoCleanup(VolumeVO.class, inv.getRootVolumeUuid()); + } callVmJustAfterDeleteFromDbExtensionPoint(inv, accountUuid); } else if (deletionPolicy == VmInstanceDeletionPolicy.Delay) { changeVmStateInDb(VmInstanceStateEvent.destroyed); diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 43849b41e34..867e695dcde 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -501,7 +501,7 @@ protected Void call() { .set(UsedIpVO_.metaData, reserveRangeUuid) .update(); } else { - SQL.New(UsedIpVO.class).eq(UsedIpVO_.uuid, msg.getUsedIpUuid()).hardDelete(); + SQL.New(UsedIpVO.class).eq(UsedIpVO_.uuid, msg.getUsedIpUuid()).delete(); } return null; diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 45fecdc0aa1..5c9ac401239 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -994,10 +994,11 @@ public void done(ErrorCodeList errorCodeList) { .update(); for (UsedIpInventory usedIp : newIps) { /* update usedIpVo */ - SQL.New(UsedIpVO.class) - .eq(UsedIpVO_.uuid, usedIp.getUuid()) - .set(UsedIpVO_.vmNicUuid, nicVO.getUuid()) - .update(); + UsedIpVO usedIpVO = dbf.findByUuid(usedIp.getUuid(), UsedIpVO.class); + if (usedIpVO != null) { + usedIpVO.setVmNicUuid(nicVO.getUuid()); + dbf.update(usedIpVO); + } } trigger.next(); } From 5d718feea91f480fe98186d1973e2e3008d6b3c1 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Fri, 29 May 2026 13:28:54 +0800 Subject: [PATCH 2/2] [cloud]: drop usedip hook changes Resolves: ZCF-3961 Change-Id: I59e60ae7cb9ffbe8e6195de730675c5d00138356 --- .../main/java/org/zstack/network/l3/L3BasicNetwork.java | 2 +- .../java/org/zstack/network/l3/L3NetworkManagerImpl.java | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 867e695dcde..43849b41e34 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -501,7 +501,7 @@ protected Void call() { .set(UsedIpVO_.metaData, reserveRangeUuid) .update(); } else { - SQL.New(UsedIpVO.class).eq(UsedIpVO_.uuid, msg.getUsedIpUuid()).delete(); + SQL.New(UsedIpVO.class).eq(UsedIpVO_.uuid, msg.getUsedIpUuid()).hardDelete(); } return null; diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 5c9ac401239..45fecdc0aa1 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -994,11 +994,10 @@ public void done(ErrorCodeList errorCodeList) { .update(); for (UsedIpInventory usedIp : newIps) { /* update usedIpVo */ - UsedIpVO usedIpVO = dbf.findByUuid(usedIp.getUuid(), UsedIpVO.class); - if (usedIpVO != null) { - usedIpVO.setVmNicUuid(nicVO.getUuid()); - dbf.update(usedIpVO); - } + SQL.New(UsedIpVO.class) + .eq(UsedIpVO_.uuid, usedIp.getUuid()) + .set(UsedIpVO_.vmNicUuid, nicVO.getUuid()) + .update(); } trigger.next(); }