oceanbase

Форк
0
/
ob_mview_maintenance_service.cpp 
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

20
namespace oceanbase
21
{
22
namespace rootserver
23
{
24
using namespace common;
25

26
/**
27
 * ObMViewMaintenanceService
28
 */
29

30
ObMViewMaintenanceService::ObMViewMaintenanceService() : is_inited_(false) {}
31

32
ObMViewMaintenanceService::~ObMViewMaintenanceService() {}
33

34
int ObMViewMaintenanceService::mtl_init(ObMViewMaintenanceService *&service)
35
{
36
  int ret = OB_SUCCESS;
37
  if (OB_ISNULL(service)) {
38
    ret = OB_INVALID_ARGUMENT;
39
    LOG_WARN("invalid args", KR(ret), KP(service));
40
  } else if (OB_FAIL(service->init())) {
41
    LOG_WARN("fail to init mview maintenance service", KR(ret));
42
  }
43
  return ret;
44
}
45

46
int ObMViewMaintenanceService::init()
47
{
48
  int ret = OB_SUCCESS;
49
  if (IS_INIT) {
50
    ret = OB_INIT_TWICE;
51
    LOG_WARN("ObMViewMaintenanceService init twice", KR(ret), KP(this));
52
  } else {
53
    if (OB_FAIL(mlog_maintenance_task_.init())) {
54
      LOG_WARN("fail to init mlog maintenance task", KR(ret));
55
    } else if (OB_FAIL(mview_maintenance_task_.init())) {
56
      LOG_WARN("fail to init mview maintenance task", KR(ret));
57
    } else if (OB_FAIL(mvref_stats_maintenance_task_.init())) {
58
      LOG_WARN("fail to init mvref stats maintenance task", KR(ret));
59
    } else {
60
      is_inited_ = true;
61
    }
62
  }
63
  return ret;
64
}
65

66
int ObMViewMaintenanceService::start()
67
{
68
  int ret = OB_SUCCESS;
69
  if (IS_NOT_INIT) {
70
    ret = OB_NOT_INIT;
71
    LOG_WARN("ObMViewMaintenanceService not init", KR(ret), KP(this));
72
  } else {
73
    // do nothing
74
  }
75
  return ret;
76
}
77

78
void ObMViewMaintenanceService::stop()
79
{
80
  mlog_maintenance_task_.stop();
81
  mview_maintenance_task_.stop();
82
  mvref_stats_maintenance_task_.stop();
83
}
84

85
void ObMViewMaintenanceService::wait()
86
{
87
  mlog_maintenance_task_.wait();
88
  mview_maintenance_task_.wait();
89
  mvref_stats_maintenance_task_.wait();
90
}
91

92
void ObMViewMaintenanceService::destroy()
93
{
94
  is_inited_ = false;
95
  mlog_maintenance_task_.destroy();
96
  mview_maintenance_task_.destroy();
97
  mvref_stats_maintenance_task_.destroy();
98
}
99

100
int ObMViewMaintenanceService::inner_switch_to_leader()
101
{
102
  int ret = OB_SUCCESS;
103
  const uint64_t tenant_id = MTL_ID();
104
  int64_t start_time_us = ObTimeUtility::current_time();
105
  if (IS_NOT_INIT) {
106
    ret = OB_NOT_INIT;
107
    LOG_WARN("ObMViewMaintenanceService not init", KR(ret), KP(this));
108
  } else {
109
    if (OB_FAIL(mlog_maintenance_task_.start())) {
110
      LOG_WARN("fail to start mlog maintenance task", KR(ret));
111
    } else if (OB_FAIL(mview_maintenance_task_.start())) {
112
      LOG_WARN("fail to start mview maintenance task", KR(ret));
113
    } else if (OB_FAIL(mvref_stats_maintenance_task_.start())) {
114
      LOG_WARN("fail to start mvref stats maintenance task", KR(ret));
115
    }
116
  }
117
  const int64_t cost_us = ObTimeUtility::current_time() - start_time_us;
118
  FLOG_INFO("mview_maintenance: switch_to_leader", KR(ret), K(tenant_id), K(cost_us));
119
  return ret;
120
}
121

122
int ObMViewMaintenanceService::inner_switch_to_follower()
123
{
124
  int ret = OB_SUCCESS;
125
  const uint64_t tenant_id = MTL_ID();
126
  int64_t start_time_us = ObTimeUtility::current_time();
127
  if (IS_NOT_INIT) {
128
    ret = OB_NOT_INIT;
129
    LOG_WARN("ObMViewMaintenanceService not init", KR(ret), KP(this));
130
  } else {
131
    mvref_stats_maintenance_task_.stop();
132
  }
133
  const int64_t cost_us = ObTimeUtility::current_time() - start_time_us;
134
  FLOG_INFO("mview_maintenance: switch_to_follower", KR(ret), K(tenant_id), K(cost_us));
135
  return ret;
136
}
137

138
void ObMViewMaintenanceService::switch_to_follower_forcedly()
139
{
140
  int ret = OB_SUCCESS;
141
  if (OB_FAIL(inner_switch_to_follower())) {
142
    LOG_WARN("failed to switch leader", KR(ret));
143
  }
144
}
145

146
int ObMViewMaintenanceService::switch_to_leader()
147
{
148
  int ret = OB_SUCCESS;
149
  if (OB_FAIL(inner_switch_to_leader())) {
150
    LOG_WARN("failed to switch leader", KR(ret));
151
  }
152
  return ret;
153
}
154

155
int ObMViewMaintenanceService::switch_to_follower_gracefully()
156
{
157
  int ret = OB_SUCCESS;
158
  if (OB_FAIL(inner_switch_to_follower())) {
159
    LOG_WARN("failed to switch leader", KR(ret));
160
  }
161
  return ret;
162
}
163

164
int ObMViewMaintenanceService::resume_leader()
165
{
166
  int ret = OB_SUCCESS;
167
  if (OB_FAIL(inner_switch_to_leader())) {
168
    LOG_WARN("failed to switch leader", KR(ret));
169
  }
170
  return ret;
171
}
172

173
} // namespace rootserver
174
} // namespace oceanbase
175

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.