Skip to content

Commit 7c15c5d

Browse files
HIVE-27647: NullPointerException in LowLevelCacheImpl#putFileData when maxAlloc = chunkLength
1 parent 1105c25 commit 7c15c5d

File tree

4 files changed

+101
-11
lines changed

4 files changed

+101
-11
lines changed

itests/src/test/resources/testconfiguration.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ minillap.query.files=\
111111
intersect_distinct.q,\
112112
intersect_merge.q,\
113113
limit_bailout.q,\
114+
llap_io_cache.q,\
114115
llap_nullscan.q,\
115116
llap_stats.q,\
116117
llap_udf.q,\

ql/src/java/org/apache/hadoop/hive/llap/LlapCacheAwareFs.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,10 @@ public DiskRangeList createCacheChunk(
283283
int chunkPartCount = largeBufCount + ((smallSize > 0) ? 1 : 0);
284284
DiskRange[] cacheRanges = new DiskRange[chunkPartCount];
285285
int extraOffsetInChunk = 0;
286-
if (maxAlloc < chunkLength) {
286+
newCacheData = new MemoryBuffer[chunkPartCount];
287+
int index = 0;
288+
289+
if (largeBufCount > 0) {
287290
largeBuffers = new MemoryBuffer[largeBufCount];
288291
// Note: we don't use StoppableAllocator here - this is not on an IO thread.
289292
allocator.allocateMultiple(largeBuffers, maxAlloc, cache.getDataBufferFactory());
@@ -298,8 +301,10 @@ public DiskRangeList createCacheChunk(
298301
extraDiskDataOffset += remaining;
299302
extraOffsetInChunk += remaining;
300303
}
304+
for (MemoryBuffer buf : largeBuffers) {
305+
newCacheData[index++] = buf;
306+
}
301307
}
302-
newCacheData = largeBuffers;
303308
largeBuffers = null;
304309
if (smallSize > 0) {
305310
smallBuffer = new MemoryBuffer[1];
@@ -311,15 +316,7 @@ public DiskRangeList createCacheChunk(
311316
smallSize, bb, cacheRanges, largeBufCount, chunkFrom + extraOffsetInChunk);
312317
extraDiskDataOffset += smallSize;
313318
extraOffsetInChunk += smallSize; // Not strictly necessary, no one will look at it.
314-
if (newCacheData == null) {
315-
newCacheData = smallBuffer;
316-
} else {
317-
// TODO: add allocate overload with an offset and length
318-
MemoryBuffer[] combinedCacheData = new MemoryBuffer[largeBufCount + 1];
319-
System.arraycopy(newCacheData, 0, combinedCacheData, 0, largeBufCount);
320-
newCacheData = combinedCacheData;
321-
newCacheData[largeBufCount] = smallBuffer[0];
322-
}
319+
newCacheData[index] = smallBuffer[0];
323320
smallBuffer = null;
324321
}
325322
cache.putFileData(fileKey, cacheRanges, newCacheData, 0, tag);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
set hive.llap.io.enabled=true;
2+
set hive.llap.io.memory.mode=cache;
3+
set hive.llap.io.allocator.alloc.max=16Mb;
4+
set hive.vectorized.execution.enabled=true;
5+
6+
DROP TABLE IF EXISTS tbl_parq;
7+
8+
CREATE TABLE tbl_parq (
9+
id INT,
10+
payload STRING
11+
)
12+
STORED AS PARQUET
13+
TBLPROPERTIES (
14+
'parquet.block.size'='16777216',
15+
'parquet.page.size'='16777216',
16+
'parquet.compression'='UNCOMPRESSED'
17+
);
18+
19+
INSERT INTO TABLE tbl_parq
20+
SELECT
21+
1 AS id,
22+
RPAD('x', 16777177, 'x') AS payload;
23+
24+
SELECT LENGTH(payload) FROM tbl_parq;
25+
26+
SELECT SUM(LENGTH(payload)) FROM tbl_parq;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
PREHOOK: query: DROP TABLE IF EXISTS tbl_parq
2+
PREHOOK: type: DROPTABLE
3+
PREHOOK: Output: database:default
4+
POSTHOOK: query: DROP TABLE IF EXISTS tbl_parq
5+
POSTHOOK: type: DROPTABLE
6+
POSTHOOK: Output: database:default
7+
PREHOOK: query: CREATE TABLE tbl_parq (
8+
id INT,
9+
payload STRING
10+
)
11+
STORED AS PARQUET
12+
TBLPROPERTIES (
13+
'parquet.block.size'='16777216',
14+
'parquet.page.size'='16777216',
15+
'parquet.compression'='UNCOMPRESSED'
16+
)
17+
PREHOOK: type: CREATETABLE
18+
PREHOOK: Output: database:default
19+
PREHOOK: Output: default@tbl_parq
20+
POSTHOOK: query: CREATE TABLE tbl_parq (
21+
id INT,
22+
payload STRING
23+
)
24+
STORED AS PARQUET
25+
TBLPROPERTIES (
26+
'parquet.block.size'='16777216',
27+
'parquet.page.size'='16777216',
28+
'parquet.compression'='UNCOMPRESSED'
29+
)
30+
POSTHOOK: type: CREATETABLE
31+
POSTHOOK: Output: database:default
32+
POSTHOOK: Output: default@tbl_parq
33+
PREHOOK: query: INSERT INTO TABLE tbl_parq
34+
SELECT
35+
1 AS id,
36+
RPAD('x', 16777177, 'x') AS payload
37+
PREHOOK: type: QUERY
38+
PREHOOK: Input: _dummy_database@_dummy_table
39+
PREHOOK: Output: default@tbl_parq
40+
POSTHOOK: query: INSERT INTO TABLE tbl_parq
41+
SELECT
42+
1 AS id,
43+
RPAD('x', 16777177, 'x') AS payload
44+
POSTHOOK: type: QUERY
45+
POSTHOOK: Input: _dummy_database@_dummy_table
46+
POSTHOOK: Output: default@tbl_parq
47+
POSTHOOK: Lineage: tbl_parq.id SIMPLE []
48+
POSTHOOK: Lineage: tbl_parq.payload SIMPLE []
49+
PREHOOK: query: SELECT LENGTH(payload) FROM tbl_parq
50+
PREHOOK: type: QUERY
51+
PREHOOK: Input: default@tbl_parq
52+
PREHOOK: Output: hdfs://### HDFS PATH ###
53+
POSTHOOK: query: SELECT LENGTH(payload) FROM tbl_parq
54+
POSTHOOK: type: QUERY
55+
POSTHOOK: Input: default@tbl_parq
56+
POSTHOOK: Output: hdfs://### HDFS PATH ###
57+
16777177
58+
PREHOOK: query: SELECT SUM(LENGTH(payload)) FROM tbl_parq
59+
PREHOOK: type: QUERY
60+
PREHOOK: Input: default@tbl_parq
61+
PREHOOK: Output: hdfs://### HDFS PATH ###
62+
POSTHOOK: query: SELECT SUM(LENGTH(payload)) FROM tbl_parq
63+
POSTHOOK: type: QUERY
64+
POSTHOOK: Input: default@tbl_parq
65+
POSTHOOK: Output: hdfs://### HDFS PATH ###
66+
16777177

0 commit comments

Comments
 (0)