瀏覽代碼

HADOOP-12484. Single File Rename Throws Incorrectly In Potential Race Condition Scenarios. Contributed by Gaurav Kanade.

cnauroth 9 年之前
父節點
當前提交
cb282d5b89

+ 3 - 0
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

+ 27 - 5
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/NativeAzureFileSystem.java

@@ -545,10 +545,32 @@ public class NativeAzureFileSystem extends FileSystem {
 
         // 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 @@ public class NativeAzureFileSystem extends FileSystem {
       }
     }
   }
-}
+}