estimateRgEndOffset slop calculation is insufficient for incompressible data
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- java
- Ambito
- data-engineering
Direzione di ricerca
Apri RecordReaderUtils.java e inizia da estimateRgEndOffset, quindi segui il calcolo delle dimensioni dell’esecuzione DIRECT di RLEv2 utilizzato per la stima della lettura anticipata. Verifica il caso di dati non comprimibili con bufferSize 1024, incluso l’header di 2 byte; il lavoro è completato quando il calcolo consente sei blocchi e non raggiunge più l’eccezione di dimensione del buffer segnalata.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
The estimateRgEndOffset method in RecordReaderUtils.java uses a stretchFactor to estimate how much compressed data to read ahead for a row group. The current formula:
int stretchFactor = 2 + (MAX_VALUES_LENGTH * MAX_BYTE_WIDTH - 1) / bufferSize;
does not account for the 2-byte RLEv2 DIRECT run header. This means the worst-case uncompressed payload is actually MAX_VALUES_LENGTH * MAX_BYTE_WIDTH + 2 bytes (512 * 8 + 2 = 4098), not MAX_VALUES_LENGTH * MAX_BYTE_WIDTH (4096).
Impact
When data is incompressible (e.g., random bytes), each compression block expands to HEADER_SIZE + bufferSize bytes. With bufferSize = 1024, the old formula gives stretchFactor = 5, allocating space for 5 compressed blocks. However, 4098 bytes of uncompressed data requires ceil(4098 / 1024) = 5 blocks of payload, plus the initial 2 blocks from the base factor, totaling 6 blocks needed. The old estimate falls short by one block, causing IllegalArgumentException: Buffer size too small when reading a full RLE v2 DIRECT run at the estimated boundary.
Fix
Include the RLEv2 header size in the worst-case calculation:
int maxRleDirectRunSize = MAX_VALUES_LENGTH * MAX_BYTE_WIDTH + 2;
int stretchFactor = 2 + (maxRleDirectRunSize - 1) / bufferSize;
This correctly yields stretchFactor = 6 for bufferSize = 1024, ensuring enough space is allocated.
- Lingua principale
- Java
- Stelle
- 769
- Fork
- 515
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/orc
-
[C++] Reader cannot resolve Java fixed-offset writer timezone IDs such as GMT-00:00Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
-
cross compileAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
Issue simili
-
waiting-for-triage
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
spring-cloud/spring-cloud-openfeign#1443 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 84/100
ADORSYS-GIS/keycloak-oid4vp-plugin#221 ·
I maintainer di solito rispondono entro 2 giorni
-
status: team-only type: dependency-upgrade
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
spring-projects/spring-boot#52099 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
tchiotludo/akhq#3307 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
objectionary/jeo-maven-plugin#1885 ·
I maintainer di solito rispondono entro 4 giorni