Skip to content

Commit 9a24b42

Browse files
committed
Supplemental unit tests
1 parent db14c0a commit 9a24b42

File tree

1 file changed

+72
-0
lines changed
  • hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement

1 file changed

+72
-0
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockManager.java

+72
Original file line numberDiff line numberDiff line change
@@ -2201,4 +2201,76 @@ public void testBlockReportSetNoAckBlockToInvalidate() throws Exception {
22012201
assertEquals(1, getLongCounter("IncrementalBlockReportsNumOps", rb));
22022202
}
22032203
}
2204+
2205+
@Test
2206+
public void testTwoFBRSInARow() throws Exception{
2207+
DatanodeDescriptor node = spy(nodes.get(0));
2208+
node.setAlive(true);
2209+
2210+
DatanodeRegistration nodeReg =
2211+
new DatanodeRegistration(node, null, null, "");
2212+
2213+
// pretend to be in safemode
2214+
doReturn(true).when(fsn).isInStartupSafeMode();
2215+
2216+
// register new node
2217+
bm.getDatanodeManager().registerDatanode(nodeReg);
2218+
bm.getDatanodeManager().addDatanode(node);
2219+
assertEquals(node, bm.getDatanodeManager().getDatanode(node));
2220+
2221+
DatanodeStorageInfo[] storageInfos = node.getStorageInfos();
2222+
for (int r = 0; r < storageInfos.length; r++) {
2223+
DatanodeStorageInfo storageInfo = storageInfos[r];
2224+
assertEquals(0, storageInfo.getBlockReportCount());
2225+
}
2226+
2227+
reset(node);
2228+
// 1.Here's the original logic
2229+
BlockReportLeaseManager brlm = new BlockReportLeaseManager(new Configuration());
2230+
// This is the first FBR
2231+
for (int r = 0; r < storageInfos.length; r++) {
2232+
bm.processReport(node, new DatanodeStorage(storageInfos[r].getStorageID()),
2233+
BlockListAsLongs.EMPTY, null, storageInfos.length, r + 1);
2234+
//The first FBR times out because the namenode is busy,
2235+
break;
2236+
}
2237+
//and then the second FBR is the same
2238+
for (int r = 0; r < storageInfos.length; r++) {
2239+
bm.processReport(node, new DatanodeStorage(storageInfos[r].getStorageID()),
2240+
BlockListAsLongs.EMPTY, null, storageInfos.length, r + 1);
2241+
//In the original method, sending FBR twice from one disk will call removeLease
2242+
brlm.removeLease(node);
2243+
//Starting from the second disk, FBR will fail because the lease is removed
2244+
break;
2245+
}
2246+
2247+
assertEquals(2, storageInfos[0].getBlockReportCount());
2248+
assertEquals(0, storageInfos[1].getBlockReportCount());
2249+
assertEquals(0, storageInfos[2].getBlockReportCount());
2250+
assertEquals(0, storageInfos[3].getBlockReportCount());
2251+
assertEquals(0, storageInfos[4].getBlockReportCount());
2252+
assertEquals(0, storageInfos[5].getBlockReportCount());
2253+
2254+
2255+
reset(node);
2256+
//2. Now the processReport method calls removeLease only when it determines that it is the last disk
2257+
// This is the first FBR
2258+
for (int r = 0; r < storageInfos.length; r++) {
2259+
bm.processReport(node, new DatanodeStorage(storageInfos[r].getStorageID()),
2260+
BlockListAsLongs.EMPTY, null, storageInfos.length, r + 1);
2261+
//The first FBR times out because the namenode is busy, and then the second FBR is the same
2262+
break;
2263+
}
2264+
for (int r = 0; r < storageInfos.length; r++) {
2265+
bm.processReport(node, new DatanodeStorage(storageInfos[r].getStorageID()),
2266+
BlockListAsLongs.EMPTY, null, storageInfos.length, r + 1);
2267+
}
2268+
2269+
assertEquals(2, storageInfos[0].getBlockReportCount());
2270+
assertEquals(1, storageInfos[1].getBlockReportCount());
2271+
assertEquals(1, storageInfos[2].getBlockReportCount());
2272+
assertEquals(1, storageInfos[3].getBlockReportCount());
2273+
assertEquals(1, storageInfos[4].getBlockReportCount());
2274+
assertEquals(1, storageInfos[5].getBlockReportCount());
2275+
}
22042276
}

0 commit comments

Comments
 (0)