HDFS-13028. RBF: Fix spurious TestRouterRpc#testProxyGetStats. Contributed by Inigo Goiri.

This commit is contained in:
Inigo Goiri 2018-01-19 09:47:40 -08:00
parent d689b2d99c
commit 130f8bce00
1 changed files with 33 additions and 13 deletions

View File

@ -82,6 +82,7 @@
import org.apache.hadoop.io.erasurecode.ErasureCodeConstants; import org.apache.hadoop.io.erasurecode.ErasureCodeConstants;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.service.Service.STATE; import org.apache.hadoop.service.Service.STATE;
import org.apache.hadoop.test.GenericTestUtils;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
@ -89,6 +90,7 @@
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.google.common.base.Supplier;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
/** /**
@ -501,9 +503,37 @@ public void testProxyChownFiles() throws Exception {
@Test @Test
public void testProxyGetStats() throws Exception { public void testProxyGetStats() throws Exception {
// Some of the statistics are out of sync because of the mini cluster
Supplier<Boolean> check = new Supplier<Boolean>() {
@Override
public Boolean get() {
try {
long[] combinedData = routerProtocol.getStats(); long[] combinedData = routerProtocol.getStats();
long[] individualData = getAggregateStats();
int len = Math.min(combinedData.length, individualData.length);
for (int i = 0; i < len; i++) {
if (combinedData[i] != individualData[i]) {
LOG.error("Stats for {} don't match: {} != {}",
i, combinedData[i], individualData[i]);
return false;
}
}
return true;
} catch (Exception e) {
LOG.error("Cannot get stats: {}", e.getMessage());
return false;
}
}
};
GenericTestUtils.waitFor(check, 500, 5 * 1000);
}
/**
* Get the sum of each subcluster statistics.
* @return Aggregated statistics.
* @throws Exception If it cannot get the stats from the Router or Namenode.
*/
private long[] getAggregateStats() throws Exception {
long[] individualData = new long[10]; long[] individualData = new long[10];
for (String nameservice : cluster.getNameservices()) { for (String nameservice : cluster.getNameservices()) {
NamenodeContext n = cluster.getNamenode(nameservice, null); NamenodeContext n = cluster.getNamenode(nameservice, null);
@ -513,18 +543,8 @@ public void testProxyGetStats() throws Exception {
for (int i = 0; i < data.length; i++) { for (int i = 0; i < data.length; i++) {
individualData[i] += data[i]; individualData[i] += data[i];
} }
assertEquals(data.length, combinedData.length);
}
for (int i = 0; i < combinedData.length && i < individualData.length; i++) {
if (i == ClientProtocol.GET_STATS_REMAINING_IDX) {
// Skip available storage as this fluctuates in mini cluster
continue;
}
assertEquals("Stats for " + i + " don't match: " +
combinedData[i] + "!=" + individualData[i],
combinedData[i], individualData[i]);
} }
return individualData;
} }
@Test @Test