aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala40
1 files changed, 40 insertions, 0 deletions
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala
index c1555114e8..6cf18de0cc 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala
@@ -342,4 +342,44 @@ class UnsafeFixedWidthAggregationMapSuite
}
}
+ testWithMemoryLeakDetection("convert to external sorter after fail to grow (SPARK-19500)") {
+ val pageSize = 4096000
+ val map = new UnsafeFixedWidthAggregationMap(
+ emptyAggregationBuffer,
+ aggBufferSchema,
+ groupKeySchema,
+ taskMemoryManager,
+ 128, // initial capacity
+ pageSize,
+ false // disable perf metrics
+ )
+
+ val rand = new Random(42)
+ for (i <- 1 to 63) {
+ val str = rand.nextString(1024)
+ val buf = map.getAggregationBuffer(InternalRow(UTF8String.fromString(str)))
+ buf.setInt(0, str.length)
+ }
+ // Simulate running out of space
+ memoryManager.limit(0)
+ var str = rand.nextString(1024)
+ var buf = map.getAggregationBuffer(InternalRow(UTF8String.fromString(str)))
+ assert(buf != null)
+ str = rand.nextString(1024)
+ buf = map.getAggregationBuffer(InternalRow(UTF8String.fromString(str)))
+ assert(buf == null)
+
+ // Convert the map into a sorter. This used to fail before the fix for SPARK-10474
+ // because we would try to acquire space for the in-memory sorter pointer array before
+ // actually releasing the pages despite having spilled all of them.
+ var sorter: UnsafeKVExternalSorter = null
+ try {
+ sorter = map.destructAndCreateExternalSorter()
+ map.free()
+ } finally {
+ if (sorter != null) {
+ sorter.cleanupResources()
+ }
+ }
+ }
}