oceanbase
131 строка · 4.6 Кб
1/**
2* Copyright (c) 2021 OceanBase
3* OceanBase CE is licensed under Mulan PubL v2.
4* You can use this software according to the terms and conditions of the Mulan PubL v2.
5* You may obtain a copy of Mulan PubL v2 at:
6* http://license.coscl.org.cn/MulanPubL-2.0
7* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10* See the Mulan PubL v2 for more details.
11*/
12
13#define USING_LOG_PREFIX RS
14
15#include "ob_vtable_location_getter.h"
16
17#include "lib/container/ob_array_serialization.h"
18#include "lib/container/ob_array_iterator.h"
19#include "rootserver/ob_unit_manager.h"
20#include "share/ob_all_server_tracer.h"
21#include "share/ob_unit_table_operator.h"
22#include "rootserver/ob_root_utils.h"
23
24namespace oceanbase
25{
26using namespace common;
27using namespace share;
28namespace rootserver
29{
30ObVTableLocationGetter::ObVTableLocationGetter(ObUnitManager &unit_mgr) : unit_mgr_(unit_mgr)
31{
32}
33
34
35ObVTableLocationGetter::~ObVTableLocationGetter()
36{
37}
38
39// **FIXME (linqiucen.lqc): in the future, we can remove unit_mgr_,
40// ** then this func can be executed locally on observers
41int ObVTableLocationGetter::get(const ObVtableLocationType &vtable_type,
42ObSArray<common::ObAddr> &servers)
43{
44int ret = OB_SUCCESS;
45servers.reuse();
46if (OB_UNLIKELY(!vtable_type.is_valid()
47|| vtable_type.is_only_local())) {
48ret = OB_INVALID_ARGUMENT;
49LOG_WARN("input is invalid", KR(ret), K(vtable_type));
50} else if (vtable_type.is_only_rs()) {
51if (OB_FAIL(get_only_rs_vtable_location_(vtable_type, servers))) {
52LOG_WARN("get_only_rs_vtable_location failed", KR(ret), K(vtable_type));
53}
54} else if (vtable_type.is_cluster_distributed()) {
55if (OB_FAIL(get_global_vtable_location_(vtable_type, servers))) {
56LOG_WARN("get_global_vtable_location failed", KR(ret), K(vtable_type));
57}
58} else if (vtable_type.is_tenant_distributed()) {
59if (OB_FAIL(get_tenant_vtable_location_(vtable_type, servers))) {
60LOG_WARN("get_tenant_vtable_location failed", KR(ret), K(vtable_type));
61}
62} else {
63ret = OB_ERR_UNEXPECTED;
64LOG_ERROR("expected not to run here", KR(ret), K(vtable_type));
65}
66if (OB_SUCC(ret) && OB_UNLIKELY(servers.count() <= 0)) {
67ret = OB_LOCATION_NOT_EXIST;
68LOG_WARN("servers are empty", KR(ret), K(vtable_type), K(servers));
69}
70return ret;
71}
72
73int ObVTableLocationGetter::get_only_rs_vtable_location_(
74const ObVtableLocationType &vtable_type,
75ObSArray<ObAddr> &servers)
76{
77int ret = OB_SUCCESS;
78servers.reuse();
79ObAddr rs_addr;
80if (OB_UNLIKELY(!vtable_type.is_only_rs())) {
81ret = OB_INVALID_ARGUMENT;
82LOG_WARN("vtable_type is invalid", K(vtable_type), KR(ret));
83} else if (OB_ISNULL(GCTX.rs_mgr_)) {
84ret = OB_ERR_UNEXPECTED;
85LOG_WARN("GCTX.rs_mgr_ is null", KP(GCTX.rs_mgr_));
86} else if (OB_FAIL(GCTX.rs_mgr_->get_master_root_server(rs_addr))) {
87LOG_WARN("fail to get master root server", KR(ret), KP(GCTX.rs_mgr_));
88} else if (OB_UNLIKELY(!rs_addr.is_valid() || rs_addr != GCTX.self_addr())) {
89ret = OB_ENTRY_NOT_EXIST;
90LOG_WARN("rs_addr is invalid or not equal to self_addr", KR(ret), K(rs_addr), K(GCTX.self_addr()));
91} else if (OB_FAIL(servers.push_back(rs_addr))) {
92LOG_WARN("push_back failed", KR(ret), K(rs_addr));
93}
94return ret;
95}
96
97int ObVTableLocationGetter::get_global_vtable_location_(
98const ObVtableLocationType &vtable_type,
99ObSArray<ObAddr> &servers)
100{
101int ret = OB_SUCCESS;
102servers.reuse();
103ObZone zone; // empty zone means all zones
104if (OB_UNLIKELY(!(vtable_type.is_cluster_distributed()))) {
105ret = OB_INVALID_ARGUMENT;
106LOG_WARN("vtable_type is invalid", K(vtable_type), KR(ret));
107} else if (OB_FAIL(SVR_TRACER.get_alive_servers(zone, servers))) {
108LOG_WARN("get_alive_servers failed", KR(ret), KP(GCTX.sql_proxy_));
109}
110return ret;
111}
112
113int ObVTableLocationGetter::get_tenant_vtable_location_(
114const ObVtableLocationType &vtable_type,
115ObSArray<ObAddr> &servers)
116{
117int ret = OB_SUCCESS;
118const uint64_t tenant_id = vtable_type.get_tenant_id();
119if (OB_UNLIKELY(!vtable_type.is_valid()
120|| !vtable_type.is_tenant_distributed()
121|| is_sys_tenant(tenant_id))) { // sys_tenant should get cluster location
122ret = OB_INVALID_ARGUMENT;
123LOG_WARN("vtable_type is invalid", KR(ret), K(vtable_type));
124} else if (OB_FAIL(unit_mgr_.get_tenant_alive_servers_non_block(tenant_id, servers))) {
125LOG_WARN("failed to get tenant alive servers", KR(ret), K(tenant_id));
126}
127return ret;
128}
129
130}//end namespace rootserver
131}//end namespace oceanbase
132