package com.alibaba.doris.dataserver.migrator.connection;
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.alibaba.doris.client.net.Connection;
import com.alibaba.doris.client.net.ConnectionFactory;
import com.alibaba.doris.client.net.NetException;
import com.alibaba.doris.client.net.OperationFuture;
import com.alibaba.doris.client.net.command.CheckCommand.Type;
import com.alibaba.doris.client.net.command.result.CheckResult;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.Value;
/**
* @author helios
*/
public class ThreadLocalConnection implements Connection {
private Map<String, Connection> connectionHold = new ConcurrentHashMap<String, Connection>();
private InetSocketAddress address;
public ThreadLocalConnection(InetSocketAddress address) {
this.address = address;
getConnection();
}
public Connection getConnection() {
Connection c = connectionHold.get(Thread.currentThread().toString());
if (c == null || !c.isConnected()) {
// Ignore double check problem
synchronized (this) {
c = connectionHold.get(Thread.currentThread().toString());
if (c == null || !c.isConnected()) {
c = makeConnection(address);
connectionHold.put(Thread.currentThread().toString(), c);
}
}
}
return c;
}
public void close() {
for (Connection c : connectionHold.values()) {
if (c != null && c.isConnected()) {
try {
c.close();
} catch (Exception e) {
// do nothing
}
}
}
connectionHold.clear();
}
private Connection makeConnection(InetSocketAddress remoteAddress) {
ConnectionFactory factory = ConnectionFactory.getInstance();
Connection c = factory.getConnection(remoteAddress);
// Here will throw an exception when this connection couldn't be established.
c.open();
return c;
}
public void open() throws NetException {
getConnection().open();
}
public boolean isConnected() {
return getConnection().isConnected();
}
public OperationFuture<Boolean> put(Key key, Value value) {
return getConnection().put(key, value);
}
public OperationFuture<Boolean> cas(Key key, Value value) {
return getConnection().cas(key, value);
}
public OperationFuture<Boolean> puts(Map<Key, Value> map) {
return getConnection().puts(map);
}
public OperationFuture<Value> get(Key key) {
return getConnection().get(key);
}
public OperationFuture<Map<Key, Value>> gets(Set<Key> keys) {
return getConnection().gets(keys);
}
public OperationFuture<Boolean> delete(Key key) {
return getConnection().delete(key);
}
public OperationFuture<Boolean> cad(Key key, Value value) {
return getConnection().cad(key, value);
}
public OperationFuture<String> migrate(String subcommand, String migrateRoute) {
return getConnection().migrate(subcommand, migrateRoute);
}
public OperationFuture<String> stats(String viewType, int namespace) {
return getConnection().stats(viewType, namespace);
}
public OperationFuture<CheckResult> check(Type checkType) {
return getConnection().check(checkType);
}
}