From c90723f491c8da4cb9873a896a2410f60b358193 Mon Sep 17 00:00:00 2001 From: ramamurtis Date: Fri, 30 Oct 2015 09:44:59 +0530 Subject: [PATCH 1/2] CLOUDSTACK-9006 - ListTemplates API returns result in inconsistent order when called concurrently --- framework/db/src/com/cloud/utils/db/Filter.java | 2 +- server/src/com/cloud/api/query/QueryManagerImpl.java | 1 + server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/db/src/com/cloud/utils/db/Filter.java b/framework/db/src/com/cloud/utils/db/Filter.java index fdcad9c3e54..59dc8c1477e 100644 --- a/framework/db/src/com/cloud/utils/db/Filter.java +++ b/framework/db/src/com/cloud/utils/db/Filter.java @@ -89,7 +89,7 @@ public class Filter { if (_orderBy == null) { _orderBy = order.insert(0, " ORDER BY ").toString(); } else { - _orderBy = order.insert(0, _orderBy).toString(); + _orderBy = order.insert(0, _orderBy + ", ").toString(); } } diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index e90f2137f81..f853b673d4a 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -3106,6 +3106,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService, Confi Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); isAscending = (isAscending == null ? Boolean.TRUE : isAscending); Filter searchFilter = new Filter(TemplateJoinVO.class, "sortKey", isAscending, startIndex, pageSize); + searchFilter.addOrderBy(TemplateJoinVO.class, "tempZonePair", isAscending); SearchBuilder sb = _templateJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getTempZonePair()); // select distinct (templateId, zoneId) pair diff --git a/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java index 15cefa54616..4bb2c95f4b5 100644 --- a/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java @@ -383,6 +383,7 @@ public class TemplateJoinDaoImpl extends GenericDaoBase im Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); isAscending = (isAscending == null ? Boolean.TRUE : isAscending); Filter searchFilter = new Filter(TemplateJoinVO.class, "sortKey", isAscending, null, null); + searchFilter.addOrderBy(TemplateJoinVO.class, "tempZonePair", isAscending); List uvList = new ArrayList(); // query details by batches int curr_index = 0; From 9d1a469ae5f0a3751b64d66582fbcc2180a9c97c Mon Sep 17 00:00:00 2001 From: ramamurtis Date: Wed, 4 Nov 2015 10:31:02 +0530 Subject: [PATCH 2/2] CLOUDSTACK-9006 - ListTemplates API returns result in inconsistent order when called concurrently Adding filter test to verify addOrderBy method. --- .../test/com/cloud/utils/db/FilterTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 framework/db/test/com/cloud/utils/db/FilterTest.java diff --git a/framework/db/test/com/cloud/utils/db/FilterTest.java b/framework/db/test/com/cloud/utils/db/FilterTest.java new file mode 100644 index 00000000000..079611ab69f --- /dev/null +++ b/framework/db/test/com/cloud/utils/db/FilterTest.java @@ -0,0 +1,44 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.utils.db; + +import org.junit.Assert; +import org.junit.Test; + +public class FilterTest { + + @Test + /* + * This test verifies that the Order By clause generated by the filter is correct and it separates each + * order by field with a comma. Using DbTestVO to assert it + */ + public void testAddOrderBy() { + Filter filter = new Filter(DbTestVO.class, "fieldString", true, 1L, 1L); + + Assert.assertTrue(filter.getOrderBy().trim().toLowerCase().equals("order by test.fld_string asc")); + + filter.addOrderBy(DbTestVO.class, "fieldLong", true); + + Assert.assertTrue(filter.getOrderBy().contains(",")); + Assert.assertTrue(filter.getOrderBy().split(",")[1].trim().toLowerCase().equals("test.fld_long asc")); + + filter.addOrderBy(DbTestVO.class, "fieldInt", true); + + Assert.assertTrue(filter.getOrderBy().split(",").length == 3); + Assert.assertTrue(filter.getOrderBy().split(",")[2].trim().toLowerCase().equals("test.fld_int asc")); + } +}