From 300f772c36da7e616afbf94df19238d6ac70e69d Mon Sep 17 00:00:00 2001 From: Da Zhou Date: Tue, 27 Nov 2018 18:13:07 +0000 Subject: [PATCH] HADOOP-15940. ABFS: For HNS account, avoid unnecessary get call when doing Rename. Contributed by Da Zhou (cherry picked from commit 1a3a4960d91aa594283e447963fb2e407d4c6af5) --- .../fs/azurebfs/AzureBlobFileSystem.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) 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 7d805421d9..38b0c7779b 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);