@Override public void close() throws IOException { if (mClosed) { return; } try { if (mBlockIsRead) { mWorkerClient.accessBlock(mBlockId); ClientContext.getClientMetrics().incBlocksReadLocal(1); } mWorkerClient.unlockBlock(mBlockId); } catch (TachyonException e) { throw new IOException(e); } finally { mContext.releaseWorkerClient(mWorkerClient); mCloser.close(); if (mBuffer != null && mBuffer.isDirect()) { BufferUtils.cleanDirectBuffer(mBuffer); } } mClosed = true; }
/** * Creates a new local block input stream. * * @param blockId the block id * @throws IOException if I/O error occurs */ public LocalBlockInStream(long blockId, long blockSize) throws IOException { super(blockId, blockSize); mContext = BlockStoreContext.INSTANCE; mCloser = Closer.create(); mWorkerClient = mContext.acquireWorkerClient(NetworkAddressUtils.getLocalHostName(ClientContext.getConf())); FileChannel localFileChannel = null; try { String blockPath = mWorkerClient.lockBlock(blockId); if (blockPath == null) { throw new IOException(ExceptionMessage.BLOCK_NOT_LOCALLY_AVAILABLE.getMessage(mBlockId)); } RandomAccessFile localFile = mCloser.register(new RandomAccessFile(blockPath, "r")); localFileChannel = mCloser.register(localFile.getChannel()); } catch (IOException e) { mContext.releaseWorkerClient(mWorkerClient); throw e; } mLocalFileChannel = localFileChannel; }