You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by co...@apache.org on 2009/12/16 04:01:26 UTC
svn commit: r891106 - in /hadoop/hdfs/trunk: CHANGES.txt
src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java
Author: cos
Date: Wed Dec 16 03:01:26 2009
New Revision: 891106
URL: http://svn.apache.org/viewvc?rev=891106&view=rev
Log:
HDFS-812. FSNamesystem#internalReleaseLease throws NullPointerException on a single-block file's lease recovery. Contributed by Konstantin Boudnik
Modified:
hadoop/hdfs/trunk/CHANGES.txt
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java
Modified: hadoop/hdfs/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/CHANGES.txt?rev=891106&r1=891105&r2=891106&view=diff
==============================================================================
--- hadoop/hdfs/trunk/CHANGES.txt (original)
+++ hadoop/hdfs/trunk/CHANGES.txt Wed Dec 16 03:01:26 2009
@@ -96,6 +96,9 @@
HDFS-825. Build fails to pull latest hadoop-core-* artifacts (cos)
+ HDFS-812. FSNamesystem#internalReleaseLease throws NullPointerException on
+ a single-block file's lease recovery. (cos)
+
Release 0.21.0 - Unreleased
INCOMPATIBLE CHANGES
Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=891106&r1=891105&r2=891106&view=diff
==============================================================================
--- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Wed Dec 16 03:01:26 2009
@@ -1953,8 +1953,17 @@
BlockInfoUnderConstruction lastBlock = pendingFile.getLastBlock();
BlockUCState lastBlockState = lastBlock.getBlockUCState();
BlockInfo penultimateBlock = pendingFile.getPenultimateBlock();
- BlockUCState penultimateBlockState = (penultimateBlock == null ?
- BlockUCState.COMPLETE : penultimateBlock.getBlockUCState());
+ boolean penultimateBlockMinReplication;
+ BlockUCState penultimateBlockState;
+ if (penultimateBlock == null) {
+ penultimateBlockState = BlockUCState.COMPLETE;
+ // If penultimate block doesn't exist then its minReplication is met
+ penultimateBlockMinReplication = true;
+ } else {
+ penultimateBlockState = BlockUCState.COMMITTED;
+ penultimateBlockMinReplication =
+ blockManager.checkMinReplication(penultimateBlock);
+ }
assert penultimateBlockState == BlockUCState.COMPLETE ||
penultimateBlockState == BlockUCState.COMMITTED :
"Unexpected state of penultimate block in " + src;
@@ -1965,7 +1974,7 @@
break;
case COMMITTED:
// Close file if committed blocks are minimally replicated
- if(blockManager.checkMinReplication(penultimateBlock) &&
+ if(penultimateBlockMinReplication &&
blockManager.checkMinReplication(lastBlock)) {
finalizeINodeFileUnderConstruction(src, pendingFile);
NameNode.stateChangeLog.warn("BLOCK*"
Modified: hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java?rev=891106&r1=891105&r2=891106&view=diff
==============================================================================
--- hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java (original)
+++ hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java Wed Dec 16 03:01:26 2009
@@ -157,6 +157,27 @@
assertTrue("FSNamesystem.internalReleaseLease suppose to throw " +
"AlreadyBeingCreatedException here", false);
}
+
+ /**
+ * Mocks FSNamesystem instance, adds an empty file with 0 blocks
+ * and invokes lease recovery method.
+ *
+ */
+ @Test
+ public void testInternalReleaseLease_0blocks () throws IOException {
+ LOG.debug("Running " + GenericTestUtils.getMethodName());
+ LeaseManager.Lease lm = mock(LeaseManager.Lease.class);
+ Path file =
+ spy(new Path("/" + GenericTestUtils.getMethodName() + "_test.dat"));
+ DatanodeDescriptor dnd = mock(DatanodeDescriptor.class);
+ PermissionStatus ps =
+ new PermissionStatus("test", "test", new FsPermission((short)0777));
+
+ mockFileBlocks(0, null, null, file, dnd, ps, false);
+
+ assertTrue("True has to be returned in this case",
+ fsn.internalReleaseLease(lm, file.toString(), null));
+ }
/**
* Mocks FSNamesystem instance, adds an empty file with 1 block
@@ -346,16 +367,6 @@
when(b.getBlockUCState()).thenReturn(penUltState);
when(b1.getBlockUCState()).thenReturn(lastState);
BlockInfo[] blocks;
- switch (fileBlocksNumber) {
- case 0:
- blocks = new BlockInfo[0];
- break;
- case 1:
- blocks = new BlockInfo[]{b1};
- break;
- default:
- blocks = new BlockInfo[]{b, b1};
- }
FSDirectory fsDir = mock(FSDirectory.class);
INodeFileUnderConstruction iNFmock = mock(INodeFileUnderConstruction.class);
@@ -368,14 +379,29 @@
when(fsn.getFSImage().getEditLog()).thenReturn(editLog);
fsn.getFSImage().setFSNamesystem(fsn);
+ switch (fileBlocksNumber) {
+ case 0:
+ blocks = new BlockInfo[0];
+ break;
+ case 1:
+ blocks = new BlockInfo[]{b1};
+ when(iNFmock.getLastBlock()).thenReturn(b1);
+ break;
+ default:
+ when(iNFmock.getPenultimateBlock()).thenReturn(b);
+ when(iNFmock.getLastBlock()).thenReturn(b1);
+ blocks = new BlockInfo[]{b, b1};
+ }
+
when(iNFmock.getBlocks()).thenReturn(blocks);
- when(iNFmock.numBlocks()).thenReturn(2);
- when(iNFmock.getPenultimateBlock()).thenReturn(b);
- when(iNFmock.getLastBlock()).thenReturn(b1);
+ when(iNFmock.numBlocks()).thenReturn(blocks.length);
when(iNFmock.isUnderConstruction()).thenReturn(true);
+ when(iNFmock.convertToInodeFile()).thenReturn(iNFmock);
fsDir.addFile(file.toString(), ps, (short)3, 1l, "test",
"test-machine", dnd, 1001l);
+ fsn.leaseManager = mock(LeaseManager.class);
+ fsn.leaseManager.addLease("mock-lease", file.toString());
if (setStoredBlock) {
when(b1.getINode()).thenReturn(iNFmock);
fsn.blockManager.blocksMap.addINode(b1, iNFmock);