194 lines
4.8 KiB
C++
194 lines
4.8 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 SHARE
|
|
#include "share/ob_locality_info.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace common;
|
|
namespace share
|
|
{
|
|
void ObLocalityZone::reset()
|
|
{
|
|
tenant_id_ = OB_INVALID_TENANT_ID;
|
|
region_priority_ = UINT64_MAX;
|
|
}
|
|
|
|
int ObLocalityZone::init(const uint64_t tenant_id, const uint64_t region_priority)
|
|
{
|
|
tenant_id_ = tenant_id;
|
|
region_priority_ = region_priority;
|
|
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
ObLocalityZone &ObLocalityZone::operator = (const ObLocalityZone &item)
|
|
{
|
|
tenant_id_ = item.tenant_id_;
|
|
region_priority_ = item.region_priority_;
|
|
return *this;
|
|
}
|
|
|
|
void ObLocalityRegion::reset()
|
|
{
|
|
region_.reset();
|
|
region_priority_ = UINT64_MAX;
|
|
zone_array_.reset();
|
|
}
|
|
|
|
void ObLocalityInfo::reset()
|
|
{
|
|
version_ = 0;
|
|
local_region_.reset();
|
|
local_zone_.reset();
|
|
local_idc_.reset();
|
|
local_zone_type_ = ObZoneType::ZONE_TYPE_INVALID;
|
|
local_zone_status_ = ObZoneStatus::UNKNOWN;
|
|
locality_region_array_.reset();
|
|
locality_zone_array_.reset();
|
|
}
|
|
|
|
void ObLocalityInfo::destroy()
|
|
{
|
|
locality_region_array_.destroy();
|
|
locality_zone_array_.destroy();
|
|
STORAGE_LOG(INFO, "ObLocalityInfo destroy finished");
|
|
}
|
|
|
|
int ObLocalityInfo::add_locality_zone(const ObLocalityZone &item)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(locality_zone_array_.push_back(item))) {
|
|
STORAGE_LOG(WARN, "push to locality info failed", K(ret), K(item));
|
|
} else {
|
|
// do nothing
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void ObLocalityInfo::set_version(const int64_t version)
|
|
{
|
|
version_= version;
|
|
}
|
|
|
|
int64_t ObLocalityInfo::get_version() const
|
|
{
|
|
return version_;
|
|
}
|
|
|
|
void ObLocalityInfo::set_local_region(const char *region)
|
|
{
|
|
local_region_ = region;
|
|
}
|
|
|
|
void ObLocalityInfo::set_local_zone(const char *zone)
|
|
{
|
|
local_zone_ = zone;
|
|
}
|
|
|
|
void ObLocalityInfo::set_local_idc(const char *idc)
|
|
{
|
|
local_idc_ = idc;
|
|
}
|
|
|
|
void ObLocalityInfo::set_local_zone_type(const ObZoneType zone_type)
|
|
{
|
|
local_zone_type_ = zone_type;
|
|
}
|
|
|
|
const char *ObLocalityInfo::get_local_zone() const
|
|
{
|
|
return local_zone_.ptr();
|
|
}
|
|
|
|
const char *ObLocalityInfo::get_local_region() const
|
|
{
|
|
return local_region_.ptr();
|
|
}
|
|
|
|
ObZoneType ObLocalityInfo::get_local_zone_type()
|
|
{
|
|
return local_zone_type_;
|
|
}
|
|
|
|
const char *ObLocalityInfo::get_local_idc() const
|
|
{
|
|
return local_idc_.ptr();
|
|
}
|
|
|
|
int ObLocalityInfo::get_locality_zone(const uint64_t tenant_id, ObLocalityZone &item)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t i = 0;
|
|
item.reset();
|
|
for (i = 0;i < locality_zone_array_.count(); i++) {
|
|
if (locality_zone_array_.at(i).get_tenant_id() == tenant_id) {
|
|
item = locality_zone_array_.at(i);
|
|
break;
|
|
}
|
|
}
|
|
if (i == locality_zone_array_.count()) {
|
|
ret = OB_ITER_END;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObLocalityInfo::get_region_priority(const uint64_t tenant_id, uint64_t ®ion_priority)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t i = 0;
|
|
region_priority = UINT64_MAX;
|
|
for (i = 0;i < locality_zone_array_.count(); i++) {
|
|
if (locality_zone_array_.at(i).get_tenant_id() == tenant_id) {
|
|
region_priority = locality_zone_array_.at(i).get_region_priority();
|
|
break;
|
|
}
|
|
}
|
|
if (i == locality_zone_array_.count()) {
|
|
ret = OB_ITER_END;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool ObLocalityInfo::is_valid()
|
|
{
|
|
return !local_zone_.is_empty()
|
|
&& !local_region_.is_empty()
|
|
&& ObZoneType::ZONE_TYPE_INVALID != local_zone_type_;
|
|
}
|
|
|
|
int ObLocalityInfo::copy_to(ObLocalityInfo &locality_info)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(locality_info.local_region_.assign(local_region_))) {
|
|
LOG_WARN("copy local region fail", K(ret), K_(local_region));
|
|
} else if (OB_FAIL(locality_info.local_zone_.assign(local_zone_))) {
|
|
LOG_WARN("copy local zone fail", K(ret), K_(local_zone));
|
|
} else if (OB_FAIL(locality_info.local_idc_.assign(local_idc_))) {
|
|
LOG_WARN("copy local idc fail", K(ret), K_(local_idc));
|
|
} else if (OB_FAIL(locality_info.locality_zone_array_.assign(locality_zone_array_))) {
|
|
LOG_WARN("copy locality_zone_array fail", K(ret), K_(locality_zone_array));
|
|
} else if (OB_FAIL(locality_info.locality_region_array_.assign(locality_region_array_))) {
|
|
LOG_WARN("copy locality_region_array fail", K(ret), K_(locality_region_array));
|
|
} else {
|
|
locality_info.local_zone_type_ = local_zone_type_;
|
|
locality_info.local_zone_status_ = local_zone_status_;
|
|
}
|
|
return ret;
|
|
}
|
|
} // end namespace share
|
|
} // end namespace oceanbase
|