TestRouterMultiRack.java
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hdfs.server.federation.router;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.*;
import org.apache.hadoop.hdfs.protocol.ECTopologyVerifierResult;
import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.NamenodeContext;
import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.RouterContext;
import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder;
import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster;
import org.apache.hadoop.hdfs.server.federation.resolver.MultipleDestinationMountTableResolver;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Test class with clusters having multiple racks.
*/
public class TestRouterMultiRack {
private static StateStoreDFSCluster cluster;
private static RouterContext routerContext;
private static DistributedFileSystem routerFs;
private static NamenodeContext nnContext0;
private static NamenodeContext nnContext1;
private static DistributedFileSystem nnFs0;
private static DistributedFileSystem nnFs1;
@BeforeAll
public static void setUp() throws Exception {
// Build and start a federated cluster
cluster = new StateStoreDFSCluster(false, 2,
MultipleDestinationMountTableResolver.class);
Configuration routerConf =
new RouterConfigBuilder().stateStore().admin().quota().rpc().build();
Configuration hdfsConf = new Configuration(false);
cluster.addNamenodeOverrides(hdfsConf);
cluster.addRouterOverrides(routerConf);
cluster.setNumDatanodesPerNameservice(9);
cluster.setIndependentDNs();
cluster.setRacks(
new String[] {"/rack1", "/rack1", "/rack1", "/rack2", "/rack2",
"/rack2", "/rack3", "/rack3", "/rack3", "/rack4", "/rack4",
"/rack4", "/rack5", "/rack5", "/rack5", "/rack6", "/rack6",
"/rack6"});
cluster.startCluster();
cluster.startRouters();
cluster.waitClusterUp();
routerContext = cluster.getRandomRouter();
routerFs = (DistributedFileSystem) routerContext.getFileSystem();
nnContext0 = cluster.getNamenode("ns0", null);
nnContext1 = cluster.getNamenode("ns1", null);
nnFs0 = (DistributedFileSystem) nnContext0.getFileSystem();
nnFs1 = (DistributedFileSystem) nnContext1.getFileSystem();
}
@AfterAll
public static void tearDown() {
if (cluster != null) {
cluster.stopRouter(routerContext);
cluster.shutdown();
cluster = null;
}
}
@Test
public void testGetECTopologyResultForPolicies() throws IOException {
routerFs.enableErasureCodingPolicy("RS-6-3-1024k");
// No policies specified should return result for the enabled policy.
ECTopologyVerifierResult result = routerFs.getECTopologyResultForPolicies();
assertTrue(result.isSupported());
// Specified policy requiring more datanodes than present in
// the actual cluster.
result = routerFs.getECTopologyResultForPolicies("RS-10-4-1024k");
assertFalse(result.isSupported());
// Specify multiple policies with one policy requiring more datanodes than
// present in the actual cluster
result = routerFs
.getECTopologyResultForPolicies("RS-10-4-1024k", "RS-3-2-1024k");
assertFalse(result.isSupported());
// Specify multiple policies that require datanodes equal or less then
// present in the actual cluster
result = routerFs
.getECTopologyResultForPolicies("XOR-2-1-1024k", "RS-3-2-1024k");
assertTrue(result.isSupported());
// Specify multiple policies with one policy requiring more datanodes than
// present in the actual cluster
result = routerFs
.getECTopologyResultForPolicies("RS-10-4-1024k", "RS-3-2-1024k");
assertFalse(result.isSupported());
// Enable a policy requiring more datanodes than present in
// the actual cluster.
routerFs.enableErasureCodingPolicy("RS-10-4-1024k");
result = routerFs.getECTopologyResultForPolicies();
assertFalse(result.isSupported());
// Check without specifying any policy, with one cluster having
// all supported, but one cluster having one unsupported policy. The
nnFs0.disableErasureCodingPolicy("RS-10-4-1024k");
nnFs1.enableErasureCodingPolicy("RS-10-4-1024k");
result = routerFs.getECTopologyResultForPolicies();
assertFalse(result.isSupported());
nnFs1.disableErasureCodingPolicy("RS-10-4-1024k");
nnFs0.enableErasureCodingPolicy("RS-10-4-1024k");
result = routerFs.getECTopologyResultForPolicies();
assertFalse(result.isSupported());
}
}