use of com.alibaba.cobar.CobarConfig in project cobar by alibaba.
the class SingleNodeExecutor method newExecute.
/**
* 新数据通道的执行
*/
private void newExecute(final RouteResultsetNode rrn, final BlockingSession ss, final int flag) {
final ServerConnection sc = ss.getSource();
// 检查数据节点是否存在
CobarConfig conf = CobarServer.getInstance().getConfig();
final MySQLDataNode dn = conf.getDataNodes().get(rrn.getName());
if (dn == null) {
LOGGER.warn(new StringBuilder().append(sc).append(rrn).toString(), new UnknownDataNodeException());
handleError(ErrorCode.ER_BAD_DB_ERROR, "Unknown dataNode '" + rrn.getName() + "'", ss);
return;
}
// 提交执行任务
sc.getProcessor().getExecutor().execute(new Runnable() {
@Override
public void run() {
// 取得数据通道
int i = rrn.getReplicaIndex();
Channel c = null;
try {
c = (i == DEFAULT_REPLICA_INDEX) ? dn.getChannel() : dn.getChannel(i);
} catch (Exception e) {
LOGGER.warn(new StringBuilder().append(sc).append(rrn).toString(), e);
String msg = e.getMessage();
handleError(ErrorCode.ER_BAD_DB_ERROR, msg == null ? e.getClass().getSimpleName() : msg, ss);
return;
}
// 检查连接是否已关闭。
if (sc.isClosed()) {
c.release();
endRunning();
return;
}
// 绑定数据通道
c.setRunning(true);
Channel old = ss.getTarget().put(rrn, c);
if (old != null && old != c) {
old.close();
}
// 执行
execute0(rrn, ss, c, flag);
}
});
}
use of com.alibaba.cobar.CobarConfig in project cobar by alibaba.
the class SingleNodeHandler method execute.
public void execute() throws Exception {
lock.lock();
try {
this.isRunning = true;
this.packetId = 0;
this.buffer = session.getSource().allocate();
} finally {
lock.unlock();
}
final MySQLConnection conn = session.getTarget(route);
if (conn == null) {
CobarConfig conf = CobarServer.getInstance().getConfig();
MySQLDataNode dn = conf.getDataNodes().get(route.getName());
dn.getConnection(this, null);
} else {
conn.setRunning(true);
session.getSource().getProcessor().getExecutor().execute(new Runnable() {
@Override
public void run() {
_execute(conn);
}
});
}
}
use of com.alibaba.cobar.CobarConfig in project cobar by alibaba.
the class ShowCobarCluster method getRows.
private static List<RowDataPacket> getRows(ServerConnection c) {
List<RowDataPacket> rows = new LinkedList<RowDataPacket>();
CobarConfig config = CobarServer.getInstance().getConfig();
CobarCluster cluster = config.getCluster();
Map<String, SchemaConfig> schemas = config.getSchemas();
SchemaConfig schema = (c.getSchema() == null) ? null : schemas.get(c.getSchema());
// 如果没有指定schema或者schema为null,则使用全部集群。
if (schema == null) {
Map<String, CobarNode> nodes = cluster.getNodes();
for (CobarNode n : nodes.values()) {
if (n != null && n.isOnline()) {
rows.add(getRow(n, c.getCharset()));
}
}
} else {
String group = (schema.getGroup() == null) ? "default" : schema.getGroup();
List<String> nodeList = cluster.getGroups().get(group);
if (nodeList != null && nodeList.size() > 0) {
Map<String, CobarNode> nodes = cluster.getNodes();
for (String id : nodeList) {
CobarNode n = nodes.get(id);
if (n != null && n.isOnline()) {
rows.add(getRow(n, c.getCharset()));
}
}
}
// 如果schema对应的group或者默认group都没有有效的节点,则使用全部集群。
if (rows.size() == 0) {
Map<String, CobarNode> nodes = cluster.getNodes();
for (CobarNode n : nodes.values()) {
if (n != null && n.isOnline()) {
rows.add(getRow(n, c.getCharset()));
}
}
}
}
if (rows.size() == 0) {
alarm.error(Alarms.CLUSTER_EMPTY + c.toString());
}
return rows;
}
use of com.alibaba.cobar.CobarConfig in project cobar by alibaba.
the class MultiNodeExecutor method newExecute.
/**
* 新通道的执行
*/
private void newExecute(final RouteResultsetNode rrn, final boolean autocommit, final BlockingSession ss, final int flag) {
final ServerConnection sc = ss.getSource();
// 检查数据节点是否存在
CobarConfig conf = CobarServer.getInstance().getConfig();
final MySQLDataNode dn = conf.getDataNodes().get(rrn.getName());
if (dn == null) {
handleFailure(ss, rrn, new SimpleErrInfo(new UnknownDataNodeException("Unknown dataNode '" + rrn.getName() + "'"), ErrorCode.ER_BAD_DB_ERROR, sc, rrn));
return;
}
// 提交执行任务
sc.getProcessor().getExecutor().execute(new Runnable() {
@Override
public void run() {
// 取得数据通道
int i = rrn.getReplicaIndex();
Channel c = null;
try {
c = (i == DEFAULT_REPLICA_INDEX) ? dn.getChannel() : dn.getChannel(i);
} catch (final Exception e) {
handleFailure(ss, rrn, new SimpleErrInfo(e, ErrorCode.ER_BAD_DB_ERROR, sc, rrn));
return;
}
c.setRunning(true);
Channel old = ss.getTarget().put(rrn, c);
if (old != null && c != old) {
old.close();
}
// 执行
execute0(rrn, c, autocommit, ss, flag);
}
});
}
use of com.alibaba.cobar.CobarConfig in project cobar by alibaba.
the class MultiNodeQueryHandler method execute.
public void execute() throws Exception {
final ReentrantLock lock = this.lock;
lock.lock();
try {
this.reset(route.length);
this.fieldsReturned = false;
this.affectedRows = 0L;
this.insertId = 0L;
this.buffer = session.getSource().allocate();
} finally {
lock.unlock();
}
if (session.closed()) {
decrementCountToZero();
recycleResources();
return;
}
session.setConnectionRunning(route);
ThreadPoolExecutor executor = session.getSource().getProcessor().getExecutor();
for (final RouteResultsetNode node : route) {
final MySQLConnection conn = session.getTarget(node);
if (conn != null) {
conn.setAttachment(node);
executor.execute(new Runnable() {
@Override
public void run() {
_execute(conn, node);
}
});
} else {
CobarConfig conf = CobarServer.getInstance().getConfig();
MySQLDataNode dn = conf.getDataNodes().get(node.getName());
dn.getConnection(this, node);
}
}
}
Aggregations