You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by wu...@apache.org on 2022/11/28 14:25:27 UTC

[ambari] branch trunk updated: AMBARI-25632: Verify custom queries with "IN" clause for ORA-01795 issue (#3585)

This is an automated email from the ASF dual-hosted git repository.

wuzhiguo pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 1ccc503865 AMBARI-25632: Verify custom queries with "IN" clause for ORA-01795 issue (#3585)
1ccc503865 is described below

commit 1ccc503865b3f115d7bec0df004df719410ce0df
Author: Zhiguo Wu <wu...@apache.org>
AuthorDate: Mon Nov 28 22:25:21 2022 +0800

    AMBARI-25632: Verify custom queries with "IN" clause for ORA-01795 issue (#3585)
---
 .../ambari/server/configuration/Configuration.java |  20 ----
 .../org/apache/ambari/server/orm/dao/GroupDAO.java |  22 +++--
 .../orm/dao/HostComponentDesiredStateDAO.java      |   5 -
 .../ambari/server/orm/dao/HostRoleCommandDAO.java  | 106 +++++++++++++++------
 .../server/orm/dao/KerberosKeytabPrincipalDAO.java |  23 +++--
 .../ambari/server/orm/dao/PermissionDAO.java       |  18 ++--
 .../apache/ambari/server/orm/dao/PrivilegeDAO.java |  22 +++--
 .../apache/ambari/server/orm/dao/RequestDAO.java   |  20 ++--
 .../org/apache/ambari/server/orm/dao/StageDAO.java |  19 ++--
 .../org/apache/ambari/server/orm/dao/UserDAO.java  |  20 ++--
 10 files changed, 173 insertions(+), 102 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
index 129df45a79..85920f6c60 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
@@ -2480,16 +2480,6 @@ public class Configuration {
   public static final ConfigurationProperty<Integer> METRIC_RETRIEVAL_SERVICE_REQUEST_TTL = new ConfigurationProperty<>(
       "metrics.retrieval-service.request.ttl", 5);
 
-  /**
-   * The number of tasks that can be queried from the database at once In the
-   * case of more tasks, multiple queries are issued
-   *
-   * @return
-   */
-  @Markdown(description = "The maximum number of tasks which can be queried by ID from the database.")
-  public static final ConfigurationProperty<Integer> TASK_ID_LIST_LIMIT = new ConfigurationProperty<>(
-      "task.query.parameterlist.size", 999);
-
   /**
    * Indicates whether the current ambari server instance is the active instance.
    * If this property is missing, the value will be considered to be true.
@@ -5546,16 +5536,6 @@ public class Configuration {
     return Boolean.parseBoolean(getProperty(METRIC_RETRIEVAL_SERVICE_REQUEST_TTL_ENABLED));
   }
 
-  /**
-   * Returns the number of tasks that can be queried from the database at once
-   * In the case of more tasks, multiple queries are issued
-   *
-   * @return
-   */
-  public int getTaskIdListLimit() {
-    return Integer.parseInt(getProperty(TASK_ID_LIST_LIMIT));
-  }
-
   /**
    * Get whether the current ambari server instance the active instance
    *
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/GroupDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/GroupDAO.java
index e6ec1da52e..1e032a001f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/GroupDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/GroupDAO.java
@@ -17,8 +17,8 @@
  */
 package org.apache.ambari.server.orm.dao;
 
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -30,8 +30,11 @@ import javax.persistence.TypedQuery;
 import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.GroupEntity;
 import org.apache.ambari.server.orm.entities.PrincipalEntity;
+import org.apache.ambari.server.orm.helpers.SQLConstants;
+import org.apache.ambari.server.orm.helpers.SQLOperations;
 import org.apache.ambari.server.security.authorization.GroupType;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -89,12 +92,17 @@ public class GroupDAO {
    */
   @RequiresSession
   public List<GroupEntity> findGroupsByPrincipal(List<PrincipalEntity> principalList) {
-    if (principalList == null || principalList.isEmpty()) {
-      return Collections.emptyList();
-    }
-    TypedQuery<GroupEntity> query = entityManagerProvider.get().createQuery("SELECT grp FROM GroupEntity grp WHERE grp.principal IN :principalList", GroupEntity.class);
-    query.setParameter("principalList", principalList);
-    return daoUtils.selectList(query);
+    TypedQuery<GroupEntity> query = entityManagerProvider.get().createQuery(
+        "SELECT grp FROM GroupEntity grp WHERE grp.principal IN :principalList", GroupEntity.class);
+
+    List<GroupEntity> result = new ArrayList<>();
+    SQLOperations.batch(principalList, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      query.setParameter("principalList", chunk);
+      result.addAll(daoUtils.selectList(query));
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
index 1df6120c99..1d0938b09c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
@@ -20,7 +20,6 @@ package org.apache.ambari.server.orm.dao;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -32,7 +31,6 @@ import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.helpers.SQLConstants;
 import org.apache.ambari.server.orm.helpers.SQLOperations;
-import org.apache.commons.collections.CollectionUtils;
 
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
@@ -130,9 +128,6 @@ public class HostComponentDesiredStateDAO {
 
   @RequiresSession
   public List<HostComponentDesiredStateEntity> findByHostsAndCluster(Collection<Long> hostIds, Long clusterId) {
-    if (CollectionUtils.isEmpty(hostIds)) {
-      return Collections.<HostComponentDesiredStateEntity>emptyList();
-    }
     final EntityManager entityManager = entityManagerProvider.get();
     final TypedQuery<HostComponentDesiredStateEntity> query = entityManager.
         createNamedQuery("HostComponentDesiredStateEntity.findByHostsAndCluster", HostComponentDesiredStateEntity.class);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
index b7352572b1..feac89696c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReadWriteLock;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
@@ -62,6 +63,9 @@ import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity_;
 import org.apache.ambari.server.orm.entities.StageEntity;
+import org.apache.ambari.server.orm.helpers.SQLConstants;
+import org.apache.ambari.server.orm.helpers.SQLOperations;
+import org.apache.commons.collections.CollectionUtils;
 import org.eclipse.persistence.config.HintValues;
 import org.eclipse.persistence.config.QueryHints;
 import org.slf4j.Logger;
@@ -289,27 +293,48 @@ public class HostRoleCommandDAO {
 
   @RequiresSession
   public List<HostRoleCommandEntity> findByPKs(Collection<Long> taskIds) {
-    if (taskIds == null || taskIds.isEmpty()) {
-      return Collections.emptyList();
-    }
-
     TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery(
       "SELECT task FROM HostRoleCommandEntity task WHERE task.taskId IN ?1 " +
         "ORDER BY task.taskId",
       HostRoleCommandEntity.class);
 
-    if (taskIds.size() > configuration.getTaskIdListLimit()) {
-      List<HostRoleCommandEntity> result = new ArrayList<>();
-
-      List<List<Long>> lists = Lists.partition(new ArrayList<>(taskIds), configuration.getTaskIdListLimit());
-      for (List<Long> list : lists) {
-        result.addAll(daoUtils.selectList(query, list));
-      }
+    List<HostRoleCommandEntity> result = new ArrayList<>();
+    SQLOperations.batch(taskIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      result.addAll(daoUtils.selectList(query, chunk));
+      return 0;
+    });
 
-      return result;
-    }
+    return Lists.newArrayList(result);
+  }
 
-    return daoUtils.selectList(query, taskIds);
+  /**
+   * Retrieves minimal host role command columns which are required to calculate stare state.
+   * @param taskIds collection of host role commands to process.
+   * @return minimized host role command entities.
+   */
+  @RequiresSession
+  public List<HostRoleCommandEntity> findStatusRolesByPKs(Collection<Long> taskIds) {
+    TypedQuery<Object[]> query = entityManagerProvider.get().createQuery(
+      "SELECT task.taskId, task.status, task.role FROM HostRoleCommandEntity task WHERE task.taskId IN ?1 " +
+        "ORDER BY task.taskId",
+        Object[].class);
+
+    List<HostRoleCommandEntity> result = new ArrayList<>();
+    SQLOperations.batch(taskIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      List<Object[]> queryResult = daoUtils.selectList(query, chunk);
+      result.addAll(queryResult.stream().map(
+          o -> {
+            HostRoleCommandEntity e = new HostRoleCommandEntity();
+            e.setTaskId((Long) o[0]);
+            e.setStatus(HostRoleStatus.valueOf(o[1].toString()));
+            e.setRole(Role.valueOf(o[2].toString()));
+            return e;
+          }).collect(Collectors.toList()));
+
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   @RequiresSession
@@ -328,7 +353,14 @@ public class HostRoleCommandDAO {
         "SELECT task FROM HostRoleCommandEntity task " +
             "WHERE task.requestId IN ?1 " +
             "ORDER BY task.taskId", HostRoleCommandEntity.class);
-    return daoUtils.selectList(query, requestIds);
+
+    List<HostRoleCommandEntity> result = new ArrayList<>();
+    SQLOperations.batch(requestIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      result.addAll(daoUtils.selectList(query, chunk));
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   @RequiresSession
@@ -347,38 +379,58 @@ public class HostRoleCommandDAO {
         "SELECT task.taskId FROM HostRoleCommandEntity task " +
             "WHERE task.requestId IN ?1 " +
             "ORDER BY task.taskId", Long.class);
-    return daoUtils.selectList(query, requestIds);
+
+    List<Long> result = new ArrayList<>();
+    SQLOperations.batch(requestIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      result.addAll(daoUtils.selectList(query, chunk));
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   @RequiresSession
   public List<HostRoleCommandEntity> findByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
+    if (CollectionUtils.isEmpty(requestIds) || CollectionUtils.isEmpty(taskIds)) {
+      return Collections.<HostRoleCommandEntity>emptyList();
+    }
+
     TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery(
         "SELECT DISTINCT task FROM HostRoleCommandEntity task " +
             "WHERE task.requestId IN ?1 AND task.taskId IN ?2 " +
             "ORDER BY task.taskId", HostRoleCommandEntity.class
     );
-    return daoUtils.selectList(query, requestIds, taskIds);
+
+    return runQueryForVastRequestsAndTaskIds(query, requestIds, taskIds);
   }
 
   @RequiresSession
   public List<Long> findTaskIdsByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
+    if (CollectionUtils.isEmpty(requestIds) || CollectionUtils.isEmpty(taskIds)) {
+      return Collections.<Long>emptyList();
+    }
+
     TypedQuery<Long> query = entityManagerProvider.get().createQuery(
         "SELECT DISTINCT task.taskId FROM HostRoleCommandEntity task " +
             "WHERE task.requestId IN ?1 AND task.taskId IN ?2 " +
             "ORDER BY task.taskId", Long.class
     );
 
-    if (taskIds.size() > configuration.getTaskIdListLimit()) {
-      List<Long> result = new ArrayList<>();
-
-      List<List<Long>> lists = Lists.partition(new ArrayList<>(taskIds), configuration.getTaskIdListLimit());
-      for (List<Long> taskIdList : lists) {
-        result.addAll(daoUtils.selectList(query, requestIds, taskIdList));
-      }
+    return runQueryForVastRequestsAndTaskIds(query, requestIds, taskIds);
+  }
 
-      return result;
-    }
-    return daoUtils.selectList(query, requestIds, taskIds);
+  private <T> List<T> runQueryForVastRequestsAndTaskIds(TypedQuery<T> query, Collection<Long> requestIds, Collection<Long> taskIds) {
+    final int batchSize = SQLConstants.IN_ARGUMENT_MAX_SIZE;
+    final List<T> result = new ArrayList<>();
+    SQLOperations.batch(taskIds, batchSize, (taskChunk, currentTaskBatch, totalTaskBatches, totalTaskSize) -> {
+      SQLOperations.batch(requestIds, batchSize, (requestChunk, currentRequestBatch, totalRequestBatches, totalRequestSize) -> {
+        result.addAll(daoUtils.selectList(query, requestChunk, taskChunk));
+        return 0;
+      });
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   @RequiresSession
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java
index 6c2a48c64e..1be9bfbc1f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java
@@ -227,17 +227,20 @@ public class KerberosKeytabPrincipalDAO {
         }
       }
 
-      Predicate hostIDPredicate = (hostIds.isEmpty()) ? null : root.get("hostId").in(hostIds);
-      Predicate hostNullIDPredicate = (hasNull) ? root.get("hostId").isNull() : null;
+      //split hostIDs into batches and combine them using OR
+      if (CollectionUtils.isNotEmpty(hostIds)) {
+        List<Predicate> hostPredicates = new ArrayList<>();
+        SQLOperations.batch(hostIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+          hostPredicates.add(root.get("hostId").in(chunk));
+          return 0;
+        });
 
-      if (hostIDPredicate != null) {
-        if (hostNullIDPredicate != null) {
-          predicates.add(cb.or(hostIDPredicate, hostNullIDPredicate));
-        } else {
-          predicates.add(hostIDPredicate);
-        }
-      } else if (hostNullIDPredicate != null) {
-        predicates.add(hostNullIDPredicate);
+        Predicate hostCombinedPredicate = cb.or(hostPredicates.toArray(new Predicate[hostPredicates.size()]));
+        predicates.add(hostCombinedPredicate);
+      }
+
+      if (hasNull) {
+        predicates.add(root.get("hostId").isNull());
       }
     }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
index c844ab67da..cd6a1cade9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
@@ -18,7 +18,7 @@
 
 package org.apache.ambari.server.orm.dao;
 
-import java.util.Collections;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -28,7 +28,10 @@ import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.PermissionEntity;
 import org.apache.ambari.server.orm.entities.PrincipalEntity;
 import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
+import org.apache.ambari.server.orm.helpers.SQLConstants;
+import org.apache.ambari.server.orm.helpers.SQLOperations;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -104,12 +107,15 @@ public class PermissionDAO {
    */
   @RequiresSession
   public List<PermissionEntity> findPermissionsByPrincipal(List<PrincipalEntity> principalList) {
-    if (principalList == null || principalList.isEmpty()) {
-      return Collections.emptyList();
-    }
     TypedQuery<PermissionEntity> query = entityManagerProvider.get().createNamedQuery("PermissionEntity.findByPrincipals", PermissionEntity.class);
-    query.setParameter("principalList", principalList);
-    return daoUtils.selectList(query);
+
+    List<PermissionEntity> result = new ArrayList<>();
+    SQLOperations.batch(principalList, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      query.setParameter("principalList", chunk);
+      result.addAll(daoUtils.selectList(query));
+      return 0;
+    });
+    return Lists.newArrayList(result);
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java
index dac684531c..33b898ac29 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java
@@ -18,7 +18,7 @@
 
 package org.apache.ambari.server.orm.dao;
 
-import java.util.Collections;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -29,7 +29,10 @@ import org.apache.ambari.server.orm.entities.PermissionEntity;
 import org.apache.ambari.server.orm.entities.PrincipalEntity;
 import org.apache.ambari.server.orm.entities.PrivilegeEntity;
 import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.helpers.SQLConstants;
+import org.apache.ambari.server.orm.helpers.SQLOperations;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -127,12 +130,17 @@ public class PrivilegeDAO {
    */
   @RequiresSession
   public List<PrivilegeEntity> findAllByPrincipal(List<PrincipalEntity> principalList) {
-    if (principalList == null || principalList.isEmpty()) {
-      return Collections.emptyList();
-    }
-    TypedQuery<PrivilegeEntity> query = entityManagerProvider.get().createQuery("SELECT privilege FROM PrivilegeEntity privilege WHERE privilege.principal IN :principalList", PrivilegeEntity.class);
-    query.setParameter("principalList", principalList);
-    return daoUtils.selectList(query);
+    TypedQuery<PrivilegeEntity> query = entityManagerProvider.get().createQuery(
+        "SELECT privilege FROM PrivilegeEntity privilege WHERE privilege.principal IN :principalList", PrivilegeEntity.class);
+
+    List<PrivilegeEntity> result = new ArrayList<>();
+    SQLOperations.batch(principalList, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      query.setParameter("principalList", chunk);
+      result.addAll(daoUtils.selectList(query));
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RequestDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RequestDAO.java
index 24e2231008..42e5ca669f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RequestDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RequestDAO.java
@@ -19,8 +19,8 @@
 package org.apache.ambari.server.orm.dao;
 
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -48,11 +48,13 @@ import org.apache.ambari.server.orm.entities.TopologyLogicalTaskEntity;
 import org.apache.ambari.server.orm.helpers.SQLConstants;
 import org.apache.ambari.server.orm.helpers.SQLOperations;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.commons.collections.CollectionUtils;
 import org.eclipse.persistence.config.HintValues;
 import org.eclipse.persistence.config.QueryHints;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -122,10 +124,6 @@ public class RequestDAO implements Cleanable {
    */
   @RequiresSession
   public List<RequestEntity> findByPks(Collection<Long> requestIds, boolean refreshHint) {
-    if (null == requestIds || 0 == requestIds.size()) {
-      return Collections.emptyList();
-    }
-
     TypedQuery<RequestEntity> query = entityManagerProvider.get().createQuery("SELECT request FROM RequestEntity request " +
         "WHERE request.requestId IN ?1", RequestEntity.class);
 
@@ -135,7 +133,13 @@ public class RequestDAO implements Cleanable {
       query.setHint(QueryHints.REFRESH, HintValues.TRUE);
     }
 
-    return daoUtils.selectList(query, requestIds);
+    List<RequestEntity> result = new ArrayList<>();
+    SQLOperations.batch(requestIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      result.addAll(daoUtils.selectList(query, chunk));
+      return 0;
+    });
+
+    return Lists.newArrayList(result);
   }
 
   @RequiresSession
@@ -309,7 +313,7 @@ public class RequestDAO implements Cleanable {
                                   String entityQuery, Class<T> type) {
     LOG.info(String.format("Purging %s entity records before date %s", entityName, new Date(beforeDateMillis)));
 
-    if (ids == null || ids.isEmpty()) {
+    if (CollectionUtils.isEmpty(ids)) {
       return 0;
     }
 
@@ -342,7 +346,7 @@ public class RequestDAO implements Cleanable {
                                   String entityQuery, Class<T> type) {
     LOG.info(String.format("Purging %s entity records before date %s", entityName, new Date(beforeDateMillis)));
 
-    if (ids == null || ids.isEmpty()) {
+    if (CollectionUtils.isEmpty(ids)) {
       return 0;
     }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java
index c2919b20d5..f088026100 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java
@@ -44,7 +44,10 @@ import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.orm.entities.StageEntityPK;
 import org.apache.ambari.server.orm.entities.StageEntity_;
+import org.apache.ambari.server.orm.helpers.SQLConstants;
+import org.apache.ambari.server.orm.helpers.SQLOperations;
 import org.apache.ambari.server.utils.StageUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.eclipse.persistence.config.HintValues;
 import org.eclipse.persistence.config.QueryHints;
 
@@ -173,16 +176,20 @@ public class StageDAO {
   @RequiresSession
   public Map<Long, String> findRequestContext(List<Long> requestIds) {
     Map<Long, String> resultMap = new HashMap<>();
-    if (requestIds != null && !requestIds.isEmpty()) {
+    if (CollectionUtils.isNotEmpty(requestIds)) {
       TypedQuery<StageEntity> query = entityManagerProvider.get()
         .createQuery("SELECT stage FROM StageEntity stage WHERE " +
           "stage.requestId IN (SELECT DISTINCT s.requestId FROM StageEntity s " +
           "WHERE s.requestId IN ?1)", StageEntity.class);
-      List<StageEntity> result = daoUtils.selectList(query, requestIds);
-      if (result != null && !result.isEmpty()) {
-        for (StageEntity entity : result) {
-          resultMap.put(entity.getRequestId(), entity.getRequestContext());
-        }
+
+      List<StageEntity> result = new ArrayList<>();
+      SQLOperations.batch(requestIds, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+        result.addAll(daoUtils.selectList(query, chunk));
+        return 0;
+      });
+
+      for (StageEntity entity : result) {
+        resultMap.put(entity.getRequestId(), entity.getRequestContext());
       }
     }
     return resultMap;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/UserDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/UserDAO.java
index bbddb90928..4d1e79f438 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/UserDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/UserDAO.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.orm.dao;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -29,7 +30,10 @@ import javax.persistence.TypedQuery;
 import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.PrincipalEntity;
 import org.apache.ambari.server.orm.entities.UserEntity;
+import org.apache.ambari.server.orm.helpers.SQLConstants;
+import org.apache.ambari.server.orm.helpers.SQLOperations;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -73,12 +77,16 @@ public class UserDAO {
    */
   @RequiresSession
   public List<UserEntity> findUsersByPrincipal(List<PrincipalEntity> principalList) {
-    if (principalList == null || principalList.isEmpty()) {
-      return Collections.emptyList();
-    }
-    TypedQuery<UserEntity> query = entityManagerProvider.get().createQuery("SELECT user_entity FROM UserEntity user_entity WHERE user_entity.principal IN :principalList", UserEntity.class);
-    query.setParameter("principalList", principalList);
-    return daoUtils.selectList(query);
+    TypedQuery<UserEntity> query = entityManagerProvider.get().createQuery(
+        "SELECT user_entity FROM UserEntity user_entity WHERE user_entity.principal IN :principalList", UserEntity.class);
+
+    List<UserEntity> result = new ArrayList<>();
+    SQLOperations.batch(principalList, SQLConstants.IN_ARGUMENT_MAX_SIZE, (chunk, currentBatch, totalBatches, totalSize) -> {
+      query.setParameter("principalList", chunk);
+      result.addAll(daoUtils.selectList(query));
+      return 0;
+    });
+    return Lists.newArrayList(result);
   }
 
   /**


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ambari.apache.org
For additional commands, e-mail: commits-help@ambari.apache.org