Skip to content

Commit f0b1d26

Browse files
rymarmjnturton
authored andcommitted
DRILL-8495: Tried to remove unmanaged buffer (#2913)
1 parent 13b494a commit f0b1d26

File tree

5 files changed

+56
-13
lines changed

5 files changed

+56
-13
lines changed

contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/readers/HiveDefaultRecordReader.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public class HiveDefaultRecordReader extends AbstractRecordReader {
168168
protected boolean empty;
169169

170170
/**
171-
* Buffer used for population of partition vectors and to fill in data into vectors via writers
171+
* Buffer used for population of partition vectors
172172
*/
173173
private final DrillBuf drillBuf;
174174

@@ -238,7 +238,7 @@ public HiveDefaultRecordReader(HiveTableWithColumnCache table, HivePartition par
238238
this.proxyUserGroupInfo = proxyUgi;
239239
this.empty = inputSplits == null || inputSplits.isEmpty();
240240
this.inputSplitsIterator = empty ? Collections.emptyIterator() : inputSplits.iterator();
241-
this.drillBuf = context.getManagedBuffer().reallocIfNeeded(256);
241+
this.drillBuf = context.getManagedBuffer();
242242
this.partitionVectors = new ValueVector[0];
243243
this.partitionValues = new Object[0];
244244
setColumns(projectedColumns);
@@ -333,7 +333,7 @@ private Callable<Void> getInitTask(OutputMutator output) {
333333
this.selectedStructFieldRefs = new StructField[selectedColumnNames.size()];
334334
this.columnValueWriters = new HiveValueWriter[selectedColumnNames.size()];
335335
this.outputWriter = new VectorContainerWriter(output, /*enabled union*/ false);
336-
HiveValueWriterFactory hiveColumnValueWriterFactory = new HiveValueWriterFactory(drillBuf, outputWriter.getWriter());
336+
HiveValueWriterFactory hiveColumnValueWriterFactory = new HiveValueWriterFactory(fragmentContext.getManagedBufferManager(), outputWriter.getWriter());
337337
for (int refIdx = 0; refIdx < selectedStructFieldRefs.length; refIdx++) {
338338
String columnName = selectedColumnNames.get(refIdx);
339339
StructField fieldRef = finalObjInspector.getStructFieldRef(columnName);

contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/writers/HiveValueWriterFactory.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
import java.util.function.BiFunction;
2222
import java.util.function.Function;
2323

24-
import io.netty.buffer.DrillBuf;
2524
import org.apache.drill.common.exceptions.UserException;
25+
import org.apache.drill.exec.ops.BufferManager;
2626
import org.apache.drill.exec.store.hive.writers.complex.HiveListWriter;
2727
import org.apache.drill.exec.store.hive.writers.complex.HiveMapWriter;
2828
import org.apache.drill.exec.store.hive.writers.complex.HiveStructWriter;
@@ -97,18 +97,18 @@ public final class HiveValueWriterFactory {
9797
private static final Logger logger = LoggerFactory.getLogger(HiveValueWriterFactory.class);
9898

9999
/**
100-
* Buffer shared across created Hive writers. May be used by writer for reading data
101-
* to buffer than from buffer to vector.
100+
* Buffer manager used to create buffers for Hive writers for reading data
101+
* to buffer than from buffer to vector if needed.
102102
*/
103-
private final DrillBuf drillBuf;
103+
private final BufferManager bufferManager;
104104

105105
/**
106106
* Used to manage and create column writers.
107107
*/
108108
private final SingleMapWriter rootWriter;
109109

110-
public HiveValueWriterFactory(DrillBuf drillBuf, SingleMapWriter rootWriter) {
111-
this.drillBuf = drillBuf;
110+
public HiveValueWriterFactory(BufferManager bufferManager, SingleMapWriter rootWriter) {
111+
this.bufferManager = bufferManager;
112112
this.rootWriter = rootWriter;
113113
}
114114

@@ -200,7 +200,7 @@ private HiveValueWriter createPrimitiveHiveValueWriter(String name, PrimitiveTyp
200200
case BINARY: {
201201
VarBinaryWriter writer = extractWriter(name, parentWriter,
202202
MapWriter::varBinary, ListWriter::varBinary, UnionVectorWriter::varBinary);
203-
return new HiveBinaryWriter((BinaryObjectInspector) inspector, writer, drillBuf);
203+
return new HiveBinaryWriter((BinaryObjectInspector) inspector, writer, bufferManager.getManagedBuffer());
204204
}
205205
case BOOLEAN: {
206206
BitWriter writer = extractWriter(name, parentWriter,
@@ -240,12 +240,12 @@ private HiveValueWriter createPrimitiveHiveValueWriter(String name, PrimitiveTyp
240240
case STRING: {
241241
VarCharWriter writer = extractWriter(name, parentWriter,
242242
MapWriter::varChar, ListWriter::varChar, UnionVectorWriter::varChar);
243-
return new HiveStringWriter((StringObjectInspector) inspector, writer, drillBuf);
243+
return new HiveStringWriter((StringObjectInspector) inspector, writer, bufferManager.getManagedBuffer());
244244
}
245245
case VARCHAR: {
246246
VarCharWriter writer = extractWriter(name, parentWriter,
247247
MapWriter::varChar, ListWriter::varChar, UnionVectorWriter::varChar);
248-
return new HiveVarCharWriter((HiveVarcharObjectInspector) inspector, writer, drillBuf);
248+
return new HiveVarCharWriter((HiveVarcharObjectInspector) inspector, writer, bufferManager.getManagedBuffer());
249249
}
250250
case TIMESTAMP: {
251251
TimeStampWriter writer = extractWriter(name, parentWriter,
@@ -260,7 +260,7 @@ private HiveValueWriter createPrimitiveHiveValueWriter(String name, PrimitiveTyp
260260
case CHAR: {
261261
VarCharWriter writer = extractWriter(name, parentWriter,
262262
MapWriter::varChar, ListWriter::varChar, UnionVectorWriter::varChar);
263-
return new HiveCharWriter((HiveCharObjectInspector) inspector, writer, drillBuf);
263+
return new HiveCharWriter((HiveCharObjectInspector) inspector, writer, bufferManager.getManagedBuffer());
264264
}
265265
case DECIMAL: {
266266
DecimalTypeInfo decimalType = (DecimalTypeInfo) typeInfo;

contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestHiveStorage.java

+19
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.apache.drill.exec.hive;
1919

20+
import static org.apache.drill.shaded.guava.com.google.common.base.Strings.repeat;
2021
import static org.hamcrest.CoreMatchers.containsString;
2122
import static org.junit.Assert.assertEquals;
2223
import static org.junit.Assert.assertNotNull;
@@ -462,6 +463,24 @@ public void testTableWithEmptyParquet() throws Exception {
462463
.go();
463464
}
464465

466+
@Test // see DRILL-8495
467+
public void testReadingHiveDataBiggerThan256Bytes() throws Exception {
468+
testBuilder()
469+
.sqlQuery("select * from hive.`256_bytes_plus_table`")
470+
.unOrdered()
471+
.baselineColumns(
472+
"char_col",
473+
"varchar_col",
474+
"binary_col",
475+
"string_col")
476+
.baselineValues(
477+
repeat("A", 255),
478+
repeat("B", 1200),
479+
repeat("C", 320).getBytes(),
480+
repeat("D", 2200))
481+
.go();
482+
}
483+
465484
private void verifyColumnsMetadata(List<UserProtos.ResultColumnMetadata> columnsList, Map<String, Integer> expectedResult) {
466485
for (UserProtos.ResultColumnMetadata columnMetadata : columnsList) {
467486
assertTrue("Column should be present in result set", expectedResult.containsKey(columnMetadata.getColumnName()));

contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestInfoSchemaOnHiveStorage.java

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public void showTablesFromDb() throws Exception{
5656
.baselineValues("hive.default", "hive_view_m")
5757
.baselineValues("hive.default", "view_over_hive_view")
5858
.baselineValues("hive.default", "table_with_empty_parquet")
59+
.baselineValues("hive.default", "256_bytes_plus_table")
5960
.go();
6061

6162
testBuilder()
@@ -268,6 +269,7 @@ public void showInfoSchema() throws Exception {
268269
.baselineValues("DRILL", "hive.default", "hive_view_m", "TABLE")
269270
.baselineValues("DRILL", "hive.default", "view_over_hive_view", "VIEW")
270271
.baselineValues("DRILL", "hive.default", "table_with_empty_parquet", "TABLE")
272+
.baselineValues("DRILL", "hive.default", "256_bytes_plus_table", "TABLE")
271273
.baselineValues("DRILL", "hive.skipper", "kv_text_small", "TABLE")
272274
.baselineValues("DRILL", "hive.skipper", "kv_text_large", "TABLE")
273275
.baselineValues("DRILL", "hive.skipper", "kv_incorrect_skip_header", "TABLE")

contrib/storage-hive/core/src/test/java/org/apache/drill/exec/store/hive/HiveTestDataGenerator.java

+22
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.sql.Date;
2424
import java.sql.Timestamp;
2525

26+
import org.apache.drill.shaded.guava.com.google.common.base.Strings;
2627
import org.apache.commons.io.FileUtils;
2728
import org.apache.commons.lang3.StringUtils;
2829
import org.apache.drill.exec.hive.HiveTestUtilities;
@@ -99,6 +100,9 @@ private void generateDataInternal(Driver hiveDriver) throws Exception {
99100
FileUtils.forceDelete(emptyTableLocation);
100101
}
101102

103+
// generate table with variable length columns and populate if with different size data
104+
generateTableWithVariableLengthColumns(hiveDriver);
105+
102106
// create a Hive table that has columns with data types which are supported for reading in Drill.
103107
testDataFile = generateAllTypesDataFile();
104108
executeQuery(hiveDriver,
@@ -609,4 +613,22 @@ private String generateTestDataWithHeadersAndFooters(String tableName, int rowCo
609613

610614
return sb.toString();
611615
}
616+
617+
private void generateTableWithVariableLengthColumns(Driver hiveDriver) {
618+
executeQuery(hiveDriver, "CREATE TABLE IF NOT EXISTS 256_bytes_plus_table (" +
619+
" char_col CHAR(255)," +
620+
" varchar_col VARCHAR(1500)," +
621+
" binary_col BINARY," +
622+
" string_col STRING" +
623+
")");
624+
625+
String insertQuery = String.format("INSERT INTO 256_bytes_plus_table VALUES\n" +
626+
" ('%s', '%s', '%s', '%s')",
627+
Strings.repeat("A", 255),
628+
Strings.repeat("B", 1200),
629+
Strings.repeat("C", 320),
630+
Strings.repeat("D", 2200));
631+
632+
executeQuery(hiveDriver, insertQuery);
633+
}
612634
}

0 commit comments

Comments
 (0)