This is an automated email from the ASF dual-hosted git repository.
Pearl1594 pushed a commit to branch usage-billing-nic-removal-and-default-swap
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to
refs/heads/usage-billing-nic-removal-and-default-swap by this push:
new 17a9718caf1 Usage: Fix usage_network_offering row mismatches on nic
removal and default-nic swap
17a9718caf1 is described below
commit 17a9718caf1bf7e80f334840a850c9eaf1cb1a6a
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 b3bc06e8af4..a48a260dda0 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 " + "FROM
usage_network_offering "
+ "WHERE account_id = ? AND ((deleted IS NULL) OR (created BETWEEN
? AND ?) OR " + " (deleted BETWEEN ? AND ?) OR ((created <= ?) AND
(deleted >= ?)))";
@@ -59,10 +59,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 7636ef6b152..91f2fe09706 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -1790,12 +1790,14 @@ public class UserVmManagerImpl extends ManagerBase
implements UserVmManager, Vir
logger.debug("successfully set default network to " + network + "
for " + vmInstance);
String nicIdString = Long.toString(nic.getId());
long newNetworkOfferingId = network.getNetworkOfferingId();
+ // 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.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE,
vmInstance.getAccountId(), vmInstance.getDataCenterId(), vmInstance.getId(),
oldNicIdString, oldNetworkOfferingId, null, 1L,
VirtualMachine.class.getName(), vmInstance.getUuid(), vmInstance.isDisplay());
-
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN,
vmInstance.getAccountId(), vmInstance.getDataCenterId(), vmInstance.getId(),
nicIdString,
- newNetworkOfferingId, null, 1L,
VirtualMachine.class.getName(), vmInstance.getUuid(), vmInstance.isDisplay());
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE,
vmInstance.getAccountId(), vmInstance.getDataCenterId(), vmInstance.getId(),
nicIdString,
newNetworkOfferingId, null, 0L,
VirtualMachine.class.getName(), vmInstance.getUuid(), vmInstance.isDisplay());
+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN,
vmInstance.getAccountId(), vmInstance.getDataCenterId(), vmInstance.getId(),
nicIdString,
+ newNetworkOfferingId, null, 1L,
VirtualMachine.class.getName(), vmInstance.getUuid(), vmInstance.isDisplay());
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN,
vmInstance.getAccountId(), vmInstance.getDataCenterId(), vmInstance.getId(),
oldNicIdString, oldNetworkOfferingId, null, 0L,
VirtualMachine.class.getName(), vmInstance.getUuid(), vmInstance.isDisplay());