From 8cabccdbaeac54bac024e4040b07ca3a832cc643 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Wed, 4 Sep 2024 22:44:04 -0700 Subject: [PATCH 1/2] Fixed listEvents intermittent exception: com.mysql.cj.jdbc.ClientPreparedStatement: SELECT event_view.id, event_view.uuid, event_view.type, event_view.state, event_view.description, event_view.created, event_view.user_id, event_view.user_name, event_view.level, event_view.start_id, event_view.start_uuid, event_view.parameters, event_view.account_id, event_view.account_uuid, event_view.account_name, event_view.account_type, event_view.domain_id, event_view.domain_uuid, event_view.domain_name, event_view.domain_path, event_view.resource_id, event_view.resource_type, event_view.project_id, event_view.project_uuid, event_view.project_name, event_view.archived, event_view.display FROM event_view WHERE event_view.id IN ) --- .../main/java/com/cloud/api/query/QueryManagerImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 72ae4935363..f45c1c114ee 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -739,7 +739,13 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Integer count = eventIdPage.second(); Long[] idArray = eventIdPage.first().toArray(new Long[0]); - if (count == 0) { + /** + * Need to check array empty, because {@link com.cloud.utils.db.GenericDaoBase#searchAndCount(SearchCriteria, Filter, boolean)} + * makes two calls: first to get objects and second to get count. + * List events has start date filter, there is highly possible cause where no objects loaded + * and next millisecond new event added and finally we ended up with count = 1 and no ids. + */ + if (count == 0 || idArray.length < 1) { return new Pair<>(new ArrayList<>(), count); } From 97b07dbaae97afb6c2d52c1a55d06c288746354f Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Mon, 9 Sep 2024 15:54:44 -0700 Subject: [PATCH 2/2] Fixed code review comments --- .../src/main/java/com/cloud/api/query/QueryManagerImpl.java | 2 +- .../src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index f45c1c114ee..c0e5bd9621f 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -746,7 +746,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q * and next millisecond new event added and finally we ended up with count = 1 and no ids. */ if (count == 0 || idArray.length < 1) { - return new Pair<>(new ArrayList<>(), count); + count = 0; } List events = _eventJoinDao.searchByIds(idArray); diff --git a/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java b/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java index c73f57529b8..d83a52b380c 100644 --- a/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java @@ -130,6 +130,10 @@ public class EventJoinDaoImpl extends GenericDaoBase implemen @Override public List searchByIds(Long... ids) { + // return empty collection if there are no ids. + if (ids.length == 0) { + return List.of(); + } SearchCriteria sc = vrSearch.create(); sc.setParameters("idIN", ids); return searchIncludingRemoved(sc, null, null, false);