Files
oceanbase/src/observer/ob_inner_sql_connection_pool.h
2021-07-30 14:56:13 +08:00

119 lines
4.2 KiB
C++

/**
* 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.
*/
#ifndef OCEANBASE_OBSERVER_OB_INNER_SQL_CONNECTION_POOL_H_
#define OCEANBASE_OBSERVER_OB_INNER_SQL_CONNECTION_POOL_H_
#include "lib/allocator/page_arena.h"
#include "lib/list/ob_dlist.h"
#include "lib/mysqlclient/ob_isql_connection_pool.h"
#include "lib/lock/ob_thread_cond.h"
#include "ob_inner_sql_connection.h"
namespace oceanbase {
namespace common {
namespace sqlclient {
class ObISQLConnection;
}
class ObServerConfig;
} // namespace common
namespace share {
namespace schema {
class ObMultiVersionSchemaService;
}
} // namespace share
namespace sql {
class ObSql;
}
namespace observer {
class ObVTIterCreator;
class ObInnerSQLConnectionPool : public common::sqlclient::ObISQLConnectionPool {
public:
friend class ObInnerSQLConnection;
static constexpr int64_t RP_MAX_FREE_LIST_NUM = 1024;
class LinkNode : public common::ObDLinkBase<LinkNode> {};
static_assert(sizeof(LinkNode) <= sizeof(ObInnerSQLConnection), "inner sql connection size is too small");
ObInnerSQLConnectionPool();
virtual ~ObInnerSQLConnectionPool();
int init(share::schema::ObMultiVersionSchemaService* schema_service, sql::ObSql* ob_sql,
ObVTIterCreator* vt_iter_creator_, const share::ObPartitionTableOperator* partition_table_operator,
common::ObServerConfig* config = NULL);
virtual void stop()
{
stop_ = true;
}
// wait all connection been released
virtual int wait();
// sql string escape
virtual int escape(const char* from, const int64_t from_size, char* to, const int64_t to_size, int64_t& out_size) override;
// acquired connection must be released
virtual int acquire(common::sqlclient::ObISQLConnection*& conn, ObISQLClient* client_addr) override;
virtual int acquire(
common::sqlclient::ObISQLConnection*& conn, const int64_t cluster_id, ObISQLClient* client_addr) override;
virtual int release(common::sqlclient::ObISQLConnection* conn, const bool success) override;
int acquire_spi_conn(sql::ObSQLSessionInfo* session_info, observer::ObInnerSQLConnection*& conn);
int acquire(sql::ObSQLSessionInfo* session_info, common::sqlclient::ObISQLConnection*& conn);
virtual int on_client_inactive(common::ObISQLClient* client_addr) override;
virtual common::sqlclient::ObSQLConnPoolType get_type() override
{
return common::sqlclient::INNER_POOL;
}
void dump_used_conn_list();
private:
// alloc connection from %free_conn_list_
int alloc_conn(ObInnerSQLConnection*& conn);
// revert connection to %free_conn_list_
int free_conn(ObInnerSQLConnection* conn);
// revert connection, called by ObInnerSQLConnection::unref()
int revert(ObInnerSQLConnection* conn);
private:
// Dozens of connections may acquired by one worker in oracle mode, because all sys tables
// implemented by agent virtual table which need inner connection. Too many connections
// warning may be triggered by parallel execution complicate sys table queries.
//
// 100000 = 50 connections * 2000 workers.
const static int64_t WARNNING_CONNECTION_CNT = 100000;
const static int64_t MAX_DUMP_SIZE = 20;
private:
bool inited_;
volatile bool stop_;
common::ObThreadCond cond_;
int64_t total_conn_cnt_;
common::ObDList<LinkNode> free_conn_list_;
common::ObDList<ObInnerSQLConnection> used_conn_list_;
common::ObArenaAllocator allocator_;
share::schema::ObMultiVersionSchemaService* schema_service_;
const share::ObPartitionTableOperator* partition_table_operator_;
sql::ObSql* ob_sql_;
ObVTIterCreator* vt_iter_creator_;
common::ObServerConfig* config_;
DISALLOW_COPY_AND_ASSIGN(ObInnerSQLConnectionPool);
};
} // end namespace observer
} // end namespace oceanbase
#endif // OCEANBASE_OBSERVER_OB_INNER_SQL_CONNECTION_POOL_H_