From 96f57368ac48850759715f27129b473fc677f696 Mon Sep 17 00:00:00 2001 From: abh1sar Date: Tue, 21 May 2024 16:58:27 +0530 Subject: [PATCH] Apply pagination to searchFilter in listNetworks before doing db query --- .../com/cloud/network/NetworkServiceImpl.java | 90 +++++++++++-------- 1 file changed, 51 insertions(+), 39 deletions(-) diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 068a06427dbb..ea057d510332 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -2267,7 +2267,7 @@ public Pair, Integer> searchForNetworks(ListNetworksCmd isRecursive = true; } - Filter searchFilter = new Filter(NetworkVO.class, "id", false, null, null); + Filter searchFilter = new Filter(NetworkVO.class, "id", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _networksDao.createSearchBuilder(); if (forVpc != null) { @@ -2322,41 +2322,52 @@ public Pair, Integer> searchForNetworks(ListNetworksCmd sb.join("associatedNetworkSearch", associatedNetworkSearch, sb.entity().getId(), associatedNetworkSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); } - List networksToReturn = new ArrayList(); + Pair, Integer> networks; + Pair, Integer> networksToReturn = new Pair<>(new ArrayList(), 0); if (isSystem == null || !isSystem) { if (!permittedAccounts.isEmpty()) { if (Arrays.asList(Network.NetworkFilter.Account, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) { //get account level networks - networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, - aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, permittedAccounts)); + networks = listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, permittedAccounts); + networksToReturn.first().addAll(networks.first()); + networksToReturn.second(networksToReturn.second() + networks.second()); } if (domainId != null && Arrays.asList(Network.NetworkFilter.Domain, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) { //get domain level networks - networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, - aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, domainId, false)); + networks = listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, domainId, false); + networksToReturn.first().addAll(networks.first()); + networksToReturn.second(networksToReturn.second() + networks.second()); } if (Arrays.asList(Network.NetworkFilter.Shared, Network.NetworkFilter.All).contains(networkFilter)) { // get shared networks - List sharedNetworks = listSharedNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + Pair, Integer> sharedNetworks = listSharedNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, permittedAccounts); - addNetworksToReturnIfNotExist(networksToReturn, sharedNetworks); + addNetworksToReturnIfNotExist(networksToReturn, sharedNetworks.first()); } } else { if (Arrays.asList(Network.NetworkFilter.Account, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) { //add account specific networks - networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, - aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, path, isRecursive)); + networks = listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, path, isRecursive); + networksToReturn.first().addAll(networks.first()); + networksToReturn.second(networksToReturn.second() + networks.second()); } if (Arrays.asList(Network.NetworkFilter.Domain, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) { //add domain specific networks of domain + parent domains - networksToReturn.addAll(listDomainSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, - aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, path, isRecursive)); + networks = listDomainSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, path, isRecursive); + networksToReturn.first().addAll(networks.first()); + networksToReturn.second(networksToReturn.second() + networks.second()); //add networks of subdomains if (domainId == null) { - networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, - aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, caller.getDomainId(), true)); + networks = listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter, caller.getDomainId(), true); + networksToReturn.first().addAll(networks.first()); + networksToReturn.second(networksToReturn.second() + networks.second()); } } if (Arrays.asList(Network.NetworkFilter.Shared, Network.NetworkFilter.All).contains(networkFilter)) { @@ -2367,11 +2378,11 @@ public Pair, Integer> searchForNetworks(ListNetworksCmd } } } else { - networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, + networksToReturn = _networksDao.searchAndCount(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId, null, true, restartRequired, specifyIpRanges, vpcId, tags, display, vlanId, associatedNetworkId), searchFilter); } - if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !networksToReturn.isEmpty()) { + if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !networksToReturn.first().isEmpty()) { List supportedNetworks = new ArrayList(); Service[] suppportedServices = new Service[supportedServicesStr.size()]; int i = 0; @@ -2385,44 +2396,45 @@ public Pair, Integer> searchForNetworks(ListNetworksCmd i++; } - for (NetworkVO network : networksToReturn) { + for (NetworkVO network : networksToReturn.first()) { if (areServicesSupportedInNetwork(network.getId(), suppportedServices)) { supportedNetworks.add(network); } } - networksToReturn = supportedNetworks; + networksToReturn.first(supportedNetworks); } if (canUseForDeploy != null) { List networksForDeploy = new ArrayList(); - for (NetworkVO network : networksToReturn) { + for (NetworkVO network : networksToReturn.first()) { if (_networkModel.canUseForDeploy(network) == canUseForDeploy) { networksForDeploy.add(network); } } - networksToReturn = networksForDeploy; + networksToReturn.first(networksForDeploy); } //Now apply pagination - List wPagination = com.cloud.utils.StringUtils.applyPagination(networksToReturn, cmd.getStartIndex(), cmd.getPageSizeVal()); + List wPagination = com.cloud.utils.StringUtils.applyPagination(networksToReturn.first(), cmd.getStartIndex(), cmd.getPageSizeVal()); if (wPagination != null) { - Pair, Integer> listWPagination = new Pair, Integer>(wPagination, networksToReturn.size()); + Pair, Integer> listWPagination = new Pair, Integer>(wPagination, networksToReturn.second()); return listWPagination; } - return new Pair, Integer>(networksToReturn, networksToReturn.size()); + return new Pair, Integer>(networksToReturn.first(), networksToReturn.second()); } - private void addNetworksToReturnIfNotExist(final List networksToReturn, final List sharedNetworks) { - Set networkIds = networksToReturn.stream() + private void addNetworksToReturnIfNotExist(final Pair, Integer> networksToReturn, final List sharedNetworks) { + Set networkIds = networksToReturn.first().stream() .map(NetworkVO::getId) .collect(Collectors.toSet()); List sharedNetworksToReturn = sharedNetworks.stream() .filter(network -> ! networkIds.contains(network.getId())) .collect(Collectors.toList()); - networksToReturn.addAll(sharedNetworksToReturn); + networksToReturn.first().addAll(sharedNetworksToReturn); + networksToReturn.second(networksToReturn.second() + sharedNetworksToReturn.size()); } private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, @@ -2516,7 +2528,7 @@ private SearchCriteria buildNetworkSearchCriteria(SearchBuilder listDomainLevelNetworks(SearchCriteria sc, Filter searchFilter, long domainId, boolean parentDomainsOnly) { + private Pair, Integer> listDomainLevelNetworks(SearchCriteria sc, Filter searchFilter, long domainId, boolean parentDomainsOnly) { List networkIds = new ArrayList(); Set allowedDomains = _domainMgr.getDomainParentIds(domainId); List maps = _networkDomainDao.listDomainNetworkMapByDomain(allowedDomains.toArray()); @@ -2537,13 +2549,13 @@ private List listDomainLevelNetworks(SearchCriteria sc, Fi domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString()); sc.addAnd("id", SearchCriteria.Op.SC, domainSC); - return _networksDao.search(sc, searchFilter); + return _networksDao.searchAndCount(sc, searchFilter); } else { - return new ArrayList(); + return new Pair<>(new ArrayList(), 0); } } - private List listAccountSpecificNetworks(SearchCriteria sc, Filter searchFilter, List permittedAccounts) { + private Pair, Integer> listAccountSpecificNetworks(SearchCriteria sc, Filter searchFilter, List permittedAccounts) { SearchCriteria accountSC = _networksDao.createSearchCriteria(); if (!permittedAccounts.isEmpty()) { accountSC.addAnd("accountId", SearchCriteria.Op.IN, permittedAccounts.toArray()); @@ -2552,10 +2564,10 @@ private List listAccountSpecificNetworks(SearchCriteria sc accountSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Account.toString()); sc.addAnd("id", SearchCriteria.Op.SC, accountSC); - return _networksDao.search(sc, searchFilter); + return _networksDao.searchAndCount(sc, searchFilter); } - private List listAccountSpecificNetworksByDomainPath(SearchCriteria sc, Filter searchFilter, String path, boolean isRecursive) { + private Pair, Integer> listAccountSpecificNetworksByDomainPath(SearchCriteria sc, Filter searchFilter, String path, boolean isRecursive) { SearchCriteria accountSC = _networksDao.createSearchCriteria(); accountSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Account.toString()); @@ -2568,10 +2580,10 @@ private List listAccountSpecificNetworksByDomainPath(SearchCriteria listDomainSpecificNetworksByDomainPath(SearchCriteria sc, Filter searchFilter, String path, boolean isRecursive) { + private Pair, Integer> listDomainSpecificNetworksByDomainPath(SearchCriteria sc, Filter searchFilter, String path, boolean isRecursive) { Set allowedDomains = new HashSet(); if (path != null) { @@ -2597,21 +2609,21 @@ private List listDomainSpecificNetworksByDomainPath(SearchCriteria(); + return new Pair<>(new ArrayList(), 0); } } - private List listSharedNetworks(SearchCriteria sc, Filter searchFilter, List permittedAccounts) { + private Pair, Integer> listSharedNetworks(SearchCriteria sc, Filter searchFilter, List permittedAccounts) { List sharedNetworkIds = _networkPermissionDao.listPermittedNetworkIdsByAccounts(permittedAccounts); if (!sharedNetworkIds.isEmpty()) { SearchCriteria ssc = _networksDao.createSearchCriteria(); ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray()); sc.addAnd("id", SearchCriteria.Op.SC, ssc); - return _networksDao.search(sc, searchFilter); + return _networksDao.searchAndCount(sc, searchFilter); } - return new ArrayList(); + return new Pair<>(new ArrayList(), 0); } private List listSharedNetworksByDomainPath(SearchCriteria sc, Filter searchFilter, String path, boolean isRecursive) {