Start sending immediately instead of waiting for another loop

test-sq-poll
Vitaliy Filippov 2020-03-02 00:20:28 +03:00
parent 9d96e4bf0b
commit 79839ec31d
2 changed files with 49 additions and 36 deletions

1
osd.h
View File

@ -219,6 +219,7 @@ class osd_t
void handle_read(ring_data_t *data, int peer_fd); void handle_read(ring_data_t *data, int peer_fd);
void handle_op_hdr(osd_client_t *cl); void handle_op_hdr(osd_client_t *cl);
void handle_reply_hdr(osd_client_t *cl); void handle_reply_hdr(osd_client_t *cl);
bool try_send(osd_client_t & cl);
void send_replies(); void send_replies();
void handle_send(ring_data_t *data, int peer_fd); void handle_send(ring_data_t *data, int peer_fd);
void outbox_push(osd_client_t & cl, osd_op_t *op); void outbox_push(osd_client_t & cl, osd_op_t *op);

View File

@ -7,26 +7,25 @@ void osd_t::outbox_push(osd_client_t & cl, osd_op_t *cur_op)
{ {
gettimeofday(&cur_op->tv_begin, NULL); gettimeofday(&cur_op->tv_begin, NULL);
} }
cl.outbox.push_back(cur_op);
if (cl.write_op || cl.outbox.size() > 1 || !try_send(cl))
{
if (cl.write_state == 0) if (cl.write_state == 0)
{ {
cl.write_state = CL_WRITE_READY; cl.write_state = CL_WRITE_READY;
write_ready_clients.push_back(cur_op->peer_fd); write_ready_clients.push_back(cur_op->peer_fd);
} }
cl.outbox.push_back(cur_op);
ringloop->wakeup(); ringloop->wakeup();
}
} }
void osd_t::send_replies() bool osd_t::try_send(osd_client_t & cl)
{ {
for (int i = 0; i < write_ready_clients.size(); i++) int peer_fd = cl.peer_fd;
{
int peer_fd = write_ready_clients[i];
auto & cl = clients[peer_fd];
io_uring_sqe* sqe = ringloop->get_sqe(); io_uring_sqe* sqe = ringloop->get_sqe();
if (!sqe) if (!sqe)
{ {
write_ready_clients.erase(write_ready_clients.begin(), write_ready_clients.begin() + i); return false;
return;
} }
ring_data_t* data = ((ring_data_t*)sqe->user_data); ring_data_t* data = ((ring_data_t*)sqe->user_data);
if (!cl.write_op) if (!cl.write_op)
@ -55,6 +54,19 @@ void osd_t::send_replies()
cl.write_msg.msg_iovlen = cl.write_op->send_list.get_size(); cl.write_msg.msg_iovlen = cl.write_op->send_list.get_size();
data->callback = [this, peer_fd](ring_data_t *data) { handle_send(data, peer_fd); }; data->callback = [this, peer_fd](ring_data_t *data) { handle_send(data, peer_fd); };
my_uring_prep_sendmsg(sqe, peer_fd, &cl.write_msg, 0); my_uring_prep_sendmsg(sqe, peer_fd, &cl.write_msg, 0);
return true;
}
void osd_t::send_replies()
{
for (int i = 0; i < write_ready_clients.size(); i++)
{
int peer_fd = write_ready_clients[i];
if (!try_send(clients[peer_fd]))
{
write_ready_clients.erase(write_ready_clients.begin(), write_ready_clients.begin() + i);
return;
}
} }
write_ready_clients.clear(); write_ready_clients.clear();
} }