You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by ja...@apache.org on 2015/05/16 03:38:41 UTC

[2/7] drill git commit: DRILL-3110: Coerce Java's Direct OutOfMemoryErrors to look like reservation failures to follow existing Drill behavior paths.

DRILL-3110: Coerce Java's Direct OutOfMemoryErrors to look like reservation failures to follow existing Drill behavior paths.


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

Branch: refs/heads/master
Commit: 30f589204aeae2568a58efe595b5e516f4cddfed
Parents: dd35b27
Author: Jacques Nadeau <ja...@apache.org>
Authored: Fri May 15 16:50:01 2015 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Fri May 15 17:37:28 2015 -0700

----------------------------------------------------------------------
 .../org/apache/drill/exec/memory/Accountor.java |  4 +++
 .../drill/exec/memory/TopLevelAllocator.java    | 35 +++++++++++++++-----
 2 files changed, 31 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/30f58920/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
index eb932ad..ad6a787 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java
@@ -197,6 +197,10 @@ public class Accountor {
     }
   }
 
+  void release(long size) {
+    remainder.returnAllocation(size);
+  }
+
   public void release(DrillBuf buf, long size) {
     remainder.returnAllocation(size);
     if (ENABLE_ACCOUNTING) {

http://git-wip-us.apache.org/repos/asf/drill/blob/30f58920/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
index f6a37e7..e2d5b18 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java
@@ -95,10 +95,20 @@ public class TopLevelAllocator implements BufferAllocator {
     if(!acct.reserve(min)) {
       return null;
     }
-    UnsafeDirectLittleEndian buffer = innerAllocator.directBuffer(min, max);
-    DrillBuf wrapped = new DrillBuf(this, acct, buffer);
-    acct.reserved(min, wrapped);
-    return wrapped;
+
+    try {
+      UnsafeDirectLittleEndian buffer = innerAllocator.directBuffer(min, max);
+      DrillBuf wrapped = new DrillBuf(this, acct, buffer);
+      acct.reserved(min, wrapped);
+      return wrapped;
+    } catch (OutOfMemoryError e) {
+      if ("Direct buffer memory".equals(e.getMessage())) {
+        acct.release(min);
+        return null;
+      } else {
+        throw e;
+      }
+    }
   }
 
   @Override
@@ -244,10 +254,19 @@ public class TopLevelAllocator implements BufferAllocator {
         return null;
       }
 
-      UnsafeDirectLittleEndian buffer = innerAllocator.directBuffer(size, max);
-      DrillBuf wrapped = new DrillBuf(this, childAcct, buffer);
-      childAcct.reserved(buffer.capacity(), wrapped);
-      return wrapped;
+      try {
+        UnsafeDirectLittleEndian buffer = innerAllocator.directBuffer(size, max);
+        DrillBuf wrapped = new DrillBuf(this, childAcct, buffer);
+        childAcct.reserved(buffer.capacity(), wrapped);
+        return wrapped;
+      } catch (OutOfMemoryError e) {
+        if ("Direct buffer memory".equals(e.getMessage())) {
+          childAcct.release(size);
+          return null;
+        } else {
+          throw e;
+        }
+      }
     }
 
     public DrillBuf buffer(int size) {