173 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			5.1 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_SHARE_HEARTBEAT_OB_RS_MGR_H_
 | 
						|
#define OCEANBASE_SHARE_HEARTBEAT_OB_RS_MGR_H_
 | 
						|
 | 
						|
#include "lib/container/ob_se_array.h"
 | 
						|
#include "lib/hash/ob_hashmap.h"
 | 
						|
#include "lib/lock/ob_spin_lock.h"
 | 
						|
#include "lib/net/ob_addr.h"
 | 
						|
#include "lib/utility/ob_print_utils.h"
 | 
						|
#include "share/ob_lease_struct.h"
 | 
						|
#include "share/ob_inner_config_root_addr.h"
 | 
						|
#include "share/ob_web_service_root_addr.h"
 | 
						|
#include "share/ob_cluster_role.h"              // ObClusterRole
 | 
						|
 | 
						|
namespace oceanbase
 | 
						|
{
 | 
						|
namespace obrpc
 | 
						|
{
 | 
						|
class ObCommonRpcProxy;
 | 
						|
class ObSrvRpcProxy;
 | 
						|
struct ObDetectMasterRsLSResult;
 | 
						|
}
 | 
						|
namespace common
 | 
						|
{
 | 
						|
class ObCommonConfig;
 | 
						|
class ObMySQLProxy;
 | 
						|
}
 | 
						|
 | 
						|
namespace rootserver
 | 
						|
{
 | 
						|
class ObRootService;
 | 
						|
}
 | 
						|
 | 
						|
namespace share
 | 
						|
{
 | 
						|
class IHeartBeatProcess;
 | 
						|
class ObLSInfo;
 | 
						|
 | 
						|
class ObUnifiedAddrAgent : public ObRootAddrAgent
 | 
						|
{
 | 
						|
public:
 | 
						|
  enum AgentType {
 | 
						|
    INNER_CONFIG_AGENT = 0,
 | 
						|
    WEB_SERVICE_AGENT = 1,
 | 
						|
    MAX_AGENT_NUM
 | 
						|
  };
 | 
						|
public:
 | 
						|
  ObUnifiedAddrAgent();
 | 
						|
  int init(common::ObMySQLProxy &sql_proxy, common::ObServerConfig &config);
 | 
						|
  virtual int store(const ObIAddrList &addr_list, const ObIAddrList &readonly_addr_list,
 | 
						|
                    const bool force, const common::ObClusterRole cluster_role,
 | 
						|
                    const int64_t timestamp);
 | 
						|
  virtual int fetch(ObIAddrList &addr_list,
 | 
						|
                    ObIAddrList &readonly_addr_list);
 | 
						|
  int64_t get_agent_num() const
 | 
						|
  {
 | 
						|
    return MAX_AGENT_NUM;
 | 
						|
  }
 | 
						|
  int reload();
 | 
						|
  bool is_valid();
 | 
						|
private:
 | 
						|
  virtual int check_inner_stat() const;
 | 
						|
private:
 | 
						|
  bool is_inited_;
 | 
						|
  // ObWebServiceRootAddr and ObInnerConfigRootAddr
 | 
						|
  share::ObRootAddrAgent *agents_[MAX_AGENT_NUM];
 | 
						|
  share::ObWebServiceRootAddr web_service_root_addr_;
 | 
						|
  share::ObInnerConfigRootAddr inner_config_root_addr_;
 | 
						|
 | 
						|
  DISALLOW_COPY_AND_ASSIGN(ObUnifiedAddrAgent);
 | 
						|
};
 | 
						|
 | 
						|
/* @feature
 | 
						|
 *    1   single instance one server
 | 
						|
 *    2   maintenance in lease state manager
 | 
						|
 * @do_list
 | 
						|
 *    1   maintain rs pool
 | 
						|
 *    2   detect master rs if needed
 | 
						|
 */
 | 
						|
class ObRsMgr
 | 
						|
{
 | 
						|
public:
 | 
						|
  friend class ObLeaseStateMgr;
 | 
						|
  ObRsMgr();
 | 
						|
  virtual ~ObRsMgr();
 | 
						|
 | 
						|
  int init(obrpc::ObSrvRpcProxy *srv_rpc_proxy, common::ObServerConfig *config,
 | 
						|
      common::ObMySQLProxy *sql_proxy);
 | 
						|
  bool is_inited() const { return inited_; }
 | 
						|
 | 
						|
  ObUnifiedAddrAgent &get_addr_agent() { return addr_agent_; }
 | 
						|
 | 
						|
  //get master rootserver by cluster id
 | 
						|
  //@param [in] cluster_id
 | 
						|
  //@param [out] master rs of the cluster
 | 
						|
  int get_master_root_server(const int64_t cluster_id, common::ObAddr &addr) const;
 | 
						|
 | 
						|
  //get master rootserver of local cluster
 | 
						|
  //@param [out] master rs of local cluster
 | 
						|
  int get_master_root_server(common::ObAddr &addr) const;
 | 
						|
 | 
						|
  //renew master rootserver by cluster_id
 | 
						|
  //@param [in] cluster_id
 | 
						|
  int renew_master_rootserver(const int64_t cluster_id);
 | 
						|
 | 
						|
  //renew master rootserver of local cluster
 | 
						|
  int renew_master_rootserver();
 | 
						|
 | 
						|
  //only local cluster
 | 
						|
  int force_set_master_rs(const common::ObAddr &master_rs);
 | 
						|
 | 
						|
  //for remote cluster renew master rs and remove unused cluster
 | 
						|
  int renew_remote_master_rootserver();
 | 
						|
 | 
						|
 | 
						|
  // build a server_list to ask informations
 | 
						|
  // @param [in] check_ls_service: if is true, try get rs_list from ls service.
 | 
						|
  // @param [out] server_list, build from:
 | 
						|
  //              (1) get master_rs from ObRsMgr
 | 
						|
  //              (2) get rs_list from local configure
 | 
						|
  //              (3) get member_list from ObLSService
 | 
						|
  int construct_initial_server_list(
 | 
						|
      const bool check_ls_service,
 | 
						|
      common::ObIArray<common::ObAddr> &server_list);
 | 
						|
 | 
						|
private:
 | 
						|
  class ObRemoteClusterIdGetter
 | 
						|
  {
 | 
						|
  public:
 | 
						|
    ObRemoteClusterIdGetter() : cluster_id_list_() {}
 | 
						|
    ~ObRemoteClusterIdGetter() {}
 | 
						|
    int operator() (common::hash::HashMapPair<int64_t, common::ObAddr> &entry);
 | 
						|
    const ObIArray<int64_t> &get_cluster_id_list() const { return cluster_id_list_; }
 | 
						|
  private:
 | 
						|
    common::ObArray<int64_t> cluster_id_list_;
 | 
						|
    DISALLOW_COPY_AND_ASSIGN(ObRemoteClusterIdGetter);
 | 
						|
  };
 | 
						|
private:
 | 
						|
  int check_inner_stat() const;
 | 
						|
  int remove_unused_remote_master_rs_(const common::ObIArray<int64_t> &remote_cluster_id_list);
 | 
						|
  int convert_addr_array(
 | 
						|
          const ObIAddrList &root_addr_list,
 | 
						|
          common::ObIArray<common::ObAddr> &addr_list);
 | 
						|
  int get_all_rs_list_from_configure_(common::ObIArray<common::ObAddr> &addr_list);
 | 
						|
private:
 | 
						|
  bool inited_;
 | 
						|
  obrpc::ObSrvRpcProxy *srv_rpc_proxy_;
 | 
						|
  common::ObCommonConfig *config_;
 | 
						|
  ObUnifiedAddrAgent addr_agent_;
 | 
						|
 | 
						|
  mutable common::ObSpinLock lock_; //protect master_rs_
 | 
						|
  common::ObAddr master_rs_;
 | 
						|
  common::hash::ObHashMap<int64_t, common::ObAddr, common::hash::ReadWriteDefendMode> remote_master_rs_map_;
 | 
						|
 | 
						|
  DISALLOW_COPY_AND_ASSIGN(ObRsMgr);
 | 
						|
};
 | 
						|
 | 
						|
}//namespace share
 | 
						|
}//namespace oceanbase
 | 
						|
 | 
						|
#endif //__OB_COMMON_OB_RS_INFO_H__
 |