commit b61e6bd3da2638a0d8cf9b9e893df239b1664671 Author: nspiegelberg Date: 58 seconds ago HBASE-4769 Abort RegionServer Immediately on OOME diff --git a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index e01f89f..3096510 100644 --- a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -1088,7 +1088,7 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, } /* - * Check if an OOME and if so, call abort. + * Check if an OOME and, if so, abort immediately to avoid creating more objects. * * @param e * @@ -1096,12 +1096,19 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, */ public boolean checkOOME(final Throwable e) { boolean stop = false; - if (e instanceof OutOfMemoryError - || (e.getCause() != null && e.getCause() instanceof OutOfMemoryError) - || (e.getMessage() != null && e.getMessage().contains( - "java.lang.OutOfMemoryError"))) { - abort("OutOfMemoryError, aborting", e); - stop = true; + try { + if (e instanceof OutOfMemoryError + || (e.getCause() != null && e.getCause() instanceof OutOfMemoryError) + || (e.getMessage() != null && e.getMessage().contains( + "java.lang.OutOfMemoryError"))) { + stop = true; + LOG.fatal( + "Run out of memory; HRegionServer will abort itself immediately", e); + } + } finally { + if (stop) { + this.forceAbort(); + } } return stop; } @@ -1630,6 +1637,14 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, abort(reason, null); } + /** + * when the region server run out of memory, it needs to abort itseft quickly + * and avoid creating more objects. + */ + public void forceAbort() { + Runtime.getRuntime().halt(1); + } + public boolean isAborted() { return this.abortRequested; }