我去,今天读了一下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的一个函数的更多相关文章

  1. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  2. 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)

    解题: 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码[123和12345]那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出 ...

  3. 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 ...

  4. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  5. PHP很有用的一个函数ignore_user_abort ()

    PHP很有用的一个函数ignore_user_abort () 2013-01-16 14:21:31|  分类: PHP |  标签:php  函数  |举报|字号 订阅     ignore_us ...

  6. php 设置一个函数的最大运行时间

    如何防止一个函数执行时间过长呢?在PHP里可以用pcntl时钟信号+异常来实现 declare(ticks = 1); function a() { sleep(10); echo "a f ...

  7. javascript 在一个函数参数中包含另一个函数的引用

    javascript函数的参数包含另一个函数的情形: <script> //b函数的参数func为另一个函数 function b(a, func) {  alert(a); //调用参数 ...

  8. 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?

    题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...

  9. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

随机推荐

  1. C标签

    关键字:JSTL标签.<c:choose>.<c:forEach>.<c:forTokens>.<c:if>.<c:import>.< ...

  2. PDOstament对象执行execute()函数,只要是sql语句正确都是返回true

    [PDO对象操作数据库] PDOstament对象执行execute()函数,只要是sql语句正确都是返回true. 问题: 想要PDO对象实现更改一条记录, 并修改是否成功要返回信息给用户. 上我的 ...

  3. 基于Flume的美团日志收集系统(一)架构和设计【转】

    美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流.美团的日志收集系统基于Flume设计和搭建而成. <基于Flume的美团日志收 ...

  4. Form实现无刷新上传文件并返回自定义值

    今天开发过程中遇到了这样一个问题:需要将Excel上传至服务器进行解析,但是在文档不合适的情况下希望可以不刷新页面提示用户文档不合适.冥思苦想了半天,在网上找了不少资料最终试验成功,在此分享下处理方法 ...

  5. Eclipse 每行 80 字符限制的提示线

    有时候希望eclipse和C++编辑器之类有条对齐线 打开 Eclipse, Windows -> Prefereces -> General -> Editors -> Te ...

  6. 10.31 afternoon

    巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了, LYK 无法一口吞进去.具体地,这根巧 ...

  7. hdu 3450 Counting Sequences

    /* n*n暴力 这个很好想 */ #include<cstdio> #define maxn 100010 #define mod 9901 using namespace std; i ...

  8. 在ec2上创建root用户,并使用root 通过Xshell远程登录aws云服务器

    1.根据官网提供的方法登录连接到EC2服务器(官网推荐windows用户使用PUTTY连接) 2. 创建root的密码,输入如下命令: sudo passwd root 3.然后会提示你输入new p ...

  9. HTML5 canvas createRadialGradient()放射状/圆形渐变

    定义和用法 createLinearGradient() 方法创建放射状/圆形渐变对象. 渐变可用于填充矩形.圆形.线条.文本等等. 提示:请使用该对象作为 strokeStyle 或 fillSty ...

  10. 欢迎使用 Markdown 编辑器写博客

    本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML ...