diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java index 7d805421d94..38b0c7779b9 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java @@ -271,22 +271,44 @@ public boolean rename(final Path src, final Path dst) throws IOException { if (parentFolder == null) { return false; } + Path qualifiedSrcPath = makeQualified(src); + Path qualifiedDstPath = makeQualified(dst); + + // rename under same folder; + if(makeQualified(parentFolder).equals(qualifiedDstPath)) { + return tryGetFileStatus(qualifiedSrcPath) != null; + } + + FileStatus dstFileStatus = null; + if (qualifiedSrcPath.equals(qualifiedDstPath)) { + // rename to itself + // - if it doesn't exist, return false + // - if it is file, return true + // - if it is dir, return false. + dstFileStatus = tryGetFileStatus(qualifiedDstPath); + if (dstFileStatus == null) { + return false; + } + return dstFileStatus.isDirectory() ? false : true; + } + + // Non-HNS account need to check dst status on driver side. + if (!abfsStore.getIsNamespaceEnabled() && dstFileStatus == null) { + dstFileStatus = tryGetFileStatus(qualifiedDstPath); + } - final FileStatus dstFileStatus = tryGetFileStatus(dst); try { String sourceFileName = src.getName(); Path adjustedDst = dst; if (dstFileStatus != null) { if (!dstFileStatus.isDirectory()) { - return src.equals(dst); + return qualifiedSrcPath.equals(qualifiedDstPath); } - adjustedDst = new Path(dst, sourceFileName); } - Path qualifiedSrcPath = makeQualified(src); - Path qualifiedDstPath = makeQualified(adjustedDst); + qualifiedDstPath = makeQualified(adjustedDst); performAbfsAuthCheck(FsAction.READ_WRITE, qualifiedSrcPath, qualifiedDstPath); abfsStore.rename(qualifiedSrcPath, qualifiedDstPath);