Repository: hive
Updated Branches:
  refs/heads/master 96f2dc723 -> f41d693b5


HIVE-13653 : improve config error messages for LLAP cache size/etc (Sergey 
Shelukhin, reviewed by Prasanth Jayachandran)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/f41d693b
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/f41d693b
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/f41d693b

Branch: refs/heads/master
Commit: f41d693b5b984ea55b01394af0dbb6c7121db90a
Parents: 96f2dc7
Author: Sergey Shelukhin <ser...@apache.org>
Authored: Thu May 5 10:41:47 2016 -0700
Committer: Sergey Shelukhin <ser...@apache.org>
Committed: Thu May 5 10:41:47 2016 -0700

----------------------------------------------------------------------
 .../hadoop/hive/llap/cache/BuddyAllocator.java  | 43 +++++++++++++++-----
 1 file changed, 32 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/f41d693b/llap-server/src/java/org/apache/hadoop/hive/llap/cache/BuddyAllocator.java
----------------------------------------------------------------------
diff --git 
a/llap-server/src/java/org/apache/hadoop/hive/llap/cache/BuddyAllocator.java 
b/llap-server/src/java/org/apache/hadoop/hive/llap/cache/BuddyAllocator.java
index d78c1e0..1d5a7db 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/cache/BuddyAllocator.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/cache/BuddyAllocator.java
@@ -44,6 +44,8 @@ public final class BuddyAllocator implements 
EvictionAwareAllocator, BuddyAlloca
   // We don't know the acceptable size for Java array, so we'll use 1Gb 
boundary.
   // That is guaranteed to fit any maximum allocation.
   private static final int MAX_ARENA_SIZE = 1024*1024*1024;
+  // Don't try to operate with less than MIN_SIZE allocator space, it will 
just give you grief.
+  private static final int MIN_TOTAL_MEMORY_SIZE = 64*1024*1024;
 
 
   public BuddyAllocator(Configuration conf, MemoryManager mm, 
LlapDaemonCacheMetrics metrics) {
@@ -51,8 +53,19 @@ public final class BuddyAllocator implements 
EvictionAwareAllocator, BuddyAlloca
         (int)HiveConf.getSizeVar(conf, ConfVars.LLAP_ALLOCATOR_MIN_ALLOC),
         (int)HiveConf.getSizeVar(conf, ConfVars.LLAP_ALLOCATOR_MAX_ALLOC),
         HiveConf.getIntVar(conf, ConfVars.LLAP_ALLOCATOR_ARENA_COUNT),
-        HiveConf.getSizeVar(conf, ConfVars.LLAP_IO_MEMORY_MAX_SIZE),
-        mm, metrics);
+        getMaxTotalMemorySize(conf), mm, metrics);
+  }
+
+  private static long getMaxTotalMemorySize(Configuration conf) {
+    long maxSize = HiveConf.getSizeVar(conf, ConfVars.LLAP_IO_MEMORY_MAX_SIZE);
+    if (maxSize > MIN_TOTAL_MEMORY_SIZE || HiveConf.getBoolVar(conf, 
ConfVars.HIVE_IN_TEST)) {
+      return maxSize;
+    }
+    throw new RuntimeException("Allocator space is too small for reasonable 
operation; "
+        + ConfVars.LLAP_IO_MEMORY_MAX_SIZE.varname + "=" + maxSize + ", but at 
least "
+        + MIN_TOTAL_MEMORY_SIZE + " is required. If you cannot spare any 
memory, you can "
+        + "disable LLAP IO entirely via " + ConfVars.LLAP_IO_ENABLED.varname + 
"; or set "
+        + ConfVars.LLAP_IO_MEMORY_MODE.varname + " to 'none'");
   }
 
   @VisibleForTesting
@@ -69,16 +82,19 @@ public final class BuddyAllocator implements 
EvictionAwareAllocator, BuddyAlloca
           + ", arena size " + arenaSizeVal + ". total size " + maxSizeVal);
     }
 
+    String minName = ConfVars.LLAP_ALLOCATOR_MIN_ALLOC.varname,
+        maxName = ConfVars.LLAP_ALLOCATOR_MAX_ALLOC.varname;
     if (minAllocation < 8) {
-      throw new AssertionError("Min allocation must be at least 8 bytes: " + 
minAllocation);
+      throw new RuntimeException(minName + " must be at least 8 bytes: " + 
minAllocation);
     }
-    if (maxSizeVal < arenaSizeVal || maxAllocation < minAllocation) {
-      throw new AssertionError("Inconsistent sizes of cache, arena and 
allocations: "
-          + minAllocation + ", " + maxAllocation + ", " + arenaSizeVal + ", " 
+ maxSizeVal);
+    if (maxSizeVal < maxAllocation || maxAllocation < minAllocation) {
+      throw new RuntimeException("Inconsistent sizes; expecting " + minName + 
" <= " + maxName
+          + " <= " + ConfVars.LLAP_IO_MEMORY_MAX_SIZE.varname + "; configured 
with min="
+          + minAllocation + ", max=" + maxAllocation + " and total=" + 
maxSizeVal);
     }
     if ((Integer.bitCount(minAllocation) != 1) || 
(Integer.bitCount(maxAllocation) != 1)) {
-      throw new AssertionError("Allocation sizes must be powers of two: "
-          + minAllocation + ", " + maxAllocation);
+      throw new RuntimeException("Allocation sizes must be powers of two; 
configured with "
+          + minName + "=" + minAllocation + ", " + maxName + "=" + 
maxAllocation);
     }
     if ((arenaSizeVal % maxAllocation) > 0) {
       long oldArenaSize = arenaSizeVal;
@@ -94,8 +110,8 @@ public final class BuddyAllocator implements 
EvictionAwareAllocator, BuddyAlloca
           + " to be divisible by arena size " + arenaSize);
     }
     if ((maxSizeVal / arenaSize) > Integer.MAX_VALUE) {
-      throw new AssertionError(
-          "Too many arenas needed to allocate the cache: " + arenaSize + "," + 
maxSizeVal);
+      throw new RuntimeException(
+          "Too many arenas needed to allocate the cache: " + arenaSize + ", " 
+ maxSizeVal);
     }
     maxSize = maxSizeVal;
     memoryManager.updateMaxSize(maxSize);
@@ -280,7 +296,12 @@ public final class BuddyAllocator implements 
EvictionAwareAllocator, BuddyAlloca
     private FreeList[] freeLists;
 
     void init() {
-      data = isDirect ? ByteBuffer.allocateDirect(arenaSize) : 
ByteBuffer.allocate(arenaSize);
+      try {
+        data = isDirect ? ByteBuffer.allocateDirect(arenaSize) : 
ByteBuffer.allocate(arenaSize);
+      } catch (OutOfMemoryError oom) {
+        throw new OutOfMemoryError("Cannot allocate " + arenaSize + " bytes: " 
+ oom.getMessage()
+            + "; make sure your xmx and process size are set correctly.");
+      }
       int maxMinAllocs = 1 << (arenaSizeLog2 - minAllocLog2);
       headers = new byte[maxMinAllocs];
       int allocLog2Diff = maxAllocLog2 - minAllocLog2, freeListCount = 
allocLog2Diff + 1;

Reply via email to