[CP] when sql response has not been sent completely and the socket been closed,there will be reference count leakage
This commit is contained in:
committed by
ob-robot
parent
469144616f
commit
92f96f39d8
2
deps/oblib/src/rpc/ob_request.cpp
vendored
2
deps/oblib/src/rpc/ob_request.cpp
vendored
@ -42,6 +42,8 @@ int ObRequest::set_trace_point(int trace_point)
|
|||||||
} else {
|
} else {
|
||||||
snprintf(ez_req_->trace_bt, EASY_REQ_TRACE_BT_SIZE, "%s", lbt());
|
snprintf(ez_req_->trace_bt, EASY_REQ_TRACE_BT_SIZE, "%s", lbt());
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
handling_state_ = trace_point;
|
||||||
}
|
}
|
||||||
return OB_SUCCESS;
|
return OB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
7
deps/oblib/src/rpc/ob_request.h
vendored
7
deps/oblib/src/rpc/ob_request.h
vendored
@ -59,16 +59,17 @@ public:
|
|||||||
OB_EASY_REQUEST_TABLE_API_END_TRANS = 15,
|
OB_EASY_REQUEST_TABLE_API_END_TRANS = 15,
|
||||||
OB_EASY_REQUEST_TABLE_API_ACOM_TRANS = 16,
|
OB_EASY_REQUEST_TABLE_API_ACOM_TRANS = 16,
|
||||||
OB_EASY_REQUEST_WAKEUP = 255,
|
OB_EASY_REQUEST_WAKEUP = 255,
|
||||||
|
OB_FINISH_SQL_REQUEST = 256,
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
explicit ObRequest(Type type, int nio_protocol=0)
|
explicit ObRequest(Type type, int nio_protocol=0)
|
||||||
: ez_req_(NULL), nio_protocol_(nio_protocol), type_(type), handle_ctx_(NULL), group_id_(0), sql_req_level_(0), pkt_(NULL),
|
: ez_req_(NULL), handling_state_(-1), nio_protocol_(nio_protocol), type_(type), handle_ctx_(NULL), group_id_(0), sql_req_level_(0), pkt_(NULL),
|
||||||
connection_phase_(ConnectionPhaseEnum::CPE_CONNECTED),
|
connection_phase_(ConnectionPhaseEnum::CPE_CONNECTED),
|
||||||
recv_timestamp_(0), enqueue_timestamp_(0),
|
recv_timestamp_(0), enqueue_timestamp_(0),
|
||||||
request_arrival_time_(0), recv_mts_(), arrival_push_diff_(0),
|
request_arrival_time_(0), recv_mts_(), arrival_push_diff_(0),
|
||||||
push_pop_diff_(0), pop_process_start_diff_(0),
|
push_pop_diff_(0), pop_process_start_diff_(0),
|
||||||
process_start_end_diff_(0), process_end_response_diff_(0),
|
process_start_end_diff_(0), process_end_response_diff_(0),
|
||||||
trace_id_(),discard_flag_(false),large_retry_flag_(false),retry_times_(0)
|
trace_id_(), discard_flag_(false), large_retry_flag_(false), retry_times_(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
virtual ~ObRequest() {}
|
virtual ~ObRequest() {}
|
||||||
@ -135,6 +136,7 @@ public:
|
|||||||
mutable ObReusableMem reusable_mem_;
|
mutable ObReusableMem reusable_mem_;
|
||||||
public:
|
public:
|
||||||
easy_request_t *ez_req_; // set in ObRequest new
|
easy_request_t *ez_req_; // set in ObRequest new
|
||||||
|
int32_t handling_state_; //for sql nio or other frame work
|
||||||
protected:
|
protected:
|
||||||
int nio_protocol_;
|
int nio_protocol_;
|
||||||
Type type_;
|
Type type_;
|
||||||
@ -158,7 +160,6 @@ protected:
|
|||||||
bool discard_flag_;
|
bool discard_flag_;
|
||||||
bool large_retry_flag_;
|
bool large_retry_flag_;
|
||||||
int32_t retry_times_;
|
int32_t retry_times_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(ObRequest);
|
DISALLOW_COPY_AND_ASSIGN(ObRequest);
|
||||||
}; // end of class ObRequest
|
}; // end of class ObRequest
|
||||||
|
|||||||
@ -67,6 +67,7 @@ void ObPocSqlRequestOperator::disconnect_sql_conn(ObRequest* req)
|
|||||||
void ObPocSqlRequestOperator::finish_sql_request(ObRequest* req)
|
void ObPocSqlRequestOperator::finish_sql_request(ObRequest* req)
|
||||||
{
|
{
|
||||||
ObSqlSockSession* sess = (ObSqlSockSession*)req->get_server_handle_context();
|
ObSqlSockSession* sess = (ObSqlSockSession*)req->get_server_handle_context();
|
||||||
|
req->set_trace_point(ObRequest::OB_FINISH_SQL_REQUEST);
|
||||||
sess->revert_sock();
|
sess->revert_sock();
|
||||||
obmysql::request_finish_callback();
|
obmysql::request_finish_callback();
|
||||||
}
|
}
|
||||||
|
|||||||
47
deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp
vendored
47
deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp
vendored
@ -22,6 +22,7 @@
|
|||||||
#include "lib/thread/ob_thread_name.h"
|
#include "lib/thread/ob_thread_name.h"
|
||||||
#include "lib/utility/ob_macro_utils.h"
|
#include "lib/utility/ob_macro_utils.h"
|
||||||
#include "lib/profile/ob_trace_id.h"
|
#include "lib/profile/ob_trace_id.h"
|
||||||
|
#include "common/ob_clock_generator.h"
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@ -305,6 +306,7 @@ public:
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
TO_STRING_KV(KP_(buf), K_(sz));
|
||||||
private:
|
private:
|
||||||
int do_write(int fd, const char* buf, int64_t sz, int64_t& consume_bytes) {
|
int do_write(int fd, const char* buf, int64_t sz, int64_t& consume_bytes) {
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
@ -345,8 +347,9 @@ public:
|
|||||||
}
|
}
|
||||||
~ObSqlSock() {}
|
~ObSqlSock() {}
|
||||||
int64_t get_remain_sz() const { return read_buffer_.get_remain_sz(); }
|
int64_t get_remain_sz() const { return read_buffer_.get_remain_sz(); }
|
||||||
TO_STRING_KV(KP(this), K_(fd), K_(err), K(last_decode_time_), K(last_write_time_),
|
TO_STRING_KV(KP(this), "session_id", get_sql_session_id(), "trace_id", get_trace_id(), "sql_handling_stage", get_sql_request_execute_state(), "sql_initiative_shutdown", need_shutdown_,
|
||||||
K(read_buffer_.get_consume_sz()), K(get_pending_flag()), KPC(get_trace_id()));
|
K_(fd), K_(err), K_(last_decode_time), K_(last_write_time), K_(pending_write_task), K_(need_epoll_trigger_write),
|
||||||
|
"consume_size", read_buffer_.get_consume_sz(), "pending_flag", get_pending_flag(), "may_handling_flag", get_may_handling_flag(), K_(handler_close_flag));
|
||||||
ObSqlNioImpl *get_nio_impl() { return nio_impl_; }
|
ObSqlNioImpl *get_nio_impl() { return nio_impl_; }
|
||||||
void set_nio_impl(ObSqlNioImpl *impl) { nio_impl_ = impl; }
|
void set_nio_impl(ObSqlNioImpl *impl) { nio_impl_ = impl; }
|
||||||
bool set_error(int err) { return 0 == ATOMIC_TAS(&err_, err); }
|
bool set_error(int err) { return 0 == ATOMIC_TAS(&err_, err); }
|
||||||
@ -409,11 +412,6 @@ public:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
const rpc::TraceId* get_trace_id() const {
|
|
||||||
ObSqlSockSession* sess = (ObSqlSockSession *)sess_;
|
|
||||||
return &(sess->sql_req_.get_trace_id());
|
|
||||||
}
|
|
||||||
bool wait_handling() { return ready_flag_.set_ready(); }
|
|
||||||
int32_t get_pending_flag() const { return ready_flag_.get_pending_flag(); }
|
int32_t get_pending_flag() const { return ready_flag_.get_pending_flag(); }
|
||||||
void set_writable() { write_cond_.signal(); }
|
void set_writable() { write_cond_.signal(); }
|
||||||
bool set_readable() { return ready_flag_.set_ready(); }
|
bool set_readable() { return ready_flag_.set_ready(); }
|
||||||
@ -463,6 +461,19 @@ private:
|
|||||||
int64_t last_decode_time_;
|
int64_t last_decode_time_;
|
||||||
int64_t last_write_time_;
|
int64_t last_write_time_;
|
||||||
void* sql_session_info_;
|
void* sql_session_info_;
|
||||||
|
private:
|
||||||
|
const rpc::TraceId* get_trace_id() const {
|
||||||
|
ObSqlSockSession* sess = (ObSqlSockSession *)sess_;
|
||||||
|
return &(sess->sql_req_.get_trace_id());
|
||||||
|
}
|
||||||
|
int32_t get_sql_request_execute_state() const {
|
||||||
|
ObSqlSockSession* sess = (ObSqlSockSession *)sess_;
|
||||||
|
return sess->sql_req_.handling_state_;
|
||||||
|
}
|
||||||
|
uint32_t get_sql_session_id() const {
|
||||||
|
ObSqlSockSession* sess = (ObSqlSockSession *)sess_;
|
||||||
|
return sess->sql_session_id_;
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
char sess_[3000] __attribute__((aligned(16)));
|
char sess_[3000] __attribute__((aligned(16)));
|
||||||
};
|
};
|
||||||
@ -801,18 +812,17 @@ private:
|
|||||||
while(cur != head) {
|
while(cur != head) {
|
||||||
ObSqlSock* s = CONTAINER_OF(cur, ObSqlSock, dlink_);
|
ObSqlSock* s = CONTAINER_OF(cur, ObSqlSock, dlink_);
|
||||||
cur = cur->next_;
|
cur = cur->next_;
|
||||||
bool need_destroy = false;
|
|
||||||
if (false == s->handler_close_been_called()) {
|
if (false == s->handler_close_been_called()) {
|
||||||
if (false == s->get_may_handling_flag()) {
|
bool need_destroy = true;
|
||||||
|
if (0 == s->get_pending_flag()) {
|
||||||
|
LOG_INFO("sock ref clean, do destroy", K(*s));
|
||||||
|
} else if (false == s->get_may_handling_flag()) {
|
||||||
LOG_INFO("can close safely, do destroy", K(*s));
|
LOG_INFO("can close safely, do destroy", K(*s));
|
||||||
need_destroy = true;
|
} else if (s->is_need_epoll_trigger_write()) {
|
||||||
|
LOG_INFO("data hasn't write completely and need close, do destroy", K(*s));
|
||||||
} else {
|
} else {
|
||||||
if (s->wait_handling()) {
|
need_destroy = false;
|
||||||
LOG_INFO("sock ref clean, do destroy", K(*s));
|
LOG_TRACE("wait handling done...", K(*s));
|
||||||
need_destroy = true;
|
|
||||||
} else {
|
|
||||||
LOG_TRACE("wait handling done...", K(*s));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (need_destroy) {
|
if (need_destroy) {
|
||||||
handler_.on_close(s->sess_, 0);
|
handler_.on_close(s->sess_, 0);
|
||||||
@ -829,12 +839,11 @@ private:
|
|||||||
}
|
}
|
||||||
void handle_sock_event(ObSqlSock* s, uint32_t mask) {
|
void handle_sock_event(ObSqlSock* s, uint32_t mask) {
|
||||||
if (OB_UNLIKELY((EPOLLERR & mask) || (EPOLLHUP & mask) || (EPOLLRDHUP & mask))) {
|
if (OB_UNLIKELY((EPOLLERR & mask) || (EPOLLHUP & mask) || (EPOLLRDHUP & mask))) {
|
||||||
|
|
||||||
if (s->set_error(EIO)) {
|
if (s->set_error(EIO)) {
|
||||||
LOG_WARN_RET(OB_ERR_SYS, "sock error detect by epoll", K(mask), K(*s));
|
LOG_WARN_RET(OB_SUCCESS, "socket closed, it maybe disconnected by the client or by observer actively", K(mask), K(*s));
|
||||||
prepare_destroy(s);
|
prepare_destroy(s);
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN_RET(OB_ERR_SYS, "sock error detect by epoll, and worker thread alread set error", K(*s));
|
LOG_WARN_RET(OB_SUCCESS, "socket closed, and worker thread alread set error", K(mask), K(*s));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|||||||
@ -28,7 +28,8 @@ ObSqlSockSession::ObSqlSockSession(ObISMConnectionCallback& conn_cb, ObSqlNio* n
|
|||||||
sql_req_(ObRequest::OB_MYSQL, 1),
|
sql_req_(ObRequest::OB_MYSQL, 1),
|
||||||
last_pkt_sz_(0),
|
last_pkt_sz_(0),
|
||||||
pending_write_buf_(NULL),
|
pending_write_buf_(NULL),
|
||||||
pending_write_sz_(0)
|
pending_write_sz_(0),
|
||||||
|
sql_session_id_(0)
|
||||||
{
|
{
|
||||||
sql_req_.set_server_handle_context(this);
|
sql_req_.set_server_handle_context(this);
|
||||||
is_inited_ = true;
|
is_inited_ = true;
|
||||||
|
|||||||
@ -72,6 +72,7 @@ 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_;
|
||||||
|
uint32_t sql_session_id_; //debug only
|
||||||
private:
|
private:
|
||||||
bool is_inited_;
|
bool is_inited_;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -117,6 +117,7 @@ int ObSMConnectionCallback::init(ObSqlSockSession& sess, ObSMConnection& conn)
|
|||||||
} else if (OB_FAIL(send_handshake(sess, hsp))) {
|
} else if (OB_FAIL(send_handshake(sess, hsp))) {
|
||||||
LOG_WARN("send handshake fail", K(ret), K(sess.client_addr_));
|
LOG_WARN("send handshake fail", K(ret), K(sess.client_addr_));
|
||||||
} else {
|
} else {
|
||||||
|
sess.sql_session_id_ = conn.sessid_;
|
||||||
LOG_INFO("sm conn init succ", K(conn.sessid_), K(sess.client_addr_));
|
LOG_INFO("sm conn init succ", K(conn.sessid_), K(sess.client_addr_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user