patch 4.0

This commit is contained in:
wangzelin.wzl
2022-10-24 10:34:53 +08:00
parent 4ad6e00ec3
commit 93a1074b0c
10533 changed files with 2588271 additions and 2299373 deletions

View File

@ -0,0 +1,154 @@
/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#define USING_LOG_PREFIX RPC_OBMYSQL
#include "rpc/frame/ob_req_deliver.h"
#include "rpc/obmysql/ob_sql_sock_handler.h"
#include "rpc/obmysql/ob_sql_sock_processor.h"
#include "rpc/obmysql/ob_sql_sock_session.h"
namespace oceanbase
{
using namespace common;
using namespace observer;
namespace obmysql
{
int ObSqlSockHandler::init(rpc::frame::ObReqDeliver* deliver)
{
int ret = OB_SUCCESS;
deliver_ = deliver;
return ret;
}
static int get_client_addr_for_sql_sock_session(int fd, ObAddr& client_addr)
{
int ret = OB_SUCCESS;
struct sockaddr_storage addr;
socklen_t addr_len = sizeof(addr);
if (getpeername(fd, (struct sockaddr *)&addr, &addr_len) < 0) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("sql nio getpeername failed", K(errno), K(ret));
} else {
if (AF_INET == addr.ss_family) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
if (false == client_addr.set_ipv4_addr(ntohl(s->sin_addr.s_addr), ntohs(s->sin_port))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("sql nio set_ipv4_addr failed", K(ret));
}
} else if (AF_INET6 == addr.ss_family) {
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
if (false == client_addr.set_ipv6_addr((void *)&s->sin6_addr, ntohs(s->sin6_port))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("sql nio set_ipv6_addr failed", K(ret));
}
}
}
return ret;
}
int ObSqlSockHandler::on_connect(void* udata, int fd)
{
int ret = OB_SUCCESS;
ObSqlSockSession* sess = (ObSqlSockSession*)udata;
new(sess)ObSqlSockSession(conn_cb_, nio_);
if (OB_FAIL(get_client_addr_for_sql_sock_session(fd, sess->client_addr_))) {
LOG_WARN("sql nio get_client_addr_for_sql_sock_session failed", K(ret));
} else if (OB_FAIL(sess->init())) {
LOG_WARN("sess init failed", K(ret));
}
return ret;
}
void ObSqlSockHandler::on_close(void* udata, int err)
{
UNUSED(err);
ObSqlSockSession* sess = (ObSqlSockSession*)udata;
sess->destroy();
}
void ObSqlSockHandler::on_flushed(void* udata)
{
ObSqlSockSession* sess = (ObSqlSockSession*)udata;
sess->on_flushed();
}
/*
share::ObTenantSpace* global_tenant_space = NULL;
int process_my_request(rpc::frame::ObReqProcessor& processor, rpc::ObRequest& req)
{
ObAddr myaddr;
ObCurTraceId::set(req.generate_trace_id(myaddr));
ob_setup_default_tsi_warning_buffer();
ob_reset_tsi_warning_buffer();
processor.set_ob_request(req);
processor.run();
ObCurTraceId::reset();
return 0;
}
int handle_sql_req_inplace(void* udata)
{
int ret = OB_SUCCESS;
auto *pm = common::ObPageManager::thread_local_instance();
pm->set_tenant_ctx(OB_SERVER_TENANT_ID, ObCtxIds::DEFAULT_CTX_ID);
lib::ContextTLOptGuard guard(true);
lib::ContextParam param;
param.set_mem_attr(OB_SERVER_TENANT_ID, ObModIds::OB_SQL_EXECUTOR, ObCtxIds::DEFAULT_CTX_ID)
.set_properties(lib::USE_TL_PAGE_OPTIONAL)
.set_ablock_size(lib::INTACT_MIDDLE_AOBJECT_SIZE);
CREATE_WITH_TEMP_CONTEXT(param) {
THIS_WORKER.set_allocator(&CURRENT_CONTEXT->get_arena_allocator());
CREATE_WITH_TEMP_ENTITY(RESOURCE_OWNER, OB_SERVER_TENANT_ID) {
WITH_ENTITY(global_tenant_space) {
ObSqlSockSession* sess = (ObSqlSockSession*)udata;
ret = process_my_request(sess->req_processor_, sess->sock_req_);
}
}
}
return ret;
}
*/
int ObSqlSockHandler::on_readable(void* udata)
{
int ret = OB_SUCCESS;
rpc::ObPacket *pkt = NULL;
rpc::ObRequest *sql_req = NULL;
ObSqlSockSession* sess = (ObSqlSockSession*)udata;
if (NULL == sess) {
ret = OB_INVALID_ARGUMENT;
LOG_ERROR("sess is null!", K(ret));
} else if (OB_FAIL(sock_processor_.decode_sql_packet(*sess, pkt))) {
LOG_WARN("decode sql req fail", K(ret));
} else if (NULL == pkt) {
sess->revert_sock();
} else if (OB_FAIL(sock_processor_.build_sql_req(*sess, pkt, sql_req))) {
LOG_WARN("build sql req fail", K(ret));
}
if (OB_SUCCESS != ret || NULL == sql_req) {
} else if (OB_FAIL(deliver_->deliver(*sql_req))) {
LOG_WARN("deliver sql request fail", K(ret));
} else {
sess->set_last_decode_succ_and_deliver_time(ObTimeUtility::current_time());
}
return ret;
}
}; // end namespace obmysql
}; // end namespace oceanbase