HDFS-10426. TestPendingInvalidateBlock failed in trunk. Contributed by Yiqun Lin.

This commit is contained in:
Masatake Iwasaki 2016-09-28 01:29:24 +09:00
parent df1d0f5d56
commit f55eb981dd
1 changed files with 34 additions and 3 deletions

View File

@ -18,7 +18,6 @@
package org.apache.hadoop.hdfs.server.blockmanagement;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeys;
@ -40,6 +39,8 @@ import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import com.google.common.base.Supplier;
/**
* Test if we can correctly delay the deletion of blocks.
*/
@ -87,13 +88,24 @@ public class TestPendingInvalidateBlock {
DFSTestUtil.createFile(dfs, foo, BLOCKSIZE, REPLICATION, 0);
// restart NN
cluster.restartNameNode(true);
InvalidateBlocks invalidateBlocks =
(InvalidateBlocks) Whitebox.getInternalState(cluster.getNamesystem()
.getBlockManager(), "invalidateBlocks");
InvalidateBlocks mockIb = Mockito.spy(invalidateBlocks);
// Return invalidation delay to delay the block's deletion
Mockito.doReturn(1L).when(mockIb).getInvalidationDelay();
Whitebox.setInternalState(cluster.getNamesystem().getBlockManager(),
"invalidateBlocks", mockIb);
dfs.delete(foo, true);
Assert.assertEquals(0, cluster.getNamesystem().getBlocksTotal());
Assert.assertEquals(REPLICATION, cluster.getNamesystem()
.getPendingDeletionBlocks());
Assert.assertEquals(REPLICATION,
dfs.getPendingDeletionBlocksCount());
Thread.sleep(6000);
Mockito.doReturn(0L).when(mockIb).getInvalidationDelay();
waitForBlocksToDelete();
Assert.assertEquals(0, cluster.getNamesystem().getBlocksTotal());
Assert.assertEquals(0, cluster.getNamesystem().getPendingDeletionBlocks());
Assert.assertEquals(0, dfs.getPendingDeletionBlocksCount());
@ -170,7 +182,7 @@ public class TestPendingInvalidateBlock {
Assert.assertEquals(4, cluster.getNamesystem().getPendingDeletionBlocks());
cluster.restartNameNode(true);
Thread.sleep(6000);
waitForBlocksToDelete();
Assert.assertEquals(3, cluster.getNamesystem().getBlocksTotal());
Assert.assertEquals(0, cluster.getNamesystem().getPendingDeletionBlocks());
}
@ -187,4 +199,23 @@ public class TestPendingInvalidateBlock {
return cluster.getNamesystem().getUnderReplicatedBlocks();
}
private void waitForBlocksToDelete() throws Exception {
GenericTestUtils.waitFor(new Supplier<Boolean>() {
@Override
public Boolean get() {
try {
cluster.triggerBlockReports();
if (cluster.getNamesystem().getPendingDeletionBlocks() == 0) {
return true;
}
} catch (Exception e) {
// Ignore the exception
}
return false;
}
}, 6000, 60000);
}
}