*/
final class DiskFileReader extends FileReader {
private final FileChannel channel;
- private final ByteBuf buffer;
+ private ByteBuf buffer;
// tracks where memory's first available byte maps to in terms of FileChannel.position()
private int bufferPosition;
return seek >= 0 ? forwardAndRead(seek, position, size) : rewindAndRead(-seek, position, size);
}
+ @Override
+ void release() {
+ final var local = buffer;
+ if (local != null) {
+ buffer = null;
+ local.release();
+ }
+ }
+
private @NonNull ByteBuf forwardAndRead(final int seek, final int position, final int size) {
final int remaining = buffer.writerIndex() - seek;
final int missing = remaining - size;
}
}
}
+
+ @Override
+ void release() {
+ reader.release();
+ }
}
*/
abstract @NonNull ByteBuf read(int position, int size);
+ /**
+ * Releases resources associated with this writer.
+ */
+ abstract void release();
+
@Override
public final String toString() {
return MoreObjects.toStringHelper(this).add("path", file.path()).toString();
*/
abstract void flush() throws IOException;
+ /**
+ * Releases resources associated with this writer.
+ */
+ abstract void release();
+
@Override
public final String toString() {
return MoreObjects.toStringHelper(this).add("path", file.path()).toString();
private static final Logger LOG = LoggerFactory.getLogger(JournalSegmentReader.class);
private final JournalSegment segment;
- private final FileReader fileReader;
private final int maxSegmentSize;
private final int maxEntrySize;
+ private FileReader fileReader;
private int position;
JournalSegmentReader(final JournalSegment segment, final FileReader fileReader, final int maxEntrySize) {
* Close this reader.
*/
void close() {
- segment.closeReader(this);
+ final var local = fileReader;
+ if (local != null) {
+ fileReader = null;
+ local.release();
+ segment.closeReader(this);
+ }
}
}
ByteBuf read(final int position, final int size) {
return buffer.slice(position, size);
}
+
+ @Override
+ void release() {
+ // No-op
+ }
}
void flush() throws IOException {
flush.flush();
}
+
+ @Override
+ void release() {
+ // No-op
+ }
}