[NO ISSUE][RT] Remove Hard Memory Limit in ByteArrayAccessibleOutputStream
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Remove the hardcoded 64MB memory limit from
ByteArrayAccessibleOutputStream as the limit
shouldn't be controlled by this structure but
rather by operators using it.
Change-Id: Ia88861c44802e64dbfceb5e8efc75d28bd54b501
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2073
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
index bf0e1dd..1a806cd 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
@@ -23,8 +23,7 @@
public class ByteArrayAccessibleOutputStream extends ByteArrayOutputStream {
- private static final int MAX_SIZE = 1024 * 1024 * 32;
- private static final double BUFFER_INCREMENT_FACTOR = 1.5;
+ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE;
public ByteArrayAccessibleOutputStream() {
super();
@@ -97,22 +96,24 @@
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = buf.length;
- if (oldCapacity == MAX_SIZE) {
- throw new IllegalArgumentException("Buffer is too large...");
- }
- int newCapacity = Math.min((int) (oldCapacity * BUFFER_INCREMENT_FACTOR), MAX_SIZE);
+ // increase by a factor of 1.5
+ int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
- if (newCapacity < 0) {
- if (minCapacity < 0) {
- throw new OutOfMemoryError();
- }
- newCapacity = Integer.MAX_VALUE;
+ if (newCapacity - MAX_ARRAY_SIZE > 0) {
+ newCapacity = hugeCapacity(minCapacity);
}
buf = Arrays.copyOf(buf, newCapacity);
}
+ private static int hugeCapacity(int minCapacity) {
+ if (minCapacity < 0) { // overflow
+ throw new RuntimeException("Memory allocation limit (" + MAX_ARRAY_SIZE + " bytes) exceeded");
+ }
+ return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
+ }
+
/**
* Return the current length of this stream (not capacity).
*/