blob: b396f9d1e80bf6c60cb043d789e29c7a2ef7b6a0 [file] [log] [blame]
/**
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.tools.rumen;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import org.apache.hadoop.tools.rumen.datatypes.NodeName;
public class ParsedHost {
private final String rackName;
private final String nodeName;
/**
* TODO the following only works for /rack/host format. Change to support
* arbitrary level of network names.
*/
private static final Pattern splitPattern = Pattern
.compile("/([^/]+)/([^/]+)");
/**
* TODO handle arbitrary level of network names.
*/
static int numberOfDistances() {
return 3;
}
String nameComponent(int i) throws IllegalArgumentException {
switch (i) {
case 0:
return rackName;
case 1:
return nodeName;
default:
throw new IllegalArgumentException(
"Host location component index out of range.");
}
}
@Override
public int hashCode() {
return rackName.hashCode() * 17 + nodeName.hashCode();
}
public static ParsedHost parse(String name) {
// separate out the node name
Matcher matcher = splitPattern.matcher(name);
if (!matcher.matches())
return null;
return new ParsedHost(matcher.group(1), matcher.group(2));
}
private String process(String name) {
return name == null
? null
: name.startsWith("/") ? name.substring(1) : name;
}
public ParsedHost(LoggedLocation loc) {
List<NodeName> coordinates = loc.getLayers();
rackName = coordinates.get(0).getRackName();
nodeName = coordinates.get(1).getHostName();
}
LoggedLocation makeLoggedLocation() {
LoggedLocation result = new LoggedLocation();
List<String> coordinates = new ArrayList<String>();
coordinates.add(rackName);
coordinates.add(nodeName);
result.setLayers(coordinates);
return result;
}
public String getNodeName() {
return nodeName;
}
public String getRackName() {
return rackName;
}
// expects the broadest name first
ParsedHost(String rackName, String nodeName) {
this.rackName = process(rackName);
this.nodeName = process(nodeName);
}
@Override
public boolean equals(Object other) {
if (!(other instanceof ParsedHost)) {
return false;
}
ParsedHost host = (ParsedHost) other;
return (nodeName.equals(host.nodeName) && rackName.equals(host.rackName));
}
int distance(ParsedHost other) {
if (nodeName.equals(other.nodeName)) {
return 0;
}
if (rackName.equals(other.rackName)) {
return 1;
}
return 2;
}
}