110 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 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.
 | |
|  */
 | |
| 
 | |
| #define USING_LOG_PREFIX RS
 | |
| 
 | |
| #include "share/config/ob_server_config.h"
 | |
| #include "share/ob_server_status.h"
 | |
| #include "rootserver/ob_server_manager.h"
 | |
| #include "lib/container/ob_array_iterator.h"
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace rootserver
 | |
| {
 | |
| class ObServerStatusBuilder
 | |
| {
 | |
| public:
 | |
|   ObServerStatusBuilder() : config_(NULL), server_statuses_(), server_id_(OB_INIT_SERVER_ID) {}
 | |
|   int init(ObServerConfig &config) { config_ = &config; return OB_SUCCESS; }
 | |
|   void set_resource_info(const double cpu, const int64_t mem, const int64_t disk);
 | |
|   ObServerStatusBuilder &add(share::ObServerStatus::DisplayStatus status,
 | |
|                              const int64_t now,
 | |
|                              const ObAddr &server,
 | |
|                              const ObZone &zone);
 | |
|   ObServerManager::ObServerStatusArray &get_server_statuses() { return server_statuses_; }
 | |
|   void reset() { server_statuses_.reset(); }
 | |
|   int build(ObServerManager &server_mgr);
 | |
| private:
 | |
|   ObServerConfig *config_;
 | |
|   share::ObServerResourceInfo resource_;
 | |
|   ObServerManager::ObServerStatusArray server_statuses_;
 | |
|   uint64_t server_id_;
 | |
| };
 | |
| 
 | |
| void ObServerStatusBuilder::set_resource_info(const double cpu,
 | |
|                                               const int64_t mem,
 | |
|                                               const int64_t disk)
 | |
| {
 | |
|   resource_.cpu_ = cpu;
 | |
|   resource_.mem_in_use_ = 0;
 | |
|   resource_.mem_total_ = mem;
 | |
|   resource_.disk_in_use_ = 0;
 | |
|   resource_.disk_total_ = disk;
 | |
| }
 | |
| 
 | |
| ObServerStatusBuilder &ObServerStatusBuilder::add(share::ObServerStatus::DisplayStatus status,
 | |
|                                                   const int64_t now,
 | |
|                                                   const ObAddr &server,
 | |
|                                                   const ObZone &zone)
 | |
| {
 | |
|   share::ObServerStatus server_status;
 | |
|   if (share::ObServerStatus::OB_SERVER_INACTIVE == status) {
 | |
|     // lease outdate 4s
 | |
|     server_status.last_hb_time_ = now - config_->lease_time - 4000000;
 | |
|     server_status.admin_status_ = share::ObServerStatus::OB_SERVER_ADMIN_NORMAL;
 | |
|     server_status.hb_status_ = share::ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED;
 | |
|   } else if (share::ObServerStatus::OB_SERVER_ACTIVE == status) {
 | |
|     server_status.last_hb_time_ = now - 1000000;
 | |
|     server_status.admin_status_ = share::ObServerStatus::OB_SERVER_ADMIN_NORMAL;
 | |
|     server_status.hb_status_ = share::ObServerStatus::OB_HEARTBEAT_ALIVE;
 | |
|   } else if (share::ObServerStatus::OB_SERVER_DELETING == status) {
 | |
|     server_status.last_hb_time_ = 0;
 | |
|     server_status.admin_status_ = share::ObServerStatus::OB_SERVER_ADMIN_DELETING;
 | |
|     server_status.hb_status_ = share::ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED;
 | |
|   }
 | |
|   OB_ASSERT(strlen("dev1.0") == snprintf(server_status.build_version_, OB_SERVER_VERSION_LENGTH,
 | |
|       "%s", "dev1.0"));
 | |
|   server_status.zone_ = zone;
 | |
|   server_status.server_ = server;
 | |
|   server_status.resource_info_ = resource_;
 | |
|   server_status.id_ = server_id_;
 | |
|   server_status.start_service_time_ = ObTimeUtility::current_time();
 | |
|   OB_ASSERT(OB_SUCCESS == server_statuses_.push_back(server_status));
 | |
|   ++server_id_;
 | |
|   return *this;
 | |
| }
 | |
| 
 | |
| inline int ObServerStatusBuilder::build(ObServerManager &server_mgr)
 | |
| {
 | |
|   int ret = server_mgr.load_server_statuses(server_statuses_);
 | |
|   // build_server_status will change alive status to lease expired
 | |
|   if (OB_SUCC(ret)) {
 | |
|     FOREACH_X(s, server_statuses_, OB_SUCCESS == ret) {
 | |
|       if (!s->is_alive()) {
 | |
|         continue;
 | |
|       }
 | |
|       share::ObServerStatus ss;
 | |
|       if (OB_FAIL(server_mgr.get_server_status(s->server_, ss))) {
 | |
|       } else {
 | |
|         ss.hb_status_ = share::ObServerStatus::OB_HEARTBEAT_ALIVE;
 | |
|         if (OB_FAIL(server_mgr.update_server_status(ss))) {
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| }//end namespace rootserver
 | |
| }//end namespace oceanbase
 | 
