From c75cfa29cfc527242837d80962688aa53c111e72 Mon Sep 17 00:00:00 2001 From: Konstantin V Shvachko Date: Wed, 6 May 2015 16:06:04 -0700 Subject: [PATCH] HDFS-2484. checkLease should throw FileNotFoundException when file does not exist. Contributed by Rakesh R. --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hdfs/server/namenode/FSNamesystem.java | 2 +- .../org/apache/hadoop/hdfs/TestFileCreation.java | 5 ++--- .../java/org/apache/hadoop/hdfs/TestLease.java | 16 +++++++++++++++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index a87837433ae..d2e50b8bcfa 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/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 diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 72e1d32eca4..84cb905eb6a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -3451,7 +3451,7 @@ private INodeFile checkLease(String src, String holder, INode inode, 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.")); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestFileCreation.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestFileCreation.java index f56ff9eb7b2..f732ace684e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestFileCreation.java +++ b/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.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 void testFileIdMismatch() throws IOException { 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); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestLease.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestLease.java index 88dbd5e7866..90dc0a784b7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestLease.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestLease.java @@ -27,6 +27,7 @@ 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.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 void testLease() throws Exception { 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();} }