Sfoglia il codice sorgente

HDFS-2484. checkLease should throw FileNotFoundException when file does not exist. Contributed by Rakesh R.

Konstantin V Shvachko 10 anni fa
parent
commit
c75cfa29cf

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -635,6 +635,9 @@ Release 2.8.0 - UNRELEASED
     HDFS-8310. Fix TestCLI.testAll "help: help for find" on Windows.
     (Kiran Kumar M R via Xiaoyu Yao)
 
+    HDFS-2484. checkLease should throw FileNotFoundException when file does
+    not exist. (Rakesh R via shv)
+
 Release 2.7.1 - UNRELEASED
 
   INCOMPATIBLE CHANGES

+ 1 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

@@ -3451,7 +3451,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
     final String ident = src + " (inode " + fileId + ")";
     if (inode == null) {
       Lease lease = leaseManager.getLease(holder);
-      throw new LeaseExpiredException(
+      throw new FileNotFoundException(
           "No lease on " + ident + ": File does not exist. "
           + (lease != null ? lease.toString()
               : "Holder " + holder + " does not have any open files."));

+ 2 - 3
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestFileCreation.java

@@ -78,7 +78,6 @@ import org.apache.hadoop.hdfs.server.datanode.DataNodeTestUtils;
 import org.apache.hadoop.hdfs.server.datanode.SimulatedFSDataset;
 import org.apache.hadoop.hdfs.server.datanode.fsdataset.FsDatasetSpi;
 import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
-import org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException;
 import org.apache.hadoop.hdfs.server.namenode.LeaseManager;
 import org.apache.hadoop.hdfs.server.namenode.NameNode;
 import org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter;
@@ -1212,8 +1211,8 @@ public class TestFileCreation {
         cluster.getNameNodeRpc()
             .complete(f.toString(), client.clientName, null, someOtherFileId);
         fail();
-      } catch(LeaseExpiredException e) {
-        FileSystem.LOG.info("Caught Expected LeaseExpiredException: ", e);
+      } catch(FileNotFoundException e) {
+        FileSystem.LOG.info("Caught Expected FileNotFoundException: ", e);
       }
     } finally {
       IOUtils.closeStream(dfs);

+ 15 - 1
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestLease.java

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
 
 import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.security.PrivilegedExceptionAction;
 
@@ -50,6 +51,7 @@ import org.apache.hadoop.io.EnumSetWritable;
 import org.apache.hadoop.ipc.RemoteException;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.token.SecretManager.InvalidToken;
+import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.hadoop.util.Time;
 import org.junit.Assert;
 import org.junit.Test;
@@ -321,8 +323,20 @@ public class TestLease {
 
       Assert.assertTrue(!hasLease(cluster, a));
       Assert.assertTrue(!hasLease(cluster, b));
-      
+
+      Path fileA = new Path(dir, "fileA");
+      FSDataOutputStream fileA_out = fs.create(fileA);
+      fileA_out.writeBytes("something");
+      Assert.assertTrue("Failed to get the lease!", hasLease(cluster, fileA));
+
       fs.delete(dir, true);
+      try {
+        fileA_out.hflush();
+        Assert.fail("Should validate file existence!");
+      } catch (FileNotFoundException e) {
+        // expected
+        GenericTestUtils.assertExceptionContains("File does not exist", e);
+      }
     } finally {
       if (cluster != null) {cluster.shutdown();}
     }