HDFS-6798: Merging r1615044 from trunk to branch-2.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1615045 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
75349f2d83
commit
a38e398a22
|
@ -85,6 +85,9 @@ Release 2.6.0 - UNRELEASED
|
||||||
|
|
||||||
HDFS-6685. Balancer should preserve storage type of replicas. (szetszwo)
|
HDFS-6685. Balancer should preserve storage type of replicas. (szetszwo)
|
||||||
|
|
||||||
|
HDFS-6798. Add test case for incorrect data node condition during
|
||||||
|
balancing. (Benoy Antony via Arpit Agarwal)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
HDFS-6690. Deduplicate xattr names in memory. (wang)
|
HDFS-6690. Deduplicate xattr names in memory. (wang)
|
||||||
|
|
|
@ -658,6 +658,71 @@ public class TestBalancer {
|
||||||
oneNodeTest(conf, false);
|
oneNodeTest(conf, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we first start a cluster and fill the cluster up to a certain size.
|
||||||
|
* then redistribute blocks according the required distribution.
|
||||||
|
* Then we start an empty datanode.
|
||||||
|
* Afterwards a balancer is run to balance the cluster.
|
||||||
|
* A partially filled datanode is excluded during balancing.
|
||||||
|
* This triggers a situation where one of the block's location is unknown.
|
||||||
|
*/
|
||||||
|
@Test(timeout=100000)
|
||||||
|
public void testUnknownDatanode() throws Exception {
|
||||||
|
Configuration conf = new HdfsConfiguration();
|
||||||
|
initConf(conf);
|
||||||
|
long distribution[] = new long[] {50*CAPACITY/100, 70*CAPACITY/100, 0*CAPACITY/100};
|
||||||
|
long capacities[] = new long[]{CAPACITY, CAPACITY, CAPACITY};
|
||||||
|
String racks[] = new String[] {RACK0, RACK1, RACK1};
|
||||||
|
|
||||||
|
int numDatanodes = distribution.length;
|
||||||
|
if (capacities.length != numDatanodes || racks.length != numDatanodes) {
|
||||||
|
throw new IllegalArgumentException("Array length is not the same");
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate total space that need to be filled
|
||||||
|
final long totalUsedSpace = sum(distribution);
|
||||||
|
|
||||||
|
// fill the cluster
|
||||||
|
ExtendedBlock[] blocks = generateBlocks(conf, totalUsedSpace,
|
||||||
|
(short) numDatanodes);
|
||||||
|
|
||||||
|
// redistribute blocks
|
||||||
|
Block[][] blocksDN = distributeBlocks(
|
||||||
|
blocks, (short)(numDatanodes-1), distribution);
|
||||||
|
|
||||||
|
// restart the cluster: do NOT format the cluster
|
||||||
|
conf.set(DFSConfigKeys.DFS_NAMENODE_SAFEMODE_THRESHOLD_PCT_KEY, "0.0f");
|
||||||
|
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(numDatanodes)
|
||||||
|
.format(false)
|
||||||
|
.racks(racks)
|
||||||
|
.simulatedCapacities(capacities)
|
||||||
|
.build();
|
||||||
|
try {
|
||||||
|
cluster.waitActive();
|
||||||
|
client = NameNodeProxies.createProxy(conf, cluster.getFileSystem(0).getUri(),
|
||||||
|
ClientProtocol.class).getProxy();
|
||||||
|
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
cluster.injectBlocks(i, Arrays.asList(blocksDN[i]), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster.startDataNodes(conf, 1, true, null,
|
||||||
|
new String[]{RACK0}, null,new long[]{CAPACITY});
|
||||||
|
cluster.triggerHeartbeats();
|
||||||
|
|
||||||
|
Collection<URI> namenodes = DFSUtil.getNsServiceRpcUris(conf);
|
||||||
|
Set<String> datanodes = new HashSet<String>();
|
||||||
|
datanodes.add(cluster.getDataNodes().get(0).getDatanodeId().getHostName());
|
||||||
|
Balancer.Parameters p = new Balancer.Parameters(
|
||||||
|
Balancer.Parameters.DEFAULT.policy,
|
||||||
|
Balancer.Parameters.DEFAULT.threshold,
|
||||||
|
datanodes, Balancer.Parameters.DEFAULT.nodesToBeIncluded);
|
||||||
|
final int r = Balancer.run(namenodes, p, conf);
|
||||||
|
assertEquals(Balancer.ReturnStatus.SUCCESS.code, r);
|
||||||
|
} finally {
|
||||||
|
cluster.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test parse method in Balancer#Cli class with threshold value out of
|
* Test parse method in Balancer#Cli class with threshold value out of
|
||||||
* boundaries.
|
* boundaries.
|
||||||
|
|
Loading…
Reference in New Issue