use of com.alibaba.cobar.mysql.MySQLDataNode in project cobar by alibaba.
the class ShowSlow method schema.
public static void schema(ManagerConnection c, String name) {
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
byte packetId = eof.packetId;
CobarConfig conf = CobarServer.getInstance().getConfig();
SchemaConfig schema = conf.getSchemas().get(name);
if (schema != null) {
SQLRecorder recorder = new SQLRecorder(conf.getSystem().getSqlRecordCount());
Map<String, MySQLDataNode> dataNodes = conf.getDataNodes();
for (String n : schema.getAllDataNodes()) {
MySQLDataNode dn = dataNodes.get(n);
MySQLDataSource ds = null;
if (dn != null && (ds = dn.getSource()) != null) {
for (SQLRecord r : ds.getSqlRecorder().getRecords()) {
if (r != null && recorder.check(r.executeTime)) {
recorder.add(r);
}
}
}
}
SQLRecord[] records = recorder.getRecords();
for (int i = records.length - 1; i >= 0; i--) {
if (records[i] != null) {
RowDataPacket row = getRow(records[i], c.getCharset());
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
}
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// write buffer
c.write(buffer);
}
use of com.alibaba.cobar.mysql.MySQLDataNode 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.mysql.MySQLDataNode 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.mysql.MySQLDataNode 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.mysql.MySQLDataNode in project cobar by alibaba.
the class SwitchDataSource method response.
public static void response(String stmt, ManagerConnection c) {
int count = 0;
Pair<String[], Integer> pair = ManagerParseSwitch.getPair(stmt);
Map<String, MySQLDataNode> dns = CobarServer.getInstance().getConfig().getDataNodes();
Integer idx = pair.getValue();
for (String key : pair.getKey()) {
MySQLDataNode dn = dns.get(key);
if (dn != null) {
int m = dn.getActivedIndex();
int n = (idx == null) ? dn.next(m) : idx.intValue();
if (dn.switchSource(n, false, "MANAGER")) {
++count;
}
}
}
OkPacket packet = new OkPacket();
packet.packetId = 1;
packet.affectedRows = count;
packet.serverStatus = 2;
packet.write(c);
}
Aggregations