Skip to content

Commit 169411e

Browse files
committed
server: use id column as secondary sort criteria with sortKey
For tables that use sort_key field, incorrect results can be returned by the list* APIs while using pagination and with the same values for sort-key field. (Default value for sort_key field remains 0). This change adds id column as secondary sort criteria in such cases. Fixes #5316 Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent 72182b6 commit 169411e

File tree

4 files changed

+14
-12
lines changed

4 files changed

+14
-12
lines changed

server/src/main/java/com/cloud/api/query/QueryManagerImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2801,6 +2801,7 @@ private Pair<List<DiskOfferingJoinVO>, Integer> searchForDiskOfferingsInternal(L
28012801
// root
28022802

28032803
Filter searchFilter = new Filter(DiskOfferingJoinVO.class, "sortKey", SortKeyAscending.value(), cmd.getStartIndex(), cmd.getPageSizeVal());
2804+
searchFilter.addOrderBy(DiskOfferingJoinVO.class, "id", true);
28042805
SearchCriteria<DiskOfferingJoinVO> sc = _diskOfferingJoinDao.createSearchCriteria();
28052806
sc.addAnd("type", Op.EQ, DiskOfferingVO.Type.Disk);
28062807

@@ -2960,6 +2961,7 @@ private Pair<List<ServiceOfferingJoinVO>, Integer> searchForServiceOfferingsInte
29602961
// till
29612962
// root
29622963
Filter searchFilter = new Filter(ServiceOfferingJoinVO.class, "sortKey", SortKeyAscending.value(), cmd.getStartIndex(), cmd.getPageSizeVal());
2964+
searchFilter.addOrderBy(ServiceOfferingJoinVO.class, "id", true);
29632965

29642966
Account caller = CallContext.current().getCallingAccount();
29652967
Object name = cmd.getServiceOfferingName();
@@ -3182,6 +3184,7 @@ private Pair<List<DataCenterJoinVO>, Integer> listDataCentersInternal(ListZonesC
31823184
}
31833185

31843186
Filter searchFilter = new Filter(DataCenterJoinVO.class, "sortKey", SortKeyAscending.value(), cmd.getStartIndex(), cmd.getPageSizeVal());
3187+
searchFilter.addOrderBy(DataCenterJoinVO.class, "id", true);
31853188
SearchCriteria<DataCenterJoinVO> sc = sb.create();
31863189

31873190
if (networkType != null) {

server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
3535
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
3636
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
37+
import org.apache.cloudstack.query.QueryService;
3738
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
3839
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
3940
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
@@ -474,10 +475,8 @@ public List<TemplateJoinVO> searchByTemplateZonePair(Boolean showRemoved, String
474475
DETAILS_BATCH_SIZE = Integer.parseInt(batchCfg);
475476
}
476477
// query details by batches
477-
Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm"));
478-
isAscending = (isAscending == null ? Boolean.TRUE : isAscending);
479-
Filter searchFilter = new Filter(TemplateJoinVO.class, "sortKey", isAscending, null, null);
480-
searchFilter.addOrderBy(TemplateJoinVO.class, "tempZonePair", isAscending);
478+
Filter searchFilter = new Filter(TemplateJoinVO.class, "sortKey", QueryService.SortKeyAscending.value(), null, null);
479+
searchFilter.addOrderBy(TemplateJoinVO.class, "tempZonePair", QueryService.SortKeyAscending.value());
481480
List<TemplateJoinVO> uvList = new ArrayList<TemplateJoinVO>();
482481
// query details by batches
483482
int curr_index = 0;

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@
3939
import javax.inject.Inject;
4040
import javax.naming.ConfigurationException;
4141

42-
import com.cloud.dc.dao.VsphereStoragePolicyDao;
43-
import com.cloud.storage.Storage;
4442
import org.apache.cloudstack.acl.SecurityChecker;
4543
import org.apache.cloudstack.affinity.AffinityGroup;
4644
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -87,6 +85,7 @@
8785
import org.apache.cloudstack.framework.messagebus.MessageBus;
8886
import org.apache.cloudstack.framework.messagebus.MessageSubscriber;
8987
import org.apache.cloudstack.framework.messagebus.PublishScope;
88+
import org.apache.cloudstack.query.QueryService;
9089
import org.apache.cloudstack.region.PortableIp;
9190
import org.apache.cloudstack.region.PortableIpDao;
9291
import org.apache.cloudstack.region.PortableIpRange;
@@ -144,6 +143,7 @@
144143
import com.cloud.dc.dao.HostPodDao;
145144
import com.cloud.dc.dao.PodVlanMapDao;
146145
import com.cloud.dc.dao.VlanDao;
146+
import com.cloud.dc.dao.VsphereStoragePolicyDao;
147147
import com.cloud.deploy.DataCenterDeployment;
148148
import com.cloud.deploy.DeploymentClusterPlanner;
149149
import com.cloud.domain.Domain;
@@ -209,6 +209,7 @@
209209
import com.cloud.service.dao.ServiceOfferingDao;
210210
import com.cloud.service.dao.ServiceOfferingDetailsDao;
211211
import com.cloud.storage.DiskOfferingVO;
212+
import com.cloud.storage.Storage;
212213
import com.cloud.storage.Storage.ProvisioningType;
213214
import com.cloud.storage.StorageManager;
214215
import com.cloud.storage.Volume;
@@ -5548,9 +5549,8 @@ protected void validateNtwkOffDetails(final Map<Detail, String> details, final M
55485549

55495550
@Override
55505551
public Pair<List<? extends NetworkOffering>, Integer> searchForNetworkOfferings(final ListNetworkOfferingsCmd cmd) {
5551-
Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm"));
5552-
isAscending = isAscending == null ? Boolean.TRUE : isAscending;
5553-
final Filter searchFilter = new Filter(NetworkOfferingJoinVO.class, "sortKey", isAscending, null, null);
5552+
final Filter searchFilter = new Filter(NetworkOfferingJoinVO.class, "sortKey", QueryService.SortKeyAscending.value(), null, null);
5553+
searchFilter.addOrderBy(NetworkOfferingJoinVO.class, "id", true);
55545554
final Account caller = CallContext.current().getCallingAccount();
55555555
final SearchCriteria<NetworkOfferingJoinVO> sc = networkOfferingJoinDao.createSearchCriteria();
55565556

server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
5252
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
5353
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
54+
import org.apache.cloudstack.query.QueryService;
5455
import org.apache.commons.collections.CollectionUtils;
5556
import org.apache.log4j.Logger;
5657

@@ -658,9 +659,8 @@ public Pair<List<? extends VpcOffering>, Integer> listVpcOfferings(ListVPCOfferi
658659
final Long startIndex = cmd.getStartIndex();
659660
final Long pageSizeVal = cmd.getPageSizeVal();
660661
final Long zoneId = cmd.getZoneId();
661-
Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm"));
662-
isAscending = isAscending == null ? Boolean.TRUE : isAscending;
663-
final Filter searchFilter = new Filter(VpcOfferingJoinVO.class, "sortKey", isAscending, null, null);
662+
final Filter searchFilter = new Filter(VpcOfferingJoinVO.class, "sortKey", QueryService.SortKeyAscending.value(), null, null);
663+
searchFilter.addOrderBy(VpcOfferingJoinVO.class, "id", true);
664664
final SearchCriteria<VpcOfferingJoinVO> sc = vpcOfferingJoinDao.createSearchCriteria();
665665

666666
if (keyword != null) {

0 commit comments

Comments
 (0)