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–2019 The Apache Software Foundation. All rights reserved.