[
https://issues.apache.org/jira/browse/HBASE-14598?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ian Friedman updated HBASE-14598:
---------------------------------
Description:
We noticed that in returning a Scan against a region containing particularly
large (wide) rows that it is possible during ByteBufferOutputStream.
checkSizeAndGrow() to attempt to create a new ByteBuffer larger than the JVM
allows which then throws a OutOfMemoryError. The code currently caps it at
Integer.MAX_VALUE which is actually larger than the JVM allows. This lead to us
dealing with cascading region server death as the RegionServer hosting the
region died, opened on a new server, the client retried the scan, and the new
RS died as well.
I believe ByteBufferOutputStream should not try to create ByteBuffers that
large and instead throw an exception back up if it needs to grow any bigger.
The limit should probably be something like Integer.MAX_VALUE-8, as that is
what ArrayList uses. ref:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/ArrayList.java#221
was:
We noticed that in returning a Scan against a region containing particularly
large (wide) rows that it is possible during ByteBufferOutputStream.
checkSizeAndGrow() to attempt to create a new ByteBuffer larger than the JVM
allows (which I believe is Integer.MAX_VALUE), which then throws a
OutOfMemoryError. This lead to us dealing with cascading region server death as
the RegionServer hosting the region died, opened on a new server, the client
retried the scan, and the new RS died as well.
I believe ByteBufferOutputStream should not try to create ByteBuffers that
large and instead throw an exception back up. The limit should probably be
something like Integer.MAX_VALUE-8, as that is what ArrayList uses. ref:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/ArrayList.java#221
> ByteBufferOutputStream grows its HeapByteBuffer beyond JVM limitations
> ----------------------------------------------------------------------
>
> Key: HBASE-14598
> URL: https://issues.apache.org/jira/browse/HBASE-14598
> Project: HBase
> Issue Type: Bug
> Affects Versions: 0.98.12
> Reporter: Ian Friedman
> Assignee: Ian Friedman
>
> We noticed that in returning a Scan against a region containing particularly
> large (wide) rows that it is possible during ByteBufferOutputStream.
> checkSizeAndGrow() to attempt to create a new ByteBuffer larger than the JVM
> allows which then throws a OutOfMemoryError. The code currently caps it at
> Integer.MAX_VALUE which is actually larger than the JVM allows. This lead to
> us dealing with cascading region server death as the RegionServer hosting the
> region died, opened on a new server, the client retried the scan, and the new
> RS died as well.
> I believe ByteBufferOutputStream should not try to create ByteBuffers that
> large and instead throw an exception back up if it needs to grow any bigger.
> The limit should probably be something like Integer.MAX_VALUE-8, as that is
> what ArrayList uses. ref:
> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/ArrayList.java#221
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)