package com.github.zangxiaoqiang.dfc.locator;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
import com.github.zangxiaoqiang.dfc.CacheNode;
import com.github.zangxiaoqiang.dfc.HashAlgorithm;
import com.github.zangxiaoqiang.dfc.Node;
import com.github.zangxiaoqiang.dfc.utils.Context;
/**
* Old KetamaNodeLocator: just for backup
* @author hadoop
*
*/
public final class KetamaNodeLocator1 extends CommonNodeLocator{
private TreeMap<Long, Node> ketamaNodes;
private HashAlgorithm hashAlg;
private int numReps = 160;
public static final String SERVER_FILE = "server.properties";
public KetamaNodeLocator1(HashAlgorithm alg, int nodeCopies) {
hashAlg = alg;
ketamaNodes = new TreeMap<Long, Node>();
numReps = nodeCopies;
for (Node node : getNodes()) {
for (int i = 0; i < numReps / 4; i++) {
byte[] md5 = hashAlg.computeMd5(node.getName() + i);
for (int h = 0; h < 4; h++) {
long m = hashAlg.hash(md5, h);
ketamaNodes.put(m, node);
}
}
}
}
private List<Node> getNodes() {
List<Node> nodes = new ArrayList<Node>();
List<String> serverList = Context.loadFile(SERVER_FILE);
for (String server : serverList) {
String hostname = server.split(":")[0];
int port = Integer.valueOf(server.split(":")[1]);
Node node = new Node(hostname);
nodes.add(node);
}
return nodes;
}
public Node getNode(final String filePath) {
Node rv = getNodeByKey(getPathHash(hashAlg, filePath));
return rv;
}
private Node getNodeByKey(long hash) {
final Node rv;
Long key = hash;
if (!ketamaNodes.containsKey(key)) {
// SortedMap<Long, Node> tailMap = ketamaNodes.tailMap(key);
// if (tailMap.isEmpty()) {
// key = ketamaNodes.firstKey();
// } else {
// key = tailMap.firstKey();
// }
// For JDK1.6 version
key = ketamaNodes.ceilingKey(key);
if (key == null) {
key = ketamaNodes.firstKey();
}
}
rv = ketamaNodes.get(key);
return rv;
}
@Override
public CacheNode getCacheNode(String filePath) {
// TODO Auto-generated method stub
return null;
}
}