use of io.mycat.net.mysql.RowDataPacket in project Mycat-Server by MyCATApache.
the class ShowDatabase method execute.
public static void execute(ManagerConnection c) {
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c, true);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = eof.write(buffer, c, true);
// write rows
byte packetId = eof.packetId;
Map<String, SchemaConfig> schemas = MycatServer.getInstance().getConfig().getSchemas();
for (String name : new TreeSet<String>(schemas.keySet())) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(name, c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c, true);
}
// write lastEof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// write buffer
c.write(buffer);
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat-Server by MyCATApache.
the class ShowDatasourceSyn method getRows.
private static List<RowDataPacket> getRows(String charset) {
List<RowDataPacket> list = new LinkedList<RowDataPacket>();
MycatConfig conf = MycatServer.getInstance().getConfig();
// host nodes
Map<String, PhysicalDBPool> dataHosts = conf.getDataHosts();
for (PhysicalDBPool pool : dataHosts.values()) {
for (PhysicalDatasource ds : pool.getAllDataSources()) {
DBHeartbeat hb = ds.getHeartbeat();
DataSourceSyncRecorder record = hb.getAsynRecorder();
Map<String, String> states = record.getRecords();
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
if (!states.isEmpty()) {
row.add(StringUtil.encode(ds.getName(), charset));
row.add(StringUtil.encode(ds.getConfig().getIp(), charset));
row.add(LongUtil.toBytes(ds.getConfig().getPort()));
row.add(StringUtil.encode(states.get("Master_Host"), charset));
row.add(LongUtil.toBytes(Long.valueOf(states.get("Master_Port"))));
row.add(StringUtil.encode(states.get("Master_Use"), charset));
String secords = states.get("Seconds_Behind_Master");
row.add(secords == null ? null : LongUtil.toBytes(Long.valueOf(secords)));
row.add(StringUtil.encode(states.get("Slave_IO_Running"), charset));
row.add(StringUtil.encode(states.get("Slave_SQL_Running"), charset));
row.add(StringUtil.encode(states.get("Slave_IO_State"), charset));
row.add(LongUtil.toBytes(Long.valueOf(states.get("Connect_Retry"))));
row.add(StringUtil.encode(states.get("Last_IO_Error"), charset));
list.add(row);
}
}
}
return list;
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat-Server by MyCATApache.
the class ShowDatasourceSyn method response.
public static void response(ManagerConnection c, String stmt) {
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c, true);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = eof.write(buffer, c, true);
// write rows
byte packetId = eof.packetId;
for (RowDataPacket row : getRows(c.getCharset())) {
row.packetId = ++packetId;
buffer = row.write(buffer, c, true);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// post write
c.write(buffer);
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat-Server by MyCATApache.
the class ShowDirectMemory method showDirectMemoryTotal.
public static void showDirectMemoryTotal(ManagerConnection c) {
ByteBuffer buffer = c.allocate();
// write header
buffer = totalHeader.write(buffer, c, true);
// write fields
for (FieldPacket field : totalFields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = totalEof.write(buffer, c, true);
// write rows
byte packetId = totalEof.packetId;
long usedforMerge = 0;
long usedforNetwork = 0;
long chunkSizeBytes = 0;
int chunkCount = 0;
if (processorBufferPoolType == 2 && bufferPool instanceof NettyBufferPool) {
/**
*计算逻辑就是,1.先计算PoolChunk分配的页,表示已经消耗的内存,
* 2.然后计算小于一页情况,记录小于一页内存使用情况,
* 上面二者合起来就是整个netty 使用的内存,
* 已经分配了,但是没有使用的内存的情况
*/
List<PoolArenaMetric> list = ((NettyBufferPool) bufferPool).getAllocator().getAlloc().directArenas();
chunkSizeBytes = ((NettyBufferPool) bufferPool).getAllocator().getChunkSize();
long pageSize = ((NettyBufferPool) bufferPool).getAllocator().getPageSize();
long chunksUsedBytes = 0;
/**
*PoolArenas
*/
for (PoolArenaMetric pool : list) {
List<PoolChunkListMetric> pcks = pool.chunkLists();
/**
*针对PoolChunkList
*/
for (PoolChunkListMetric pck : pcks) {
Iterator<PoolChunkMetric> it = pck.iterator();
while (it.hasNext()) {
chunkCount++;
PoolChunkMetric p = it.next();
chunksUsedBytes += (chunkSizeBytes - p.freeBytes());
}
}
List<PoolSubpageMetric> tinySubpages = pool.tinySubpages();
for (PoolSubpageMetric tiny : tinySubpages) {
chunksUsedBytes -= (pageSize - (tiny.maxNumElements() - tiny.numAvailable()) * tiny.elementSize());
}
List<PoolSubpageMetric> smallSubpages = pool.smallSubpages();
for (PoolSubpageMetric small : smallSubpages) {
chunksUsedBytes -= (pageSize - (small.maxNumElements() - small.numAvailable()) * small.elementSize());
}
}
usedforNetwork = chunkCount * chunkSizeBytes;
}
ConcurrentHashMap<Long, Long> bufferpoolUsageMap = bufferPool.getNetDirectMemoryUsage();
RowDataPacket row = new RowDataPacket(TOTAL_FIELD_COUNT);
try {
/**
* 通过-XX:MaxDirectMemorySize=2048m设置的值
*/
row.add(JavaUtils.bytesToString2(Platform.getMaxDirectMemory()).getBytes(c.getCharset()));
if (useOffHeapForMerge == 1) {
/**
* 结果集合并时,总共消耗的DirectMemory内存
*/
ConcurrentHashMap<Long, Long> concurrentHashMap = MycatServer.getInstance().getMyCatMemory().getResultMergeMemoryManager().getDirectMemorUsage();
for (Map.Entry<Long, Long> entry : concurrentHashMap.entrySet()) {
usedforMerge += entry.getValue();
}
}
/**
* 网络packet处理,在buffer pool 已经使用DirectMemory内存
*/
if (processorBufferPoolType == 2) {
usedforNetwork = chunkSizeBytes * chunkCount;
} else {
for (Map.Entry<Long, Long> entry : bufferpoolUsageMap.entrySet()) {
usedforNetwork += entry.getValue();
}
}
row.add(JavaUtils.bytesToString2(usedforMerge + usedforNetwork).getBytes(c.getCharset()));
long totalAvailable = 0;
if (useOffHeapForMerge == 1) {
/**
* 设置使用off-heap内存处理结果集时,防止客户把MaxDirectMemorySize设置到物理内存的极限。
* Mycat能使用的DirectMemory是MaxDirectMemorySize*DIRECT_SAFETY_FRACTION大小,
* DIRECT_SAFETY_FRACTION为安全系数,为OS,Heap预留空间,避免因大结果集造成系统物理内存被耗尽!
*/
totalAvailable = (long) (Platform.getMaxDirectMemory() * MyCatMemory.DIRECT_SAFETY_FRACTION);
} else {
totalAvailable = Platform.getMaxDirectMemory();
}
row.add(JavaUtils.bytesToString2(totalAvailable - usedforMerge - usedforNetwork).getBytes(c.getCharset()));
if (useOffHeapForMerge == 1) {
/**
* 输出安全系统DIRECT_SAFETY_FRACTION
*/
row.add(("" + MyCatMemory.DIRECT_SAFETY_FRACTION).getBytes(c.getCharset()));
} else {
row.add(("1.0").getBytes(c.getCharset()));
}
long resevedForOs = 0;
if (useOffHeapForMerge == 1) {
/**
* 预留OS系统部分内存!!!
*/
resevedForOs = (long) ((1 - MyCatMemory.DIRECT_SAFETY_FRACTION) * (Platform.getMaxDirectMemory() - 2 * MycatServer.getInstance().getTotalNetWorkBufferSize()));
}
row.add(resevedForOs > 0 ? JavaUtils.bytesToString2(resevedForOs).getBytes(c.getCharset()) : "0".getBytes(c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c, true);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// write buffer
c.write(buffer);
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat-Server by MyCATApache.
the class ShowSQL method execute.
public static void execute(ManagerConnection c, boolean isClear) {
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c, true);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = eof.write(buffer, c, true);
// write rows
byte packetId = eof.packetId;
Map<String, UserStat> statMap = UserStatAnalyzer.getInstance().getUserStatMap();
for (UserStat userStat : statMap.values()) {
String user = userStat.getUser();
List<UserSqlLastStat.SqlLast> sqls = userStat.getSqlLastStat().getSqls();
int i = 1;
for (UserSqlLastStat.SqlLast sqlLast : sqls) {
if (sqlLast != null) {
RowDataPacket row = getRow(user, sqlLast, i, c.getCharset());
row.packetId = ++packetId;
i++;
buffer = row.write(buffer, c, true);
}
}
// 读取SQL监控后清理
if (isClear) {
userStat.getSqlLastStat().clear();
}
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// write buffer
c.write(buffer);
}
Aggregations