重构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 ...
随机推荐
- linux系统启动oracle
linux下启动oracle需要两步:一.启动监听 二.启动服务 一.启动监听 监听命令:lsnrctl ,具体使用方法如下 1.lsnrctl status:检查当前监听器的状态 2.lsnrct ...
- bootbox.js [v4.2.0]设置确认框 按钮语言为中文
Bootbox.js (http://bootboxjs.com/)是一个小型的 JavaScript 库用来创建简单的可编程对话框,基于 Twitter 的 Bootstrap 开发. 弹出确认框方 ...
- [Oracle] Data Pump 详细使用教程(4)- network_link
[Oracle] Data Pump 详细使用教程(1)- 总览 [Oracle] Data Pump 详细使用教程(2)- 总览 [Oracle] Data Pump 详细使用教程(3)- 总览 [ ...
- 拿走不谢!22 个 Android Studio 优秀插件汇总
Google 在2013年5月的I/O开发者大会推出了基于IntelliJ IDEA java ide上的Android Studio.AndroidStudio是一个功能齐全的开发工具,还提供了第三 ...
- FastDFS问题汇总
问题1: 增加分组后,新的storge不可用. 增加一个分组group2,发现上传文件失败.在group2中的storage中使用netstat -anp|grep fdfs,发现端口状态为CLOSE ...
- (原创)googlemap开发(一)
听说我们的客户有了外国淫,所以领导问我目前的项目里高德地图和讯飞语音支持英文和英文发音不,按照我以往的经验判断,讯飞支持英语发音和识别英语是没有问题的,但是高德这玩意貌似只有我大天朝的地图吧.于是,找 ...
- JavaScript 数据类型转换(显式与隐式)
一.数据类型 JS中有5中简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String.还有一种复杂数据类型------Object,Object本质是 ...
- Unity3D GUI之自定义风格组件
GUI中可以使用一些默认的组件,里面的最后一个参数一般情况下,不设置就是默认的 ,当然也可以进行手动的指定,比如: GUI.Button(new Rect(0,0,100,100),"开始游 ...
- Nuget 相关
1:服务器搭建 1.1:创建空的Web Application 1.2:引用NuGet.Server 包:NuGet.Server 安装完成后的界面 web.config 已经被重写了,里面存在一些配 ...
- Mac下载并编译Google安卓AOSP项目代码
Mac下载并编译Google安卓AOSP项目代码 参考 https://source.android.com/source/index.html 这两天用Mac下载安卓AOSP源码,且把遇到的问题记下 ...