From 8f195387a4a4a5a278119bf4c2f15cad61f0e2c7 Mon Sep 17 00:00:00 2001 From: Rohith Sharma K S Date: Fri, 9 Oct 2015 10:09:26 +0530 Subject: [PATCH] YARN-4235. FairScheduler PrimaryGroup does not handle empty groups returned for a user. (Anubhav Dhoot via rohithsharmaks) --- hadoop-yarn-project/CHANGES.txt | 3 +++ .../scheduler/fair/QueuePlacementRule.java | 6 +++++- .../fair/TestQueuePlacementPolicy.java | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index b4801bc7d2..189ae8f77a 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -912,6 +912,9 @@ Release 2.8.0 - UNRELEASED YARN-4228. FileSystemRMStateStore use IOUtils#close instead of fs#close. (Bibin A Chundatt via rohithsharmaks) + YARN-4235. FairScheduler PrimaryGroup does not handle empty groups returned + for a user. (Anubhav Dhoot via rohithsharmaks) + Release 2.7.2 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java index f2e32e6860..2c4add4e25 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java @@ -146,7 +146,11 @@ public static class PrimaryGroup extends QueuePlacementRule { protected String getQueueForApp(String requestedQueue, String user, Groups groups, Map> configuredQueues) throws IOException { - return "root." + cleanName(groups.getGroups(user).get(0)); + final List groupList = groups.getGroups(user); + if (groupList.isEmpty()) { + throw new IOException("No groups returned for user " + user); + } + return "root." + cleanName(groupList.get(0)); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java index 32dba5cdd4..0dbc99be7b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java @@ -19,8 +19,11 @@ import static org.junit.Assert.*; +import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -393,6 +396,21 @@ public void testGroupContainsPeriod() throws Exception { SimpleGroupsMapping.class, GroupMappingServiceProvider.class); } + @Test(expected=IOException.class) + public void testEmptyGroupsPrimaryGroupRule() throws Exception { + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + + // Add a static mapping that returns empty groups for users + conf.setStrings(CommonConfigurationKeys + .HADOOP_USER_GROUP_STATIC_OVERRIDES, "emptygroupuser="); + QueuePlacementPolicy policy = parse(sb.toString()); + policy.assignAppToQueue(null, "emptygroupuser"); + } + private QueuePlacementPolicy parse(String str) throws Exception { // Read and parse the allocations file. DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory