362 lines
10 KiB
C++
362 lines
10 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 _OCEABASE_OBSERVER_OB_SERVER_STRUCT_H_
|
|
#define _OCEABASE_OBSERVER_OB_SERVER_STRUCT_H_
|
|
|
|
// DON'T INCLUDE ANY OCEANBASE HEADER EXCEPT FROM LIB DIRECTORY
|
|
#include "share/ob_lease_struct.h"
|
|
#include "lib/net/ob_addr.h"
|
|
#include "share/part/ob_part_mgr.h"
|
|
#include "share/ob_cluster_info_proxy.h"
|
|
#include "share/ob_cluster_type.h" // ObClusterType
|
|
#include "share/ob_rpc_struct.h"
|
|
|
|
namespace oceanbase {
|
|
namespace common {
|
|
class ObServerConfig;
|
|
class ObConfigManager;
|
|
class ObMySQLProxy;
|
|
class ObTimer;
|
|
class ObIDataAccessService;
|
|
class ObMysqlRandom;
|
|
} // end of namespace common
|
|
|
|
namespace obrpc {
|
|
class ObSrvRpcProxy;
|
|
class ObCommonRpcProxy;
|
|
class ObLoadDataRpcProxy;
|
|
} // namespace obrpc
|
|
|
|
namespace share {
|
|
class ObResourcePlanManager;
|
|
class ObPartitionTableOperator;
|
|
class ObRemotePartitionTableOperator;
|
|
class ObRsMgr;
|
|
class ObPartitionLocationCache;
|
|
class ObRemoteSqlProxy;
|
|
class ObSchemaStatusProxy;
|
|
namespace schema {
|
|
class ObMultiVersionSchemaService;
|
|
} // end of namespace schema
|
|
} // end of namespace share
|
|
|
|
namespace rootserver {
|
|
class ObRootService;
|
|
class ObInZoneMaster;
|
|
} // end of namespace rootserver
|
|
|
|
namespace sql {
|
|
class ObSQLSessionMgr;
|
|
class ObQueryExecCtxMgr;
|
|
class ObSql;
|
|
class ObExecutorRpcImpl;
|
|
} // end of namespace sql
|
|
|
|
namespace storage {
|
|
class ObPartitionService;
|
|
class ObPtfMgr;
|
|
} // namespace storage
|
|
|
|
namespace transaction {
|
|
class ObGlobalTimestampService;
|
|
class ObIWeakReadService;
|
|
} // namespace transaction
|
|
|
|
namespace obmysql {
|
|
class ObDiag;
|
|
} // end of namespace obmysql
|
|
|
|
namespace omt {
|
|
class ObMultiTenant;
|
|
class ObCgroupCtrl;
|
|
} // namespace omt
|
|
|
|
namespace observer {
|
|
class ObService;
|
|
class ObVTIterCreator;
|
|
|
|
class ObServerOptions {
|
|
public:
|
|
ObServerOptions()
|
|
: rpc_port_(0),
|
|
elect_port_(0),
|
|
mysql_port_(0),
|
|
home_(NULL),
|
|
zone_(NULL),
|
|
nodaemon_(false),
|
|
optstr_(NULL),
|
|
devname_(NULL),
|
|
rs_list_(NULL),
|
|
appname_(NULL),
|
|
cluster_id_(common::OB_INVALID_CLUSTER_ID),
|
|
data_dir_(NULL),
|
|
mode_(NULL),
|
|
log_level_(0),
|
|
use_ipv6_(false),
|
|
flashback_scn_(0)
|
|
{}
|
|
ObServerOptions(int rpc_port, int elect_port, int mysql_port, const char* home, const char* zone, bool nodaemon,
|
|
const char* optstr, const char* devname, const char* rs_list, const char* appname, int64_t cluster_id,
|
|
const char* data_dir, int8_t log_level, const char* mode, bool use_ipv6, int64_t flashback_scn)
|
|
{
|
|
rpc_port_ = rpc_port;
|
|
elect_port_ = elect_port;
|
|
mysql_port_ = mysql_port;
|
|
home_ = home;
|
|
zone_ = zone;
|
|
nodaemon_ = nodaemon;
|
|
optstr_ = optstr;
|
|
devname_ = devname;
|
|
rs_list_ = rs_list;
|
|
appname_ = appname;
|
|
cluster_id_ = cluster_id;
|
|
data_dir_ = data_dir;
|
|
mode_ = mode;
|
|
log_level_ = log_level;
|
|
use_ipv6_ = use_ipv6;
|
|
flashback_scn_ = flashback_scn;
|
|
}
|
|
virtual ~ObServerOptions()
|
|
{}
|
|
|
|
int rpc_port_;
|
|
int elect_port_;
|
|
int mysql_port_;
|
|
const char* home_;
|
|
const char* zone_;
|
|
bool nodaemon_;
|
|
const char* optstr_;
|
|
const char* devname_;
|
|
const char* rs_list_;
|
|
const char* appname_;
|
|
int64_t cluster_id_;
|
|
const char* data_dir_;
|
|
const char* mode_;
|
|
int8_t log_level_;
|
|
bool use_ipv6_;
|
|
int64_t flashback_scn_;
|
|
};
|
|
|
|
enum ObServerMode {
|
|
INVALID_MODE = 0,
|
|
NORMAL_MODE,
|
|
PHY_FLASHBACK_MODE,
|
|
PHY_FLASHBACK_VERIFY_MODE,
|
|
};
|
|
|
|
enum ObServiceStatus { SS_INIT, SS_STARTING, SS_SERVING, SS_STOPPING, SS_STOPPED };
|
|
|
|
struct ObGlobalContext {
|
|
common::ObAddr self_addr_;
|
|
rootserver::ObRootService* root_service_;
|
|
rootserver::ObInZoneMaster* in_zone_master_;
|
|
observer::ObService* ob_service_;
|
|
share::schema::ObMultiVersionSchemaService* schema_service_;
|
|
common::ObPartMgr* part_mgr_;
|
|
common::ObServerConfig* config_;
|
|
common::ObConfigManager* config_mgr_;
|
|
share::ObPartitionTableOperator* pt_operator_;
|
|
share::ObRemotePartitionTableOperator* remote_pt_operator_;
|
|
obrpc::ObSrvRpcProxy* srv_rpc_proxy_;
|
|
obrpc::ObCommonRpcProxy* rs_rpc_proxy_;
|
|
obrpc::ObLoadDataRpcProxy* load_data_proxy_;
|
|
sql::ObExecutorRpcImpl* executor_rpc_;
|
|
common::ObMySQLProxy* sql_proxy_;
|
|
share::ObRemoteSqlProxy* remote_sql_proxy_;
|
|
common::ObDbLinkProxy* dblink_proxy_;
|
|
share::ObRsMgr* rs_mgr_;
|
|
storage::ObPartitionService* par_ser_;
|
|
transaction::ObGlobalTimestampService* gts_;
|
|
common::ObInOutBandwidthThrottle* bandwidth_throttle_;
|
|
common::ObIDataAccessService* vt_par_ser_;
|
|
sql::ObSQLSessionMgr* session_mgr_;
|
|
sql::ObQueryExecCtxMgr* query_ctx_mgr_;
|
|
sql::ObSql* sql_engine_;
|
|
omt::ObMultiTenant* omt_;
|
|
ObVTIterCreator* vt_iter_creator_;
|
|
share::ObPartitionLocationCache* location_cache_;
|
|
int64_t start_time_;
|
|
int64_t* merged_version_;
|
|
int64_t* global_last_merged_version_;
|
|
int64_t* warm_up_start_time_;
|
|
uint64_t server_id_;
|
|
ObServiceStatus status_;
|
|
ObServerMode mode_;
|
|
share::RSServerStatus rs_server_status_;
|
|
int64_t start_service_time_;
|
|
common::ObString* sort_dir_;
|
|
obmysql::ObDiag* diag_;
|
|
common::ObMysqlRandom* scramble_rand_;
|
|
omt::ObCgroupCtrl* cgroup_ctrl_;
|
|
bool inited_;
|
|
int64_t split_schema_version_;
|
|
// the start schema_version that sys can read and write __all_table_v2/__all_table_history_v2
|
|
int64_t split_schema_version_v2_;
|
|
transaction::ObIWeakReadService* weak_read_service_;
|
|
share::ObSchemaStatusProxy* schema_status_proxy_;
|
|
int64_t flashback_scn_;
|
|
int64_t ssl_key_expired_time_;
|
|
// the cluster_id of the strongly synchronized standby cluster
|
|
int64_t sync_standby_cluster_id_;
|
|
// the redo_transport_option of the strongly synchronized standby cluster
|
|
share::ObRedoTransportOption sync_standby_redo_options_;
|
|
// the number of partitions that failed to receive
|
|
// the acks from strongly synchronized standby cluster during timeout
|
|
volatile int64_t sync_timeout_partition_cnt_;
|
|
|
|
ObGlobalContext()
|
|
{
|
|
MEMSET(this, 0, sizeof(*this));
|
|
init();
|
|
}
|
|
ObGlobalContext& operator=(const ObGlobalContext& other);
|
|
void init();
|
|
bool is_inited() const
|
|
{
|
|
return inited_;
|
|
}
|
|
// Refer to the high availability zone design document
|
|
bool is_observer() const;
|
|
bool is_standby_cluster_and_started()
|
|
{
|
|
return is_observer() && is_standby_cluster() && has_start_service();
|
|
}
|
|
bool is_started_and_can_weak_read()
|
|
{
|
|
return is_observer() && has_start_service();
|
|
}
|
|
bool is_schema_splited() const
|
|
{
|
|
return common::OB_INVALID_VERSION != split_schema_version_;
|
|
}
|
|
void set_split_schema_version(int64_t new_split_schema_version);
|
|
void set_split_schema_version_v2(int64_t new_split_schema_version);
|
|
int64_t get_switch_epoch2() const;
|
|
int64_t get_pure_switch_epoch() const;
|
|
bool is_primary_cluster() const;
|
|
bool is_standby_cluster() const;
|
|
common::ObClusterType get_cluster_type() const;
|
|
share::ServerServiceStatus get_server_service_status() const;
|
|
bool can_be_parent_cluster() const;
|
|
bool can_do_leader_takeover() const;
|
|
bool is_in_primary_switching_state() const;
|
|
void get_cluster_type_and_status(
|
|
common::ObClusterType& cluster_type, share::ServerServiceStatus& server_status) const;
|
|
bool is_in_standby_switching_state() const;
|
|
int64_t get_cluster_idx() const;
|
|
bool is_in_standby_active_state() const;
|
|
bool is_in_phy_fb_mode() const;
|
|
bool is_in_phy_fb_verify_mode() const;
|
|
void set_cluster_idx(const int64_t cluster_idx);
|
|
bool is_in_flashback_state() const;
|
|
bool is_in_cleanup_state() const;
|
|
bool is_in_invalid_state() const;
|
|
bool is_in_disabled_state() const;
|
|
bool need_sync_to_standby() const
|
|
{
|
|
return false;
|
|
}
|
|
// retrun whether the protection mode of cluster is max_availability
|
|
// it is used to judge need revoke for clog
|
|
bool is_in_max_availability_mode() const
|
|
{
|
|
return false;
|
|
}
|
|
// Determine whether the standby database is in strong synchronization state,
|
|
// and whether it needs to accept strong synchronization logs
|
|
bool is_sync_level_on_standby()
|
|
{
|
|
return false;
|
|
}
|
|
int64_t get_cluster_info_version() const
|
|
{
|
|
return 0;
|
|
}
|
|
common::ObProtectionMode get_protection_mode()
|
|
{
|
|
return common::MAXIMUM_PERFORMANCE_MODE;
|
|
}
|
|
int get_sync_standby_cluster_list(common::ObIArray<int64_t>& sync_standby);
|
|
int get_sync_standby_cluster_id(int64_t& sync_cluster_id);
|
|
void set_upgrade_stage(obrpc::ObUpgradeStage upgrade_stage)
|
|
{
|
|
upgrade_stage_ = upgrade_stage;
|
|
}
|
|
obrpc::ObUpgradeStage get_upgrade_stage()
|
|
{
|
|
return upgrade_stage_;
|
|
}
|
|
DECLARE_TO_STRING;
|
|
const share::ObClusterInfo& get_cluster_info() const
|
|
{
|
|
return cluster_info_;
|
|
}
|
|
void inc_sync_timeout_partition_cnt()
|
|
{
|
|
ATOMIC_INC(&sync_timeout_partition_cnt_);
|
|
}
|
|
void reset_sync_timeout_partition_cnt()
|
|
{
|
|
ATOMIC_SET(&sync_timeout_partition_cnt_, 0);
|
|
}
|
|
// Retruns the number of partitions that failed to receive
|
|
// the acks from strongly synchronized standby cluster during timeout
|
|
int64_t get_sync_timeout_partition_cnt() const
|
|
{
|
|
return ATOMIC_LOAD(&sync_timeout_partition_cnt_);
|
|
}
|
|
// Returns the timeout of the strongly synchronized standby cluster
|
|
int64_t get_sync_standby_net_timeout()
|
|
{
|
|
return ATOMIC_LOAD(&sync_standby_redo_options_.net_timeout_);
|
|
}
|
|
|
|
private:
|
|
common::SpinRWLock cluster_info_rwlock_;
|
|
share::ObClusterInfo cluster_info_;
|
|
int64_t cluster_idx_; // Internal identification of cluster
|
|
volatile int64_t server_status_;
|
|
bool has_start_service() const
|
|
{
|
|
return 0 < start_service_time_;
|
|
}
|
|
|
|
obrpc::ObUpgradeStage upgrade_stage_;
|
|
};
|
|
|
|
struct ObThreadContext {
|
|
const ObGlobalContext* gctx_;
|
|
};
|
|
|
|
ObGlobalContext& global_context();
|
|
|
|
struct ObUseWeakGuard {
|
|
ObUseWeakGuard();
|
|
~ObUseWeakGuard();
|
|
static bool did_use_weak();
|
|
|
|
private:
|
|
struct TSIUseWeak {
|
|
bool inited_;
|
|
bool did_use_weak_;
|
|
TSIUseWeak() : inited_(false), did_use_weak_(false)
|
|
{}
|
|
};
|
|
};
|
|
} // end of namespace observer
|
|
} // end of namespace oceanbase
|
|
|
|
#define GCTX (::oceanbase::observer::global_context())
|
|
|
|
#endif /* _OCEABASE_OBSERVER_OB_SERVER_STRUCT_H_ */
|