This is an automated email from the ASF dual-hosted git repository.

Pearl1594 pushed a commit to branch support-multi-vlan-guestnet
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 0988acea4292050f1ef1dfbe0930524e38844ee4
Author: Pearl1594 <[email protected]>
AuthorDate: Wed Oct 7 09:04:17 2026 -0400

    Usage: Fix usage_network_offering row mismatches on nic removal and 
default-nic swap
---
 .../java/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java    | 9 +++++----
 server/src/main/java/com/cloud/vm/UserVmManagerImpl.java         | 6 ++++--
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git 
a/engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
 
b/engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
index b44b74e7e1e..e9095c498b2 100644
--- 
a/engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
+++ 
b/engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
@@ -37,7 +37,7 @@ import com.cloud.utils.db.TransactionLegacy;
 public class UsageNetworkOfferingDaoImpl extends 
GenericDaoBase<UsageNetworkOfferingVO, Long> implements UsageNetworkOfferingDao 
{
 
     protected static final String UPDATE_DELETED =
-        "UPDATE usage_network_offering SET deleted = ? WHERE account_id = ? 
AND vm_instance_id = ? AND network_offering_id = ? and deleted IS NULL";
+        "UPDATE usage_network_offering SET deleted = ? WHERE id = ? and 
deleted IS NULL";
     protected static final String GET_USAGE_RECORDS_BY_ACCOUNT =
         "SELECT zone_id, account_id, domain_id, vm_instance_id, 
network_offering_id, nic_id, is_default, created, deleted, network_id " + "FROM 
usage_network_offering "
             + "WHERE account_id = ? AND ((deleted IS NULL) OR (created BETWEEN 
? AND ?) OR " + "      (deleted BETWEEN ? AND ?) OR ((created <= ?) AND 
(deleted >= ?)))";
@@ -63,10 +63,11 @@ public class UsageNetworkOfferingDaoImpl extends 
GenericDaoBase<UsageNetworkOffe
             if (usage.getDeleted() != null) {
                 try(PreparedStatement pstmt = 
txn.prepareStatement(UPDATE_DELETED);) {
                     if (pstmt != null) {
+                        // matches by primary key: the caller already 
identified the exact row(s) to close via
+                        // search(); a broader (account, vm, offering) match 
would also close a different nic's
+                        // still-open row for the same offering
                         pstmt.setString(1, 
DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), usage.getDeleted()));
-                        pstmt.setLong(2, usage.getAccountId());
-                        pstmt.setLong(3, usage.getVmInstanceId());
-                        pstmt.setLong(4, usage.getNetworkOfferingId());
+                        pstmt.setLong(2, usage.getId());
                         pstmt.executeUpdate();
                     }
                   }catch (SQLException e) {
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 9d7c995dfb4..c866365b4a1 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -1870,12 +1870,14 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
             throw new CloudRuntimeException("Failed to change default nic to " 
+ nic + " and now we have no default");
         } else if (newdefault.getId() == nic.getNetworkId()) {
             logger.debug("successfully set default network to " + network + " 
for " + vmInstance);
+            // close nic's old row before opening its new one, not after - 
otherwise the REMOVE below can't tell
+            // the stale row apart from the one just ASSIGNed and closes both
             
UsageEventUtils.publishNicNetworkOfferingUsageEvents(EventTypes.EVENT_NETWORK_OFFERING_REMOVE,
 vmInstance.getAccountId(), vmInstance.getDataCenterId(),
                     vmInstance.getId(), VirtualMachine.class.getName(), 
vmInstance.getUuid(), existingVO, 1L, vmInstance.isDisplay());
-            
UsageEventUtils.publishNicNetworkOfferingUsageEvents(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN,
 vmInstance.getAccountId(), vmInstance.getDataCenterId(),
-                    vmInstance.getId(), VirtualMachine.class.getName(), 
vmInstance.getUuid(), nic, 1L, vmInstance.isDisplay());
             
UsageEventUtils.publishNicNetworkOfferingUsageEvents(EventTypes.EVENT_NETWORK_OFFERING_REMOVE,
 vmInstance.getAccountId(), vmInstance.getDataCenterId(),
                     vmInstance.getId(), VirtualMachine.class.getName(), 
vmInstance.getUuid(), nic, 0L, vmInstance.isDisplay());
+            
UsageEventUtils.publishNicNetworkOfferingUsageEvents(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN,
 vmInstance.getAccountId(), vmInstance.getDataCenterId(),
+                    vmInstance.getId(), VirtualMachine.class.getName(), 
vmInstance.getUuid(), nic, 1L, vmInstance.isDisplay());
             
UsageEventUtils.publishNicNetworkOfferingUsageEvents(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN,
 vmInstance.getAccountId(), vmInstance.getDataCenterId(),
                     vmInstance.getId(), VirtualMachine.class.getName(), 
vmInstance.getUuid(), existingVO, 0L, vmInstance.isDisplay());
 

Reply via email to