diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 74c62cb0d94..87ba2ba69ce 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -1338,6 +1338,9 @@ Release 2.8.0 - UNRELEASED HADOOP-12334. Change Mode Of Copy Operation of HBase WAL Archiving to bypass Azure Storage Throttling after retries. (Gaurav Kanade via cnauroth) + HADOOP-12484. Single File Rename Throws Incorrectly In Potential Race + Condition Scenarios. (Gaurav Kanade via cnauroth) + Release 2.7.2 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/NativeAzureFileSystem.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/NativeAzureFileSystem.java index b963d5a18ee..9305b24e851 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/NativeAzureFileSystem.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/NativeAzureFileSystem.java @@ -545,10 +545,32 @@ private void finishSingleFileRename(String fileName) // Get a lease on source to block write access. String srcName = fs.pathToKey(srcFile); - SelfRenewingLease lease = fs.acquireLease(srcFile); - - // Delete the file. This will free the lease too. - fs.getStoreInterface().delete(srcName, lease); + SelfRenewingLease lease = null; + try { + lease = fs.acquireLease(srcFile); + // Delete the file. This will free the lease too. + fs.getStoreInterface().delete(srcName, lease); + } catch(AzureException e) { + String errorCode = ""; + try { + StorageException e2 = (StorageException) e.getCause(); + errorCode = e2.getErrorCode(); + } catch(Exception e3) { + // do nothing if cast fails + } + // If the rename already finished do nothing + if(!errorCode.equals("BlobNotFound")){ + throw e; + } + } finally { + try { + if(lease != null){ + lease.free(); + } + } catch(StorageException e) { + LOG.warn("Unable to free lease because: " + e.getMessage()); + } + } } else if (!srcExists && dstExists) { // The rename already finished, so do nothing. @@ -2442,4 +2464,4 @@ private static void cleanup(Logger log, java.io.Closeable closeable) { } } } -} \ No newline at end of file +}