fix the core that sql nio do_accept_one failed and close the socket after push to close queue
This commit is contained in:
33
deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp
vendored
33
deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp
vendored
@ -852,15 +852,11 @@ private:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int err = 0;
|
do_accept_one(fd);
|
||||||
if (0 != (err = do_accept_one(fd))) {
|
|
||||||
LOG_ERROR_RET(OB_ERR_SYS, "do_accept_one fail", K(fd), K(err));
|
|
||||||
close(fd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
void do_accept_one(int fd) {
|
||||||
int do_accept_one(int fd) {
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
ObSqlSock* s = NULL;
|
ObSqlSock* s = NULL;
|
||||||
int enable_tcp_nodelay = 1;
|
int enable_tcp_nodelay = 1;
|
||||||
@ -871,18 +867,33 @@ private:
|
|||||||
} else if (NULL == (s = alloc_sql_sock(fd))) {
|
} else if (NULL == (s = alloc_sql_sock(fd))) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
LOG_WARN_RET(OB_ERR_SYS, "alloc_sql_sock fail", K(fd), K(err));
|
LOG_WARN_RET(OB_ERR_SYS, "alloc_sql_sock fail", K(fd), K(err));
|
||||||
} else if (0 != (err = epoll_regist(epfd_, fd, epflag, s))) {
|
|
||||||
LOG_WARN_RET(OB_ERR_SYS, "epoll_regist fail", K(fd), K(err));
|
|
||||||
} else if (0 != (err = handler_.on_connect(s->sess_, fd))) {
|
} else if (0 != (err = handler_.on_connect(s->sess_, fd))) {
|
||||||
LOG_WARN_RET(OB_ERR_SYS, "on_connect fail", K(err));
|
LOG_WARN_RET(OB_ERR_SYS, "on_connect fail", K(err));
|
||||||
|
} else if (0 != (err = epoll_regist(epfd_, fd, epflag, s))) {
|
||||||
|
LOG_WARN_RET(OB_ERR_SYS, "epoll_regist fail", K(fd), K(err));
|
||||||
} else {
|
} else {
|
||||||
LOG_INFO("accept one succ", K(*s));
|
LOG_INFO("accept one succ", K(*s));
|
||||||
}
|
}
|
||||||
if (0 != err && NULL != s) {
|
if (0 != err) {
|
||||||
|
if (NULL != s) {
|
||||||
ObSqlSockSession* sess = (ObSqlSockSession *)s->sess_;
|
ObSqlSockSession* sess = (ObSqlSockSession *)s->sess_;
|
||||||
sess->destroy_sock();
|
if (sess->is_inited()) {
|
||||||
|
/*
|
||||||
|
* if ObSqlSockSession is inited, ObSMConnection and ObSqlSockSession
|
||||||
|
* may also been inited, we need on_disconnect and destroy procedure
|
||||||
|
* to clear related struct
|
||||||
|
*/
|
||||||
|
s->on_disconnect();
|
||||||
|
sess->destroy();
|
||||||
|
s->do_close();
|
||||||
|
} else {
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
free_sql_sock(s);
|
||||||
|
} else {
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
ObSqlSock* alloc_sql_sock(int fd) {
|
ObSqlSock* alloc_sql_sock(int fd) {
|
||||||
|
@ -31,6 +31,7 @@ ObSqlSockSession::ObSqlSockSession(ObISMConnectionCallback& conn_cb, ObSqlNio* n
|
|||||||
pending_write_sz_(0)
|
pending_write_sz_(0)
|
||||||
{
|
{
|
||||||
sql_req_.set_server_handle_context(this);
|
sql_req_.set_server_handle_context(this);
|
||||||
|
is_inited_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ObSqlSockSession::~ObSqlSockSession() {}
|
ObSqlSockSession::~ObSqlSockSession() {}
|
||||||
|
@ -61,6 +61,7 @@ public:
|
|||||||
void set_sql_session_info(void* sess);
|
void set_sql_session_info(void* sess);
|
||||||
int set_ssl_enabled();
|
int set_ssl_enabled();
|
||||||
SSL* get_ssl_st();
|
SSL* get_ssl_st();
|
||||||
|
bool is_inited() const { return is_inited_; }
|
||||||
ObSqlNio* nio_;
|
ObSqlNio* nio_;
|
||||||
ObISMConnectionCallback& sm_conn_cb_;
|
ObISMConnectionCallback& sm_conn_cb_;
|
||||||
rpc::ObRequest sql_req_;
|
rpc::ObRequest sql_req_;
|
||||||
@ -70,6 +71,8 @@ public:
|
|||||||
const char* pending_write_buf_;
|
const char* pending_write_buf_;
|
||||||
int64_t pending_write_sz_;
|
int64_t pending_write_sz_;
|
||||||
common::ObAddr client_addr_;
|
common::ObAddr client_addr_;
|
||||||
|
private:
|
||||||
|
bool is_inited_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}; // end namespace obmysql
|
}; // end namespace obmysql
|
||||||
|
Reference in New Issue
Block a user