oceanbase
174 строки · 4.8 Кб
1/**
2* Copyright (c) 2023 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 "rootserver/mview/ob_mview_maintenance_service.h"
16#include "observer/omt/ob_multi_tenant.h"
17#include "share/ob_errno.h"
18#include "share/rc/ob_tenant_base.h"
19
20namespace oceanbase
21{
22namespace rootserver
23{
24using namespace common;
25
26/**
27* ObMViewMaintenanceService
28*/
29
30ObMViewMaintenanceService::ObMViewMaintenanceService() : is_inited_(false) {}
31
32ObMViewMaintenanceService::~ObMViewMaintenanceService() {}
33
34int ObMViewMaintenanceService::mtl_init(ObMViewMaintenanceService *&service)
35{
36int ret = OB_SUCCESS;
37if (OB_ISNULL(service)) {
38ret = OB_INVALID_ARGUMENT;
39LOG_WARN("invalid args", KR(ret), KP(service));
40} else if (OB_FAIL(service->init())) {
41LOG_WARN("fail to init mview maintenance service", KR(ret));
42}
43return ret;
44}
45
46int ObMViewMaintenanceService::init()
47{
48int ret = OB_SUCCESS;
49if (IS_INIT) {
50ret = OB_INIT_TWICE;
51LOG_WARN("ObMViewMaintenanceService init twice", KR(ret), KP(this));
52} else {
53if (OB_FAIL(mlog_maintenance_task_.init())) {
54LOG_WARN("fail to init mlog maintenance task", KR(ret));
55} else if (OB_FAIL(mview_maintenance_task_.init())) {
56LOG_WARN("fail to init mview maintenance task", KR(ret));
57} else if (OB_FAIL(mvref_stats_maintenance_task_.init())) {
58LOG_WARN("fail to init mvref stats maintenance task", KR(ret));
59} else {
60is_inited_ = true;
61}
62}
63return ret;
64}
65
66int ObMViewMaintenanceService::start()
67{
68int ret = OB_SUCCESS;
69if (IS_NOT_INIT) {
70ret = OB_NOT_INIT;
71LOG_WARN("ObMViewMaintenanceService not init", KR(ret), KP(this));
72} else {
73// do nothing
74}
75return ret;
76}
77
78void ObMViewMaintenanceService::stop()
79{
80mlog_maintenance_task_.stop();
81mview_maintenance_task_.stop();
82mvref_stats_maintenance_task_.stop();
83}
84
85void ObMViewMaintenanceService::wait()
86{
87mlog_maintenance_task_.wait();
88mview_maintenance_task_.wait();
89mvref_stats_maintenance_task_.wait();
90}
91
92void ObMViewMaintenanceService::destroy()
93{
94is_inited_ = false;
95mlog_maintenance_task_.destroy();
96mview_maintenance_task_.destroy();
97mvref_stats_maintenance_task_.destroy();
98}
99
100int ObMViewMaintenanceService::inner_switch_to_leader()
101{
102int ret = OB_SUCCESS;
103const uint64_t tenant_id = MTL_ID();
104int64_t start_time_us = ObTimeUtility::current_time();
105if (IS_NOT_INIT) {
106ret = OB_NOT_INIT;
107LOG_WARN("ObMViewMaintenanceService not init", KR(ret), KP(this));
108} else {
109if (OB_FAIL(mlog_maintenance_task_.start())) {
110LOG_WARN("fail to start mlog maintenance task", KR(ret));
111} else if (OB_FAIL(mview_maintenance_task_.start())) {
112LOG_WARN("fail to start mview maintenance task", KR(ret));
113} else if (OB_FAIL(mvref_stats_maintenance_task_.start())) {
114LOG_WARN("fail to start mvref stats maintenance task", KR(ret));
115}
116}
117const int64_t cost_us = ObTimeUtility::current_time() - start_time_us;
118FLOG_INFO("mview_maintenance: switch_to_leader", KR(ret), K(tenant_id), K(cost_us));
119return ret;
120}
121
122int ObMViewMaintenanceService::inner_switch_to_follower()
123{
124int ret = OB_SUCCESS;
125const uint64_t tenant_id = MTL_ID();
126int64_t start_time_us = ObTimeUtility::current_time();
127if (IS_NOT_INIT) {
128ret = OB_NOT_INIT;
129LOG_WARN("ObMViewMaintenanceService not init", KR(ret), KP(this));
130} else {
131mvref_stats_maintenance_task_.stop();
132}
133const int64_t cost_us = ObTimeUtility::current_time() - start_time_us;
134FLOG_INFO("mview_maintenance: switch_to_follower", KR(ret), K(tenant_id), K(cost_us));
135return ret;
136}
137
138void ObMViewMaintenanceService::switch_to_follower_forcedly()
139{
140int ret = OB_SUCCESS;
141if (OB_FAIL(inner_switch_to_follower())) {
142LOG_WARN("failed to switch leader", KR(ret));
143}
144}
145
146int ObMViewMaintenanceService::switch_to_leader()
147{
148int ret = OB_SUCCESS;
149if (OB_FAIL(inner_switch_to_leader())) {
150LOG_WARN("failed to switch leader", KR(ret));
151}
152return ret;
153}
154
155int ObMViewMaintenanceService::switch_to_follower_gracefully()
156{
157int ret = OB_SUCCESS;
158if (OB_FAIL(inner_switch_to_follower())) {
159LOG_WARN("failed to switch leader", KR(ret));
160}
161return ret;
162}
163
164int ObMViewMaintenanceService::resume_leader()
165{
166int ret = OB_SUCCESS;
167if (OB_FAIL(inner_switch_to_leader())) {
168LOG_WARN("failed to switch leader", KR(ret));
169}
170return ret;
171}
172
173} // namespace rootserver
174} // namespace oceanbase
175