Author: wang Date: Fri Jun 13 19:00:03 2014 New Revision: 1602490 URL: http://svn.apache.org/r1602490 Log: HDFS-6470. TestBPOfferService.testBPInitErrorHandling is flaky. Contributed by Ming Ma.
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestBPOfferService.java Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1602490&r1=1602489&r2=1602490&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Fri Jun 13 19:00:03 2014 @@ -437,6 +437,9 @@ Release 2.5.0 - UNRELEASED HDFS-6330. Move mkdirs() to FSNamesystem. (wheat9) + HDFS-6470. TestBPOfferService.testBPInitErrorHandling is flaky. + (Ming Ma via wang) + OPTIMIZATIONS HDFS-6214. Webhdfs has poor throughput for files >2GB (daryn) Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestBPOfferService.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestBPOfferService.java?rev=1602490&r1=1602489&r2=1602490&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestBPOfferService.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestBPOfferService.java Fri Jun 13 19:00:03 2014 @@ -325,15 +325,14 @@ public class TestBPOfferService { } }).when(mockDn).initBlockPool(Mockito.any(BPOfferService.class)); BPOfferService bpos = setupBPOSForNNs(mockDn, mockNN1, mockNN2); + List<BPServiceActor> actors = bpos.getBPServiceActors(); + assertEquals(2, actors.size()); bpos.start(); try { waitForInitialization(bpos); - List<BPServiceActor> actors = bpos.getBPServiceActors(); - // even if one of the actor initialization fails also other will be - // running until both failed. - assertEquals(2, actors.size()); - BPServiceActor actor = actors.get(0); - waitForBlockReport(actor.getNameNodeProxy()); + // even if one of the actor initialization fails, the other one will be + // finish block report. + waitForBlockReport(mockNN1, mockNN2); } finally { bpos.stop(); } @@ -409,7 +408,32 @@ public class TestBPOfferService { } }, 500, 10000); } - + + private void waitForBlockReport( + final DatanodeProtocolClientSideTranslatorPB mockNN1, + final DatanodeProtocolClientSideTranslatorPB mockNN2) + throws Exception { + GenericTestUtils.waitFor(new Supplier<Boolean>() { + @Override + public Boolean get() { + return get(mockNN1) || get(mockNN2); + } + + private Boolean get(DatanodeProtocolClientSideTranslatorPB mockNN) { + try { + Mockito.verify(mockNN).blockReport( + Mockito.<DatanodeRegistration>anyObject(), + Mockito.eq(FAKE_BPID), + Mockito.<StorageBlockReport[]>anyObject()); + return true; + } catch (Throwable t) { + LOG.info("waiting on block report: " + t.getMessage()); + return false; + } + } + }, 500, 10000); + } + private ReceivedDeletedBlockInfo[] waitForBlockReceived( ExtendedBlock fakeBlock, DatanodeProtocolClientSideTranslatorPB mockNN) throws Exception {