From 4607854ef4b2cd52b3ec43c6dd08af78f8ecaf31 Mon Sep 17 00:00:00 2001 From: Arnaud Nauwynck Date: Sat, 23 Nov 2024 16:49:28 +0100 Subject: [PATCH] GH-3074: read footer using 1 call readFully(byte[8]) instead of 5 calls --- .../apache/parquet/hadoop/ParquetFileReader.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java index 785f145b20..e60a58b725 100644 --- a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java +++ b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java @@ -585,14 +585,19 @@ private static final ParquetMetadata readFooter( } // Read footer length and magic string - with a single seek - byte[] magic = new byte[MAGIC.length]; - long fileMetadataLengthIndex = fileLen - magic.length - FOOTER_LENGTH_SIZE; + long fileMetadataLengthIndex = fileLen - MAGIC.length - FOOTER_LENGTH_SIZE; LOG.debug("reading footer index at {}", fileMetadataLengthIndex); f.seek(fileMetadataLengthIndex); - int fileMetadataLength = readIntLittleEndian(f); - f.readFully(magic); + byte[] magicAndLengthBytes = new byte[FOOTER_LENGTH_SIZE + MAGIC.length]; + f.readFully(magicAndLengthBytes); + int fileMetadataLength = readIntLittleEndian(magicAndLengthBytes, 0); boolean encryptedFooterMode; + // using JDK >= 9: if (Arrays.equals(MAGIC, 0, MAGIC.length, + // magicAndLengthBytes, FOOTER_LENGTH_SIZE, FOOTER_LENGTH_SIZE + MAGIC.length)) { + // using JDK <= 8: need extract sub array then compare + byte[] magic = new byte[MAGIC.length]; + System.arraycopy(magicAndLengthBytes, FOOTER_LENGTH_SIZE, magic, 0, MAGIC.length); if (Arrays.equals(MAGIC, magic)) { encryptedFooterMode = false; } else if (Arrays.equals(EFMAGIC, magic)) {