public class AsynchronousBlockReader extends AsynchronousFileIOChannel<MemorySegment,org.apache.flink.runtime.io.disk.iomanager.ReadRequest> implements BlockChannelReader<MemorySegment>
MemorySegment
in an asynchronous fashion. That is, a read request
is not processed by the thread that issues it, but by an asynchronous reader thread. Once the
read request is done, the asynchronous reader adds the full MemorySegment to a return
queue where it can be popped by the worker thread, once it needs the data. The return queue
is in this case a LinkedBlockingQueue
, such that the working thread
blocks until the request has been served, if the request is still pending when the it requires
the data.
Typical pre-fetching reads are done by issuing the read requests early and popping the return queue once the data is actually needed.
The reader has no notion whether the size of the memory segments is actually the size of the blocks on disk, or even whether the file was written in blocks of the same size, or in blocks at all. Ensuring that the writing and reading is consistent with each other (same blocks sizes) is up to the programmer.
FileIOChannel.Enumerator, FileIOChannel.ID
closed, closeLock, exception, requestQueue, requestsNotReturned, resultHandler
fileChannel, id, LOG
Modifier | Constructor and Description |
---|---|
protected |
AsynchronousBlockReader(FileIOChannel.ID channelID,
RequestQueue<org.apache.flink.runtime.io.disk.iomanager.ReadRequest> requestQueue,
LinkedBlockingQueue<MemorySegment> returnSegments)
Creates a new block channel reader for the given channel.
|
Modifier and Type | Method and Description |
---|---|
MemorySegment |
getNextReturnedBlock()
Gets the next memory segment that has been filled with data by the reader.
|
LinkedBlockingQueue<MemorySegment> |
getReturnQueue()
Gets the queue in which the full memory segments are queued after the asynchronous read is
complete.
|
void |
readBlock(MemorySegment segment)
Issues a read request, which will asynchronously fill the given segment with the next block
in the underlying file channel.
|
void |
seekToPosition(long position) |
addRequest, checkErroneous, close, closeAndDelete, handleProcessedBuffer, isClosed, registerAllRequestsProcessedListener
deleteChannel, getChannelID, getNioFileChannel, getSize
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
close, closeAndDelete, deleteChannel, getChannelID, getNioFileChannel, getSize, isClosed
protected AsynchronousBlockReader(FileIOChannel.ID channelID, RequestQueue<org.apache.flink.runtime.io.disk.iomanager.ReadRequest> requestQueue, LinkedBlockingQueue<MemorySegment> returnSegments) throws IOException
channelID
- The ID of the channel to read.requestQueue
- The request queue of the asynchronous reader thread, to which the I/O
requests are added.returnSegments
- The return queue, to which the full Memory Segments are added.IOException
- Thrown, if the underlying file channel could not be opened.public void readBlock(MemorySegment segment) throws IOException
readBlock
in interface BlockChannelReader<MemorySegment>
segment
- The segment to read the block into.IOException
- Thrown, when the reader encounters an I/O error. Due to the asynchronous
nature of the reader, the exception thrown here may have been caused by an earlier read
request.public void seekToPosition(long position) throws IOException
seekToPosition
in interface BlockChannelReader<MemorySegment>
IOException
public MemorySegment getNextReturnedBlock() throws IOException
WARNING: If this method is invoked without any segment ever returning (for example,
because the readBlock(MemorySegment)
method has not been invoked appropriately), the
method may block forever.
getNextReturnedBlock
in interface BlockChannelReader<MemorySegment>
IOException
- Thrown, if an I/O error occurs in the reader while waiting for the
request to return.public LinkedBlockingQueue<MemorySegment> getReturnQueue()
getReturnQueue
in interface BlockChannelReader<MemorySegment>
Copyright © 2014–2024 The Apache Software Foundation. All rights reserved.