接上一篇博客Memtiter-benchmark源码解析1, 通过shard_connection发送请求
shard_connection.h
class shad_connection
private members
Line 161 行 bufferevent* m_bev;重要的bufferevent_event
important methods
setup_event
shard_connection.cpp
bufferevent_setcb 设置了 m_bev 的读事件的函数回调,没有设置写事件的函数回调
send_set_command
cmd_size = m_protocol->write_command_set(key, key_len, value, value_len,
expiry, offset);
m_protocol->write_command_set 方法见“Memtiter-benchmark源码解析3–protocol“。m_protocol的 write_command_set 和write_command_get 方法分别将请求内容写入到m_protocol的成员变量 m_read_buf 和 m_write_buf 中。 m_read_buf 和 m_write_buf 是 ev_buffer * 类型。
std::queue<request > m_pipeline;
int m_pending_resp;
request 是在 shard_connection.h 中定义的一个结构体。它封装了一个请求的类型、发送时间和内容大小。但它实际不包括请求内容。
请求类型在line 42 定义,分别几种:get,set,auth,db连接等。
338 发送完当前请求后,该请求进队
Each shard_connection has a bufferevent called m_bev.
m_bev has two buffers: input and output. For the input buffer, m_bev sets the read callback function for it, which is cluster_client_read_hadler. However, m_bev does not set the write callback function. For other events, cluster_client_event_handler is responsible for them. Furthermore, as a private member of shard_connection, m_protocol leverages the two buffers from m_bev to initialize its m_read_buf and m_write_buf members.
abstract_protocol* m_protocol;
shard_connection.cpp: cluster_client_read_handler would invoke the process_response function.
line 394 memtiter 收到一个response后,与该response对应的请求就是当前shared_connection 中std::queue<request > m_pipeline 排在队首的request所发送的.
m_conns_manager 有若干个子类。client是其中之一