/** * The new rename which has the POSIX semantic. */ static RenameResult renameToInt( FSDirectory fsd, FSPermissionChecker pc, final String srcArg, final String dstArg, boolean logRetryCache, Options.Rename... options) throws IOException { String src = srcArg; String dst = dstArg; if (NameNode.stateChangeLog.isDebugEnabled()) { NameNode.stateChangeLog.debug("DIR* NameSystem.renameTo: with options -" + " " + src + " to " + dst); } BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo(); // returns resolved path return renameTo(fsd, pc, src, dst, collectedBlocks, logRetryCache, options); }
void renameTo(final String src, final String dst, boolean logRetryCache, Options.Rename... options) throws IOException { final String operationName = "rename"; FSDirRenameOp.RenameResult res = null; checkOperation(OperationCategory.WRITE); final FSPermissionChecker pc = getPermissionChecker(); writeLock(); try { checkOperation(OperationCategory.WRITE); checkNameNodeSafeMode("Cannot rename " + src); res = FSDirRenameOp.renameToInt(dir, pc, src, dst, logRetryCache, options); } catch (AccessControlException e) { logAuditEvent(false, operationName + " (options=" + Arrays.toString(options) + ")", src, dst, null); throw e; } finally { writeUnlock(operationName); } getEditLog().logSync(); BlocksMapUpdateInfo collectedBlocks = res.collectedBlocks; if (!collectedBlocks.getToDeleteList().isEmpty()) { removeBlocks(collectedBlocks); collectedBlocks.clear(); } logAuditEvent(true, operationName + " (options=" + Arrays.toString(options) + ")", src, dst, res.auditStat); }
/** * Rename src to dst. * <br> * Note: This is to be used by {@link org.apache.hadoop.hdfs.server * .namenode.FSEditLogLoader} only. * <br> * * @param fsd FSDirectory * @param src source path * @param dst destination path * @param timestamp modification time * @param options Rename options */ static void renameForEditLog( FSDirectory fsd, String src, String dst, long timestamp, Options.Rename... options) throws IOException { BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo(); final INodesInPath srcIIP = fsd.getINodesInPath(src, DirOp.WRITE_LINK); final INodesInPath dstIIP = fsd.getINodesInPath(dst, DirOp.WRITE_LINK); unprotectedRenameTo(fsd, srcIIP, dstIIP, timestamp, collectedBlocks, options); if (!collectedBlocks.getToDeleteList().isEmpty()) { fsd.getFSNamesystem().getBlockManager() .removeBlocksAndUpdateSafemodeTotal(collectedBlocks); } }
@Deprecated static RenameResult renameToInt( FSDirectory fsd, FSPermissionChecker pc, final String src, final String dst, boolean logRetryCache) throws IOException { if (NameNode.stateChangeLog.isDebugEnabled()) { NameNode.stateChangeLog.debug("DIR* NameSystem.renameTo: " + src + " to " + dst); } // Rename does not operate on link targets // Do not resolveLink when checking permissions of src and dst INodesInPath srcIIP = fsd.resolvePath(pc, src, DirOp.WRITE_LINK); INodesInPath dstIIP = fsd.resolvePath(pc, dst, DirOp.CREATE_LINK); dstIIP = dstForRenameTo(srcIIP, dstIIP); return renameTo(fsd, pc, srcIIP, dstIIP, logRetryCache); }
/** * <br> * Note: This is to be used by {@link FSEditLogLoader} only. * <br> */ @Deprecated static INodesInPath renameForEditLog(FSDirectory fsd, String src, String dst, long timestamp) throws IOException { final INodesInPath srcIIP = fsd.getINodesInPath(src, DirOp.WRITE_LINK); INodesInPath dstIIP = fsd.getINodesInPath(dst, DirOp.WRITE_LINK); // this is wrong but accidentally works. the edit contains the full path // so the following will do nothing, but shouldn't change due to backward // compatibility when maybe full path wasn't logged. dstIIP = dstForRenameTo(srcIIP, dstIIP); return unprotectedRenameTo(fsd, srcIIP, dstIIP, timestamp); }
final INode srcInode = srcIIP.getLastINode(); try { validateRenameSource(fsd, srcIIP); } catch (SnapshotException e) { throw e; validateDestination(src, dst, srcInode); } catch (IOException ignored) { return null; verifyFsLimitsForRename(fsd, srcIIP, dstIIP); verifyQuotaForRename(fsd, srcIIP, dstIIP);
final String src = renameReservedPathsOnUpgrade(renameOp.src, logVersion); final String dst = renameReservedPathsOnUpgrade(renameOp.dst, logVersion); FSDirRenameOp.renameForEditLog(fsDir, src, dst, renameOp.timestamp); FSDirRenameOp.renameForEditLog(fsDir, renameReservedPathsOnUpgrade(renameOp.src, logVersion), renameReservedPathsOnUpgrade(renameOp.dst, logVersion),
fsd.writeLock(); try { renameIIP = unprotectedRenameTo(fsd, srcIIP, dstIIP, mtime); } finally { fsd.writeUnlock(); return createRenameResult(fsd, renameIIP, false, null);
final String error; final INode srcInode = srcIIP.getLastINode(); validateRenameSource(fsd, srcIIP); " and destination " + dst + " are the same"); validateDestination(src, dst, srcInode); List<INodeDirectory> snapshottableDirs = new ArrayList<>(); if (dstInode != null) { // Destination exists validateOverwrite(src, dst, overwrite, srcInode, dstInode); FSDirSnapshotOp.checkSnapshot(fsd, dstIIP, snapshottableDirs); verifyFsLimitsForRename(fsd, srcIIP, dstIIP); verifyQuotaForRename(fsd, srcIIP, dstIIP); return createRenameResult( fsd, renamedIIP, filesDeleted, collectedBlocks);
final String src = renameReservedPathsOnUpgrade(renameOp.src, logVersion); final String dst = renameReservedPathsOnUpgrade(renameOp.dst, logVersion); FSDirRenameOp.renameForEditLog(fsDir, src, dst, renameOp.timestamp); FSDirRenameOp.renameForEditLog(fsDir, renameReservedPathsOnUpgrade(renameOp.src, logVersion), renameReservedPathsOnUpgrade(renameOp.dst, logVersion),
final INode srcInode = srcIIP.getLastINode(); try { validateRenameSource(srcIIP); } catch (SnapshotException e) { throw e; validateDestination(src, dst, srcInode); } catch (IOException ignored) { return false; verifyFsLimitsForRename(fsd, srcIIP, dstIIP); verifyQuotaForRename(fsd, srcIIP, dstIIP);
/** * The new rename which has the POSIX semantic. */ static Map.Entry<BlocksMapUpdateInfo, HdfsFileStatus> renameToInt( FSDirectory fsd, final String srcArg, final String dstArg, boolean logRetryCache, Options.Rename... options) throws IOException { String src = srcArg; String dst = dstArg; if (NameNode.stateChangeLog.isDebugEnabled()) { NameNode.stateChangeLog.debug("DIR* NameSystem.renameTo: with options -" + " " + src + " to " + dst); } if (!DFSUtil.isValidName(dst)) { throw new InvalidPathException("Invalid name: " + dst); } final FSPermissionChecker pc = fsd.getPermissionChecker(); BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo(); // returns resolved path dst = renameTo(fsd, pc, src, dst, collectedBlocks, logRetryCache, options); INodesInPath dstIIP = fsd.getINodesInPath(dst, false); HdfsFileStatus resultingStat = fsd.getAuditFileInfo(dstIIP); return new AbstractMap.SimpleImmutableEntry<>( collectedBlocks, resultingStat); }
final RenameResult result; try { result = unprotectedRenameTo(fsd, srcIIP, dstIIP, mtime, collectedBlocks, options); if (result.filesDeleted) {
/** * Change the indicated filename. * @deprecated Use {@link #renameTo(String, String, boolean, * Options.Rename...)} instead. */ @Deprecated boolean renameTo(String src, String dst, boolean logRetryCache) throws IOException { final String operationName = "rename"; FSDirRenameOp.RenameResult ret = null; checkOperation(OperationCategory.WRITE); final FSPermissionChecker pc = getPermissionChecker(); writeLock(); try { checkOperation(OperationCategory.WRITE); checkNameNodeSafeMode("Cannot rename " + src); ret = FSDirRenameOp.renameToInt(dir, pc, src, dst, logRetryCache); } catch (AccessControlException e) { logAuditEvent(false, operationName, src, dst, null); throw e; } finally { writeUnlock(operationName); } boolean success = ret.success; if (success) { getEditLog().logSync(); logAuditEvent(success, operationName, src, dst, ret.auditStat); } return success; }
final String src = renameReservedPathsOnUpgrade(renameOp.src, logVersion); final String dst = renameReservedPathsOnUpgrade(renameOp.dst, logVersion); FSDirRenameOp.renameForEditLog(fsDir, src, dst, renameOp.timestamp); FSDirRenameOp.renameForEditLog(fsDir, renameReservedPathsOnUpgrade(renameOp.src, logVersion), renameReservedPathsOnUpgrade(renameOp.dst, logVersion),
validateRenameSource(srcIIP); " and destination " + dst + " are the same"); validateDestination(src, dst, srcInode); List<INodeDirectory> snapshottableDirs = new ArrayList<>(); if (dstInode != null) { // Destination exists validateOverwrite(src, dst, overwrite, srcInode, dstInode); FSDirSnapshotOp.checkSnapshot(dstInode, snapshottableDirs); verifyFsLimitsForRename(fsd, srcIIP, dstIIP); verifyQuotaForRename(fsd, srcIIP, dstIIP);
@Deprecated static RenameOldResult renameToInt( FSDirectory fsd, final String srcArg, final String dstArg, boolean logRetryCache) throws IOException { String src = srcArg; String dst = dstArg; if (NameNode.stateChangeLog.isDebugEnabled()) { NameNode.stateChangeLog.debug("DIR* NameSystem.renameTo: " + src + " to " + dst); } if (!DFSUtil.isValidName(dst)) { throw new IOException("Invalid name: " + dst); } FSPermissionChecker pc = fsd.getPermissionChecker(); HdfsFileStatus resultingStat = null; // Rename does not operate on link targets // Do not resolveLink when checking permissions of src and dst INodesInPath srcIIP = fsd.resolvePathForWrite(pc, src, false); INodesInPath dstIIP = fsd.resolvePathForWrite(pc, dst, false); @SuppressWarnings("deprecation") final boolean status = renameTo(fsd, pc, srcIIP, dstIIP, logRetryCache); if (status) { dstIIP = fsd.getINodesInPath(dstIIP.getPath(), false); resultingStat = fsd.getAuditFileInfo(dstIIP); } return new RenameOldResult(status, resultingStat); }
/** * <br> * Note: This is to be used by {@link FSEditLogLoader} only. * <br> */ @Deprecated @SuppressWarnings("deprecation") static boolean renameForEditLog(FSDirectory fsd, String src, String dst, long timestamp) throws IOException { if (fsd.isDir(dst)) { dst += Path.SEPARATOR + new Path(src).getName(); } final INodesInPath srcIIP = fsd.getINodesInPath4Write(src, false); final INodesInPath dstIIP = fsd.getINodesInPath4Write(dst, false); return unprotectedRenameTo(fsd, src, dst, srcIIP, dstIIP, timestamp); }
void renameTo(final String src, final String dst, boolean logRetryCache, Options.Rename... options) throws IOException { final String operationName = "rename"; waitForLoadingFSImage(); Map.Entry<BlocksMapUpdateInfo, HdfsFileStatus> res = null; writeLock(); try { checkOperation(OperationCategory.WRITE); checkNameNodeSafeMode("Cannot rename " + src); res = FSDirRenameOp.renameToInt(dir, src, dst, logRetryCache, options); } catch (AccessControlException e) { logAuditEvent(false, operationName + " (options=" + Arrays.toString(options) + ")", src, dst, null); throw e; } finally { writeUnlock(operationName); } getEditLog().logSync(); BlocksMapUpdateInfo collectedBlocks = res.getKey(); HdfsFileStatus auditStat = res.getValue(); if (!collectedBlocks.getToDeleteList().isEmpty()) { removeBlocks(collectedBlocks); collectedBlocks.clear(); } logAuditEvent(true, operationName + " (options=" + Arrays.toString(options) + ")", src, dst, auditStat); }
final INode srcInode = srcIIP.getLastINode(); try { validateRenameSource(srcIIP); } catch (SnapshotException e) { throw e; validateDestination(src, dst, srcInode); } catch (IOException ignored) { return false; verifyFsLimitsForRename(fsd, srcIIP, dstIIP); verifyQuotaForRename(fsd, srcIIP, dstIIP);