[ https://issues.apache.org/jira/browse/CLOUDSTACK-10320?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16411705#comment-16411705 ]
ASF GitHub Bot commented on CLOUDSTACK-10320: --------------------------------------------- DaanHoogland closed pull request #2481: CLOUDSTACK-10320 - Invalid pair for response object breaking response parsing URL: https://github.com/apache/cloudstack/pull/2481 This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java index 304a122a0b7..442d3cc181d 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java @@ -1315,6 +1315,10 @@ protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria public Pair<List<T>, Integer> searchAndCount(final SearchCriteria<T> sc, final Filter filter) { List<T> objects = search(sc, filter, null, false); Integer count = getCount(sc); + // Count cannot be less than the result set but can be higher due to pagination, see CLOUDSTACK-10320 + if (count < objects.size()) { + count = objects.size(); + } return new Pair<List<T>, Integer>(objects, count); } @@ -1323,6 +1327,11 @@ protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria public Pair<List<T>, Integer> searchAndDistinctCount(final SearchCriteria<T> sc, final Filter filter) { List<T> objects = search(sc, filter, null, false); Integer count = getDistinctCount(sc); + // Count cannot be 0 if there is at least a result in the list, see CLOUDSTACK-10320 + if (count == 0 && !objects.isEmpty()) { + // Cannot assume if it's more than one since the count is distinct vs search + count = 1; + } return new Pair<List<T>, Integer>(objects, count); } @@ -1331,6 +1340,11 @@ protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria public Pair<List<T>, Integer> searchAndDistinctCount(final SearchCriteria<T> sc, final Filter filter, final String[] distinctColumns) { List<T> objects = search(sc, filter, null, false); Integer count = getDistinctCount(sc, distinctColumns); + // Count cannot be 0 if there is at least a result in the list, see CLOUDSTACK-10320 + if (count == 0 && !objects.isEmpty()) { + // Cannot assume if it's more than one since the count is distinct vs search + count = 1; + } return new Pair<List<T>, Integer>(objects, count); } ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > Invalid pair for response object breaking response parsing > ---------------------------------------------------------- > > Key: CLOUDSTACK-10320 > URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10320 > Project: CloudStack > Issue Type: Bug > Security Level: Public(Anyone can view this level - this is the > default.) > Components: API > Reporter: Marc-Aurèle Brothier > Assignee: Marc-Aurèle Brothier > Priority: Major > > Under some circumstances, the API is returning an invalid response, for > simplicity I will expose the JSON case. The API response on a > listVirtualMachines can be this string: > {code:java} > { "listvirtualmachinesresponse" : ] } }{code} > To understand how this is possible, assume you have more than one management > server and one is processing the destroy of a virtual machine in the account > X which is the only one it has. Another process is returning the result of > listVirtualMachines for that same account X. During the listVM command, the > result set is fetch with a searchAndDistinctCount due to the view > ([https://github.com/apache/cloudstack/blob/master/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java#L1024).] > This is done through 2 queries in the GenericDao > [https://github.com/apache/cloudstack/blob/master/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java#L1323] > and if you encounter the _right_ conditions, the VM will be marked as > removed in between those 2 queries. This results in having a Pair result with > at least one object but a count of 0. Then following how is done the > serialization of the response at > [https://github.com/apache/cloudstack/blob/master/server/src/main/java/com/cloud/api/response/ApiResponseSerializer.java#L86] > you will reach the case where your output is the one previously mentioned. > To overcome this issue, there isn't a true fix but only a better pair > response to ensure a correct response formatting. If the result set contains > at least something, the count cannot be 0 but we cannot guess the correct > answer, but only state it has at least one element. -- This message was sent by Atlassian JIRA (v7.6.3#76005)