/** * @param file the file the block belongs to * @param readType the InStream's read type * @param blockIndex the index of the block in the file * @param ufsConf the under file system configuration * @throws IOException */ RemoteBlockInStream(TachyonFile file, ReadType readType, int blockIndex, Object ufsConf) throws IOException { super(file, readType, blockIndex); mBlockInfo = TFS.getClientBlockInfo(FILE.FID, BLOCK_INDEX); mReadByte = 0; mBufferStartPosition = 0; if (!FILE.isComplete()) { throw new IOException("File " + FILE.getPath() + " is not ready to read"); } mRecache = readType.isCache(); if (mRecache) { mBlockOutStream = new BlockOutStream(file, WriteType.TRY_CACHE, blockIndex); } updateCurrentBuffer(); mUFSConf = ufsConf; if (mCurrentBuffer == null) { setupStreamFromUnderFs(mBlockInfo.offset, mUFSConf); if (mCheckpointInputStream == null) { TFS.reportLostFile(FILE.FID); throw new IOException("Can not find the block " + FILE + " " + BLOCK_INDEX); } } }
BlockOutStream(TachyonFile file, WriteType opType, int blockIndex) throws IOException { super(file, opType); if (!opType.isCache()) { throw new IOException("BlockOutStream only support WriteType.CACHE"); } BLOCK_INDEX = blockIndex; BLOCK_CAPACITY_BYTE = FILE.getBlockSizeByte(); BLOCK_ID = FILE.getBlockId(BLOCK_INDEX); BLOCK_OFFSET = BLOCK_CAPACITY_BYTE * blockIndex; PIN = FILE.needPin(); mCanWrite = true; if (!TFS.hasLocalWorker()) { mCanWrite = false; String msg = "The machine does not have any local worker."; throw new IOException(msg); } File localFolder = TFS.createAndGetUserTempFolder(); if (localFolder == null) { mCanWrite = false; String msg = "Failed to create temp user folder for tachyon client."; throw new IOException(msg); } mLocalFilePath = CommonUtils.concat(localFolder.getPath(), BLOCK_ID); mLocalFile = new RandomAccessFile(mLocalFilePath, "rw"); mLocalFileChannel = mLocalFile.getChannel(); // change the permission of the temporary file in order that the worker can move it. CommonUtils.changeLocalFileToFullPermission(mLocalFilePath); // use the sticky bit, only the client and the worker can write to the block CommonUtils.setLocalFileStickyBit(mLocalFilePath); LOG.info(mLocalFilePath + " was created!"); mBuffer = ByteBuffer.allocate(USER_CONF.FILE_BUFFER_BYTES + 4); }
@Override public long skip(long n) throws IOException { if (n <= 0) { return 0; } long ret = n; if (mCurrentPosition + n >= FILE.length()) { ret = FILE.length() - mCurrentPosition; mCurrentPosition += ret; } else { mCurrentPosition += n; } int tBlockIndex = (int) (mCurrentPosition / BLOCK_CAPACITY); if (tBlockIndex != mCurrentBlockIndex) { if (mCurrentBlockInStream != null) { mCurrentBlockInStream.close(); } mCurrentBlockIndex = tBlockIndex; mCurrentBlockInStream = BlockInStream.get(FILE, READ_TYPE, mCurrentBlockIndex); long shouldSkip = mCurrentPosition % BLOCK_CAPACITY; long skip = mCurrentBlockInStream.skip(shouldSkip); mCurrentBlockLeft = BLOCK_CAPACITY - skip; if (skip != shouldSkip) { throw new IOException( "The underlayer BlockInStream only skip " + skip + " instead of " + shouldSkip); } } else { long skip = mCurrentBlockInStream.skip(ret); if (skip != ret) { throw new IOException( "The underlayer BlockInStream only skip " + skip + " instead of " + ret); } } return ret; }
/** * Choose a unique tab file. * * @return io reference */ private IOFile newTabFile() { // collect numbers of existing files final BoolList bl = new BoolList(); for (final EditorArea edit : editors()) { if (edit.opened()) continue; final String n = edit.file.name().substring(FILE.length()); bl.set(n.isEmpty() ? 1 : Integer.parseInt(n), true); } // find first free file number int c = 0; while (++c < bl.size() && bl.get(c)) ; // create io reference return new IOFile(gui.gprop.get(GUIProp.WORKPATH), FILE + (c == 1 ? "" : c)); }
@Override protected void doRevertUpdateToRuntime( final OperationContext context, final ModelNode operation, final String attributeName, final ModelNode valueToRestore, final ModelNode valueToRevert, final String handlerName, final T handler) throws OperationFailedException { if (APPEND.getName().equals(attributeName)) { handler.setAppend(valueToRestore.asBoolean()); } else if (AUTOFLUSH.getName().equals(attributeName)) { handler.setAutoFlush(valueToRestore.asBoolean()); } else if (FILE.getName().equals(attributeName)) { FileHandlers.revertFileChange(context, valueToRestore, handlerName); } }
@Override protected boolean doApplyUpdateToRuntime( final OperationContext context, final ModelNode operation, final String attributeName, final ModelNode resolvedValue, final ModelNode currentValue, final String handlerName, final T handler) throws OperationFailedException { boolean requiresRestart = false; if (APPEND.getName().equals(attributeName)) { handler.setAppend(resolvedValue.asBoolean()); return true; } else if (AUTOFLUSH.getName().equals(attributeName)) { handler.setAutoFlush(resolvedValue.asBoolean()); } else if (FILE.getName().equals(attributeName)) { requiresRestart = FileHandlers.changeFile(context, currentValue, resolvedValue, handlerName); } return requiresRestart; }