You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2011/02/28 20:11:42 UTC

svn commit: r1075490 - in /hbase/branches/0.90: CHANGES.txt src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java

Author: rawson
Date: Mon Feb 28 19:11:42 2011
New Revision: 1075490

URL: http://svn.apache.org/viewvc?rev=1075490&view=rev
Log:
HBASE-3572  memstore lab can leave half inited data structs

Modified:
    hbase/branches/0.90/CHANGES.txt
    hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java

Modified: hbase/branches/0.90/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.90/CHANGES.txt?rev=1075490&r1=1075489&r2=1075490&view=diff
==============================================================================
--- hbase/branches/0.90/CHANGES.txt (original)
+++ hbase/branches/0.90/CHANGES.txt Mon Feb 28 19:11:42 2011
@@ -10,6 +10,7 @@ Release 0.90.2 - February 9th, 2011
    HBASE-3566  writeToWAL is not serialized for increment operation
    HBASE-3576  MasterAddressTracker is registered to ZooKeeperWatcher twice
    HBASE-3561  OPTS arguments are duplicated
+   HBASE-3572  memstore lab can leave half inited data structs (bad!)
   
   IMPROVEMENTS
    HBASE-3542  MultiGet methods in Thrift

Modified: hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java?rev=1075490&r1=1075489&r2=1075490&view=diff
==============================================================================
--- hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java (original)
+++ hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java Mon Feb 28 19:11:42 2011
@@ -154,6 +154,7 @@ public class MemStoreLAB {
     private byte[] data;
 
     private static final int UNINITIALIZED = -1;
+    private static final int OOM = -2;
     /**
      * Offset for the next allocation, or the sentinel value -1
      * which implies that the chunk is still uninitialized.
@@ -182,7 +183,13 @@ public class MemStoreLAB {
      */
     public void init() {
       assert nextFreeOffset.get() == UNINITIALIZED;
-      data = new byte[size];
+      try {
+        data = new byte[size];
+      } catch (OutOfMemoryError e) {
+        boolean failInit = nextFreeOffset.compareAndSet(UNINITIALIZED, OOM);
+        assert failInit; // should be true.
+        throw e;
+      }
       // Mark that it's ready for use
       boolean initted = nextFreeOffset.compareAndSet(
           UNINITIALIZED, 0);
@@ -207,6 +214,10 @@ public class MemStoreLAB {
           Thread.yield();
           continue;
         }
+        if (oldOffset == OOM) {
+          // doh we ran out of ram. return -1 to chuck this away.
+          return -1;
+        }
 
         if (oldOffset + size > data.length) {
           return -1; // alloc doesn't fit