Do not stop clients before they are connected

Vitaliy Filippov 2021-01-31 23:25:20 +03:00
parent 915d04c446
commit 6023cac361
2 changed files with 10 additions and 6 deletions

View File

@ -30,7 +30,7 @@ osd_messenger_t::~osd_messenger_t()
{ {
while (clients.size() > 0) while (clients.size() > 0)
{ {
stop_client(clients.begin()->first); stop_client(clients.begin()->first, true);
} }
} }
@ -111,7 +111,7 @@ void osd_messenger_t::try_connect_peer_addr(osd_num_t peer_osd, const char *peer
timeout_id = tfd->set_timer(1000*peer_connect_timeout, false, [this, peer_fd](int timer_id) timeout_id = tfd->set_timer(1000*peer_connect_timeout, false, [this, peer_fd](int timer_id)
{ {
osd_num_t peer_osd = clients.at(peer_fd)->osd_num; osd_num_t peer_osd = clients.at(peer_fd)->osd_num;
stop_client(peer_fd); stop_client(peer_fd, true);
on_connect_peer(peer_osd, -EIO); on_connect_peer(peer_osd, -EIO);
return; return;
}); });
@ -149,7 +149,7 @@ void osd_messenger_t::handle_connect_epoll(int peer_fd)
} }
if (result != 0) if (result != 0)
{ {
stop_client(peer_fd); stop_client(peer_fd, true);
on_connect_peer(peer_osd, -result); on_connect_peer(peer_osd, -result);
return; return;
} }
@ -171,7 +171,7 @@ void osd_messenger_t::handle_peer_epoll(int peer_fd, int epoll_events)
{ {
// Stop client // Stop client
printf("[OSD %lu] client %d disconnected\n", this->osd_num, peer_fd); printf("[OSD %lu] client %d disconnected\n", this->osd_num, peer_fd);
stop_client(peer_fd); stop_client(peer_fd, true);
} }
else if (epoll_events & EPOLLIN) else if (epoll_events & EPOLLIN)
{ {
@ -309,7 +309,7 @@ void osd_messenger_t::cancel_op(osd_op_t *op)
} }
} }
void osd_messenger_t::stop_client(int peer_fd) void osd_messenger_t::stop_client(int peer_fd, bool force)
{ {
assert(peer_fd != 0); assert(peer_fd != 0);
auto it = clients.find(peer_fd); auto it = clients.find(peer_fd);
@ -334,6 +334,10 @@ void osd_messenger_t::stop_client(int peer_fd)
printf("[OSD %lu] Stopping client %d (regular client)\n", osd_num, peer_fd); printf("[OSD %lu] Stopping client %d (regular client)\n", osd_num, peer_fd);
} }
} }
else if (!force)
{
return;
}
cl->peer_state = PEER_STOPPED; cl->peer_state = PEER_STOPPED;
clients.erase(it); clients.erase(it);
tfd->set_fd_handler(peer_fd, false, NULL); tfd->set_fd_handler(peer_fd, false, NULL);

View File

@ -275,7 +275,7 @@ struct osd_messenger_t
public: public:
void connect_peer(uint64_t osd_num, json11::Json peer_state); void connect_peer(uint64_t osd_num, json11::Json peer_state);
void stop_client(int peer_fd); void stop_client(int peer_fd, bool force = false);
void outbox_push(osd_op_t *cur_op); void outbox_push(osd_op_t *cur_op);
std::function<void(osd_op_t*)> exec_op; std::function<void(osd_op_t*)> exec_op;
std::function<void(osd_num_t)> repeer_pgs; std::function<void(osd_num_t)> repeer_pgs;