package hdgl.db.impl;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import hdgl.db.conf.MasterConf;
import hdgl.db.protocol.ClientMasterProtocol;
import hdgl.db.protocol.RegionProtocol;
import hdgl.util.IterableHelper;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class HConn {
Configuration conf;
ClientMasterProtocol masterProtocol;
Map<Integer, RegionProtocol> regions = new HashMap<Integer, RegionProtocol>();
Map<Integer, InetSocketAddress> regionAddrs;
public HConn(Configuration conf){
this.conf = conf;
}
public ClientMasterProtocol master() throws IOException{
if(masterProtocol==null){
masterProtocol = RPC.getProxy(ClientMasterProtocol.class, 1, new InetSocketAddress(MasterConf.getMasterHost(conf), MasterConf.getClientMasterPort(conf)), conf);
}
return masterProtocol;
}
public RegionProtocol region() throws IOException{
if(!regions.isEmpty()){
return regions.get(IterableHelper.first(IterableHelper.randomTake(regions.keySet(),1)));
}else{
if(regionAddrs == null){
regionAddrs = master().getRegions();
}
return region(((Integer)IterableHelper.first(IterableHelper.randomTake(regionAddrs.keySet(),1))));
}
}
public RegionProtocol region(int regionId) throws IOException{
if(regions.containsKey(regionId)){
return regions.get(regionId);
}
if(regionAddrs == null){
regionAddrs = master().getRegions();
}
InetSocketAddress addr = regionAddrs.get(regionId);
RegionProtocol region = RPC.getProxy(RegionProtocol.class, 1, addr, conf);
regions.put(regionId, region);
return region;
}
}