Skip to content

Commit dc3f1ac

Browse files
authored
GH-3587: Fix parquet.thrift.string.size.limit validation (#3588)
1 parent 23b0fe5 commit dc3f1ac

2 files changed

Lines changed: 50 additions & 2 deletions

File tree

parquet-format-structures/src/main/java/org/apache/parquet/format/Util.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,8 +417,8 @@ private static InterningProtocol protocol(TIOStreamTransport t, int configuredMa
417417
// Set to default 100 MB
418418
maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE;
419419
}
420-
if (configuredMaxMessageSize <= 0) {
421-
throw new NumberFormatException("Max message size must be positive: " + configuredMaxMessageSize);
420+
if (maxMessageSize <= 0) {
421+
throw new NumberFormatException("Max message size must be positive: " + maxMessageSize);
422422
}
423423

424424
TConfiguration config = t.getConfiguration();

parquet-hadoop/src/test/java/org/apache/parquet/hadoop/TestParquetFileReaderMaxMessageSize.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,52 @@ public void testInsufficientMaxMessageSizeError() throws IOException {
143143
|| e.getCause().getMessage().contains("MaxMessageSize reached"));
144144
}
145145
}
146+
147+
/**
148+
* The -1 sentinel must be honored as "use the default max message size",
149+
* not rejected as a non-positive value.
150+
*/
151+
@Test
152+
public void testReadAcceptsMinusOneAsDefaultMaxMessageSize() throws IOException {
153+
Configuration readConf = new Configuration();
154+
readConf.setInt("parquet.thrift.string.size.limit", -1);
155+
ParquetReadOptions options = HadoopReadOptions.builder(readConf).build();
156+
157+
try (ParquetFileReader reader =
158+
ParquetFileReader.open(HadoopInputFile.fromPath(TEST_FILE, readConf), options)) {
159+
ParquetMetadata metadata = reader.getFooter();
160+
assertNotNull(metadata);
161+
assertEquals(schema, metadata.getFileMetaData().getSchema());
162+
}
163+
}
164+
165+
@Test
166+
public void testReadRejectsZeroMaxMessageSize() throws IOException {
167+
assertRejectsNonPositiveMaxMessageSize(0);
168+
}
169+
170+
@Test
171+
public void testReadRejectsInvalidNegativeMaxMessageSize() throws IOException {
172+
assertRejectsNonPositiveMaxMessageSize(-5);
173+
}
174+
175+
private void assertRejectsNonPositiveMaxMessageSize(int maxMessageSize) throws IOException {
176+
Configuration readConf = new Configuration();
177+
readConf.setInt("parquet.thrift.string.size.limit", maxMessageSize);
178+
ParquetReadOptions options = HadoopReadOptions.builder(readConf).build();
179+
180+
try (ParquetFileReader reader =
181+
ParquetFileReader.open(HadoopInputFile.fromPath(TEST_FILE, readConf), options)) {
182+
fail("Expected failure for non-positive max message size: " + maxMessageSize);
183+
} catch (RuntimeException | IOException e) {
184+
String message = e.getMessage() == null ? "" : e.getMessage();
185+
String causeMessage = e.getCause() == null || e.getCause().getMessage() == null
186+
? ""
187+
: e.getCause().getMessage();
188+
assertTrue(
189+
"Expected 'Max message size must be positive' in " + message + " / " + causeMessage,
190+
message.contains("Max message size must be positive")
191+
|| causeMessage.contains("Max message size must be positive"));
192+
}
193+
}
146194
}

0 commit comments

Comments
 (0)