重构oceanbase的一个函数
我去,今天读了一下ob的源码,感觉有点乱啊!!!好吧,当作练手,我重构了一个函数
void* ObMySQLCallback::decode(easy_message_t* m)
{
uint32_t pkt_len = ;
uint8_t pkt_seq = ;
uint8_t pkt_type = ;
ObMySQLCommandPacket* packet = NULL;
char* buffer = NULL;
int32_t len = ; if (NULL == m)
{
TBSYS_LOG(ERROR, "invalid argument m is %p", m);
}
else if (NULL == m->input)
{
TBSYS_LOG(ERROR, "invalide argument m->input is %p", m->input);
}
else
{
if ((len = static_cast<int32_t>(m->input->last - m->input->pos)) >= OB_MYSQL_PACKET_HEADER_SIZE)
{
//1. decode length from net buffer
//2. decode seq from net buffer
ObMySQLUtil::get_uint3(m->input->pos, pkt_len);
ObMySQLUtil::get_uint1(m->input->pos, pkt_seq); //message has enough buffer
if (pkt_len <= m->input->last - m->input->pos)
{
ObMySQLUtil::get_uint1(m->input->pos, pkt_type);
//利用message带的pool进行应用层内存的分配
buffer = reinterpret_cast<char*>(easy_pool_alloc(m->pool,
static_cast<uint32_t>(sizeof(ObMySQLCommandPacket) + pkt_len)));
if (NULL == buffer)
{
TBSYS_LOG(ERROR, "alloc packet buffer(length=%lu) from m->pool failed", sizeof(ObMySQLCommandPacket) + pkt_len);
}
else
{
TBSYS_LOG(DEBUG, "alloc packet buffer length = %lu", sizeof(ObMySQLCommandPacket) + pkt_len);
packet = new(buffer)ObMySQLCommandPacket();
packet->set_header(pkt_len, pkt_seq);
packet->set_type(pkt_type);
packet->set_receive_ts(tbsys::CTimeUtil::getTime());
memcpy(buffer + sizeof(ObMySQLCommandPacket), m->input->pos, pkt_len - );
packet->get_command().assign(buffer + sizeof(ObMySQLCommandPacket), pkt_len - );
TBSYS_LOG(DEBUG, "decode comand packet command is \"%.*s\"", packet->get_command().length(),
packet->get_command().ptr());
if (PACKET_RECORDER_FLAG)
{
// record the packet to FIFO stream if required
ObMySQLServer* server = reinterpret_cast<ObMySQLServer*>(m->c->handler->user_data);
ObMySQLCommandPacketRecord record;
record.socket_fd_ = m->c->fd;
record.cseq_ = m->c->seq;
record.addr_ = m->c->addr;
record.pkt_length_ = pkt_len;
record.pkt_seq_ = pkt_seq;
record.cmd_type_ = pkt_type;
struct iovec buffers[];
buffers[].iov_base = &record;
buffers[].iov_len = sizeof(record);
buffers[].iov_base = m->input->pos;
buffers[].iov_len = pkt_len - ;
int err = OB_SUCCESS;
if (OB_SUCCESS != (err = server->get_packet_recorder().push(buffers, )))
{ TBSYS_LOG(WARN, "failed to record MySQL packet, err=%d", err);
}
}
m->input->pos += pkt_len - ;
}
}
else
{
m->next_read_len = static_cast<int>(pkt_len - (m->input->last - m->input->pos));
TBSYS_LOG(DEBUG, "not enough data in message, packet length = %u, data in message is %ld",
pkt_len, m->input->last - m->input->pos);
m->input->pos -= OB_MYSQL_PACKET_HEADER_SIZE;
}
}
}
return packet;
}
问题:代码好长。。。嵌套太深。。。
ObMySQLCommandPacket* ObMySQLCallback::make_packet(easy_message_t* m, uint32_t *pkt_len, uint8_t *pkt_seq, uint8_t *pkt_type)
{
ObMySQLUtil::get_uint1(m->input->pos, *pkt_type);
//利用message带的pool进行应用层内存的分配
char* buffer = reinterpret_cast<char*>(easy_pool_alloc(m->pool,
static_cast<uint32_t>(sizeof(ObMySQLCommandPacket) + *pkt_len))); if (NULL == buffer)
{
TBSYS_LOG(ERROR, "alloc packet buffer(length=%lu) from m->pool failed", sizeof(ObMySQLCommandPacket) + *pkt_len);
return NULL;
} TBSYS_LOG(DEBUG, "alloc packet buffer length = %lu", sizeof(ObMySQLCommandPacket) + *pkt_len);
ObMySQLCommandPacket* packet = new(buffer)ObMySQLCommandPacket();
packet->set_header(*pkt_len, *pkt_seq);
packet->set_type(*pkt_type);
packet->set_receive_ts(tbsys::CTimeUtil::getTime());
memcpy(buffer + sizeof(ObMySQLCommandPacket), m->input->pos, *pkt_len - );
packet->get_command().assign(buffer + sizeof(ObMySQLCommandPacket), *pkt_len - );
TBSYS_LOG(DEBUG, "decode comand packet command is \"%.*s\"", packet->get_command().length(),
packet->get_command().ptr());
return packet;
} void ObMySQLCallback::record_packet(easy_message_t* m, uint32_t *pkt_len, uint8_t *pkt_seq, uint8_t *pkt_type)
{
// record the packet to FIFO stream if required
ObMySQLServer* server = reinterpret_cast<ObMySQLServer*>(m->c->handler->user_data);
ObMySQLCommandPacketRecord record;
record.socket_fd_ = m->c->fd;
record.cseq_ = m->c->seq;
record.addr_ = m->c->addr;
record.pkt_length_ = *pkt_len;
record.pkt_seq_ = *pkt_seq;
record.cmd_type_ = *pkt_type;
struct iovec buffers[];
buffers[].iov_base = &record;
buffers[].iov_len = sizeof(record);
buffers[].iov_base = m->input->pos;
buffers[].iov_len = pkt_len - ;
int err = OB_SUCCESS;
if (OB_SUCCESS != (err = server->get_packet_recorder().push(buffers, )))
{
TBSYS_LOG(WARN, "failed to record MySQL packet, err=%d", err);
}
} void ObMySQLCallback::init_pkt_variables(uint32_t *pkt_len, uint8_t *pkt_seq)
{
//1. decode length from net buffer
//2. decode seq from net buffer ObMySQLUtil::get_uint3(m->input->pos, *pkt_len);
ObMySQLUtil::get_uint1(m->input->pos, *pkt_seq);
} void* ObMySQLCallback::decode(easy_message_t* m)
{
uint32_t pkt_len = , pkt_seq = , pkt_type = ; if (NULL == m || NULL == m->input)
{
TBSYS_LOG(ERROR, "invalid argument m %p", m);
return NULL;
} int32_t msg_buffer_size = static_cast<int32_t>(m->input->last - m->input->pos);
if ( msg_buffer_size < OB_MYSQL_PACKET_HEADER_SIZE)
{
return NULL;
} init_pkt_variables(&pkt_len, &pkt_seq);
if (pkt_len > msg_buffer_size) //message has not enough buffer
{
m->next_read_len = static_cast<int>(pkt_len - msg_buffer_size);
TBSYS_LOG(DEBUG, "not enough data in message, packet length = %u, data in message is %ld",pkt_len, msg_buffer_size);
m->input->pos -= OB_MYSQL_PACKET_HEADER_SIZE;
return NULL;
} ObMySQLCommandPacket* packet = make_packet(m, &pkt_len, &pkt_seq , &pkt_type);
if (PACKET_RECORDER_FLAG)
{
record_packet(m, &pkt_len, &pkt_seq , &pkt_type);
}
m->input->pos += pkt_len - ;
return packet;
}
重构oceanbase的一个函数的更多相关文章
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)
解题: 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码[123和12345]那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出 ...
- Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL
没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- PHP很有用的一个函数ignore_user_abort ()
PHP很有用的一个函数ignore_user_abort () 2013-01-16 14:21:31| 分类: PHP | 标签:php 函数 |举报|字号 订阅 ignore_us ...
- php 设置一个函数的最大运行时间
如何防止一个函数执行时间过长呢?在PHP里可以用pcntl时钟信号+异常来实现 declare(ticks = 1); function a() { sleep(10); echo "a f ...
- javascript 在一个函数参数中包含另一个函数的引用
javascript函数的参数包含另一个函数的情形: <script> //b函数的参数func为另一个函数 function b(a, func) { alert(a); //调用参数 ...
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
随机推荐
- 娓娓道来c指针 (3)指针和数组
(3)指针和数组 在c中指针和数组似乎有着千丝万缕的关系.事实上它们不是一回事:指针是指针,数组是数组.两者不同样. 说它们有关系,只是是由于常见这种代码: int main() { int arra ...
- cocos2dx实现android的对讯飞语音的合成(语言朗读的实现)
事实上非常easy,只是有些细节须要注意. 关于讯飞语音在android上的应用,大家须要自己去下载SDK,然后依照讯飞语音提供的api在自己的android的Demo上执行成功,那东西也相当的简单. ...
- Qt 学习之路:绘制设备
绘图设备是继承QPainterDevice的类.QPaintDevice就是能够进行绘制的类,也就是说,QPainter可以在任何QPaintDevice的子类上进行绘制.现在,Qt 提供了若干这样的 ...
- ios的手势操作之UIGestureRecognizer浅析
转载地址:http://blog.csdn.net/likendsl/article/details/7554150 每一个手势的实现例子,可参考下面网址:http://www.cnblogs.com ...
- centos6.5 64位 openvpn安装配置
1 查看系统版本 2 cat /etc/redhat-release 3 CentOS release 6.5 (Final) 4 5 查看内核和cpu架构 6 uname -rm 7 2.6.32- ...
- CGLIB学习笔记
0 概述 CGLIB基于ASM实现.提供比反射更为强大的动态特性.使用CGLIB可以非常方便的实现的动态代理. 0.1 CGLIB包结构 net.sf.cglib.core 底层字节码处理类. ...
- HDU 4294 Multiple(搜索+数学)
题意: 给定一个n,让求一个M,它是n个倍数并且在k进制之下 M的不同的数字最少. 思路: 这里用到一个结论就是任意两个数可以组成任何数的倍数.知道这个之后就可以用搜索来做了.还有一个问题就是最多找n ...
- 遍历id,根据id作为条件循环查询。
string id = "OE09924008161405102,OE36765709071405102,OE87852044171405102,OE09924008161405102&qu ...
- Android-自定义多TAB悬浮控件实现蘑菇街首页效果
因为项目的一些需求需要用到此种展现方式. 找了市面上大部分有类似功能的应用. 基本思路嵌套ScrollView 转换事件分发给listview 实现. 但是此种方案有个缺点. 在ScrollVie ...
- Array,ArrayList 和 List<T>的选择和性能比较.
Array Class Provides methods for creating, manipulating, searching, and sorting arrays, thereby serv ...