Skip to content

Commit 81ca4c9

Browse files
sliceofapplepievishesh92
authored andcommitted
Batch network lookups per NIC in NetworkOrchestrator to eliminate N+1 queries during migration
Three methods called _networksDao.findById(nic.getNetworkId()) per NIC in a loop: setHypervisorHostname, prepareNicForMigration, prepareAllNicsForMigration. Now batch-loads all networks for a VM's NICs in a single WHERE id IN (...) query. - Add NetworkDao.listByIds(List<Long>) for batch ID lookup - Add getNetworkMapForNics helper returning Map<Long, NetworkVO> - Replace per-NIC findById with map lookup at 3 sites - Add null guard for deleted networks (pre-existing NPE risk on all 3 sites) - Site 2 (prepare) left unchanged — findById only on error path, not N+1
1 parent 21b2025 commit 81ca4c9

4 files changed

Lines changed: 51 additions & 3 deletions

File tree

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,13 +2085,31 @@ public void finalizeUpdateInSequence(Network network, boolean success) {
20852085
}
20862086
}
20872087

2088+
private Map<Long, NetworkVO> batchLoadNetworksForNics(List<NicVO> nics) {
2089+
List<Long> networkIds = new ArrayList<>(nics.size());
2090+
for (NicVO nic : nics) {
2091+
networkIds.add(nic.getNetworkId());
2092+
}
2093+
Map<Long, NetworkVO> result = new HashMap<>(networkIds.size());
2094+
if (!networkIds.isEmpty()) {
2095+
for (NetworkVO network : _networksDao.listByIds(networkIds)) {
2096+
result.put(network.getId(), network);
2097+
}
2098+
}
2099+
return result;
2100+
}
2101+
20882102
@Override
20892103
public void setHypervisorHostname(VirtualMachineProfile vm, DeployDestination dest, boolean migrationSuccessful) throws ResourceUnavailableException {
20902104
String hypervisorHostName = VirtualMachineManager.getHypervisorHostname(dest.getHost().getName());
20912105
if (StringUtils.isNotEmpty(hypervisorHostName)) {
20922106
final List<NicVO> nics = _nicDao.listByVmId(vm.getId());
2107+
final Map<Long, NetworkVO> networksById = batchLoadNetworksForNics(nics);
20932108
for (final NicVO nic : nics) {
2094-
final NetworkVO network = _networksDao.findById(nic.getNetworkId());
2109+
final NetworkVO network = networksById.get(nic.getNetworkId());
2110+
if (network == null) {
2111+
continue;
2112+
}
20952113
final Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId());
20962114
final NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network),
20972115
_networkModel.getNetworkTag(vm.getHypervisorType(), network));
@@ -2266,8 +2284,13 @@ public void prepareNicForMigration(final VirtualMachineProfile vm, final DeployD
22662284
}
22672285
final List<NicVO> nics = _nicDao.listByVmId(vm.getId());
22682286
final ReservationContext context = new ReservationContextImpl(UUID.randomUUID().toString(), null, null);
2287+
final Map<Long, NetworkVO> networksById = batchLoadNetworksForNics(nics);
22692288
for (final NicVO nic : nics) {
2270-
final NetworkVO network = _networksDao.findById(nic.getNetworkId());
2289+
final NetworkVO network = networksById.get(nic.getNetworkId());
2290+
if (network == null) {
2291+
logger.warn("Network {} not found for nic {} during migration prep, skipping", nic.getNetworkId(), nic);
2292+
continue;
2293+
}
22712294
final Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId());
22722295

22732296
final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, network.getGuruName());
@@ -2311,9 +2334,14 @@ public void prepareNicForMigration(final VirtualMachineProfile vm, final DeployD
23112334
public void prepareAllNicsForMigration(final VirtualMachineProfile vm, final DeployDestination dest) {
23122335
final List<NicVO> nics = _nicDao.listByVmId(vm.getId());
23132336
final ReservationContext context = new ReservationContextImpl(UUID.randomUUID().toString(), null, null);
2337+
final Map<Long, NetworkVO> networksById = batchLoadNetworksForNics(nics);
23142338
Long guestNetworkId = null;
23152339
for (final NicVO nic : nics) {
2316-
final NetworkVO network = _networksDao.findById(nic.getNetworkId());
2340+
final NetworkVO network = networksById.get(nic.getNetworkId());
2341+
if (network == null) {
2342+
logger.warn("Network {} not found for nic {} during migration prep, skipping", nic.getNetworkId(), nic);
2343+
continue;
2344+
}
23172345
if (network.getTrafficType().equals(TrafficType.Guest) && network.getGuestType().equals(GuestType.Isolated)) {
23182346
guestNetworkId = network.getId();
23192347
}

engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
3232

3333
List<NetworkVO> listByOwner(long ownerId);
3434

35+
List<NetworkVO> listByIds(List<Long> ids);
36+
3537
List<NetworkVO> listByGuestType(GuestType type);
3638

3739
List<NetworkVO> listBy(long accountId, long offeringId, long dataCenterId);

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,19 @@ public List<NetworkVO> listByOwner(final long ownerId) {
563563
return listBy(sc);
564564
}
565565

566+
@Override
567+
public List<NetworkVO> listByIds(List<Long> ids) {
568+
if (ids == null || ids.isEmpty()) {
569+
return new ArrayList<>();
570+
}
571+
SearchBuilder<NetworkVO> sb = createSearchBuilder();
572+
sb.and("id", sb.entity().getId(), Op.IN);
573+
sb.done();
574+
SearchCriteria<NetworkVO> sc = sb.create();
575+
sc.setParameters("id", ids.toArray());
576+
return listBy(sc);
577+
}
578+
566579
@Override
567580
public void addDomainToNetwork(final long networkId, final long domainId, final Boolean subdomainAccess) {
568581
addDomainToNetworknetwork(networkId, domainId, subdomainAccess);

server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,9 @@ public List<NetworkVO> listByNetworkDomainsAndAccountIds(Set<String> uniqueNtwkD
280280
public List<NetworkVO> listByNetworkDomainsAndDomainIds(Set<String> uniqueNtwkDomains, Set<Long> domainIds) {
281281
return List.of();
282282
}
283+
284+
@Override
285+
public List<NetworkVO> listByIds(List<Long> ids) {
286+
return null;
287+
}
283288
}

0 commit comments

Comments
 (0)