tsreaper opened a new pull request, #9183:
URL: https://github.com/apache/paimon/pull/9183

   ### Purpose
   
   Currently when reading spilled data, there is a small probability to meet 
the following exception.
   
   ```
   Caused by: org.apache.paimon.compression.BufferDecompressionException: Input 
is corrupted, invalid length.
       at 
org.apache.paimon.compression.CompressorUtils.validateLength(CompressorUtils.java:49)
 ~[?:?]
       at 
org.apache.paimon.compression.Lz4BlockDecompressor.decompress(Lz4BlockDecompressor.java:48)
 ~[?:?]
       at 
org.apache.paimon.disk.ChannelReaderInputView.nextSegment(ChannelReaderInputView.java:83)
 ~[?:?]
       at 
org.apache.paimon.data.AbstractPagedInputView.doAdvance(AbstractPagedInputView.java:153)
 ~[?:?]
       at 
org.apache.paimon.data.AbstractPagedInputView.advance(AbstractPagedInputView.java:147)
 ~[?:?]
       at 
org.apache.paimon.data.AbstractPagedInputView.readInt(AbstractPagedInputView.java:322)
 ~[?:?]
       at 
org.apache.paimon.data.serializer.BinaryRowSerializer.deserialize(BinaryRowSerializer.java:77)
 ~[?:?]
       at 
org.apache.paimon.disk.ChannelReaderInputViewIterator.next(ChannelReaderInputViewIterator.java:63)
 ~[?:?]
       at 
org.apache.paimon.mergetree.MergeSorter$ChannelReaderReader$1.next(MergeSorter.java:257)
 ~[?:?]
       at 
org.apache.paimon.mergetree.MergeSorter$ChannelReaderReader$1.next(MergeSorter.java:254)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.LoserTree$LeafIterator.advanceIfAvailable(LoserTree.java:320)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.LoserTree.initializeIfNeeded(LoserTree.java:87)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.SortMergeReaderWithLoserTree.readBatch(SortMergeReaderWithLoserTree.java:81)
 ~[?:?]
       at 
org.apache.paimon.reader.RecordReaderIterator.<init>(RecordReaderIterator.java:37)
 ~[?:?]
       at 
org.apache.paimon.reader.RecordReader.toCloseableIterator(RecordReader.java:210)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.ChangelogMergeTreeRewriter.rewriteOrProduceChangelog(ChangelogMergeTreeRewriter.java:133)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.ChangelogMergeTreeRewriter.rewrite(ChangelogMergeTreeRewriter.java:106)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.MergeTreeCompactTask.rewriteImpl(MergeTreeCompactTask.java:162)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.MergeTreeCompactTask.rewrite(MergeTreeCompactTask.java:157)
 ~[?:?]
       at 
org.apache.paimon.mergetree.compact.MergeTreeCompactTask.doCompact(MergeTreeCompactTask.java:111)
 ~[?:?]
       at org.apache.paimon.compact.CompactTask.call(CompactTask.java:55) ~[?:?]
       at org.apache.paimon.compact.CompactTask.call(CompactTask.java:34) ~[?:?]
       at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
       at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
 ~[?:?]
       at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 
~[?:?]
       at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 
~[?:?]
       ... 1 more
   ```
   
   There are two possible causes:
   
   1. `BufferFileChannelReader` does not fully read the byte buffer.
   2. Empty spilled block is not recorded correctly. It is possible to produce 
an empty spilled block if logically there is no data (for example when we 
delete all records in a bucket without full compaction).
   
   This PR fixes both causes.
   
   ### Tests
   
   * `ChannelWriterOutputViewTest`.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to