13
#define USING_LOG_PREFIX SERVER_OMT
14
#include "ob_tenant_timezone_mgr.h"
15
#include "lib/thread/thread_mgr.h"
16
#include "observer/ob_sql_client_decorator.h"
17
#include "observer/ob_server_struct.h"
18
#include "share/ob_time_zone_info_manager.h"
19
#include "share/schema/ob_multi_version_schema_service.h"
20
#include "lib/hash/ob_hashset.h"
21
#include "observer/ob_server.h"
23
using namespace oceanbase::common;
29
void ObTenantTimezoneMgr::AddTenantTZTask::runTimerTask()
32
if (OB_ISNULL(tenant_tz_mgr_)) {
33
ret = OB_ERR_UNEXPECTED;
34
LOG_ERROR("update all tenant task, tenant tz mgr is null", K(ret));
35
} else if (OB_FAIL(tenant_tz_mgr_->update_timezone_map())) {
36
LOG_WARN("tenant timezone mgr update tenant timezone map failed", K(ret));
40
void ObTenantTimezoneMgr::DeleteTenantTZTask::runTimerTask()
43
if (OB_ISNULL(tenant_tz_mgr_)) {
44
ret = OB_ERR_UNEXPECTED;
45
LOG_ERROR("delete tenant task, tenant tz mgr is null", K(ret));
46
} else if (OB_FAIL(tenant_tz_mgr_->remove_nonexist_tenant())) {
47
LOG_WARN("remove nonexist tenants failed", K(ret));
51
int ObTenantTimezoneMgr::UpdateTenantTZOp::operator() (common::hash::HashMapPair<uint64_t, ObTenantTimezone*> &entry)
54
ObTenantTimezone &tenant_tz = *entry.second;
55
if (OB_FAIL(tenant_tz.get_tz_mgr().fetch_time_zone_info())) {
56
LOG_WARN("fail to update time zone info", K(ret));
61
void ObTenantTimezoneMgr::UpdateTenantTZTask::runTimerTask()
64
UpdateTenantTZOp update_op;
65
if (OB_ISNULL(tenant_tz_mgr_)) {
66
ret = OB_ERR_UNEXPECTED;
67
LOG_ERROR("delete tenant task, tenant tz mgr is null", K(ret));
68
} else if (OB_FAIL(tenant_tz_mgr_->timezone_map_.foreach_refactored(update_op))) {
69
LOG_WARN("update tenant time zone failed", K(ret));
73
ObTenantTimezoneMgr::ObTenantTimezoneMgr()
74
: allocator_("TenantTZ"), is_inited_(false), self_(), sql_proxy_(nullptr),
75
rwlock_(ObLatchIds::TIMEZONE_LOCK),
76
timezone_map_(), add_task_(this), delete_task_(this), update_task_(this),
78
schema_service_(nullptr)
80
tenant_tz_map_getter_ = ObTenantTimezoneMgr::get_tenant_timezone_default;
83
ObTenantTimezoneMgr::~ObTenantTimezoneMgr()
87
ObTenantTimezoneMgr &ObTenantTimezoneMgr::get_instance()
89
static ObTenantTimezoneMgr ob_tenant_timezone_mgr;
90
return ob_tenant_timezone_mgr;
93
int ObTenantTimezoneMgr::init(ObMySQLProxy &sql_proxy, const ObAddr &server,
94
share::schema::ObMultiVersionSchemaService &schema_service)
97
sql_proxy_ = &sql_proxy;
99
schema_service_ = &schema_service;
101
if (OB_FAIL(add_tenant_timezone(OB_SYS_TENANT_ID))) {
102
LOG_WARN("add tenant timezone info failed", K(ret));
104
tenant_tz_map_getter_ = ObTenantTimezoneMgr::get_tenant_timezone_static;
109
int ObTenantTimezoneMgr::start()
111
int ret = OB_SUCCESS;
112
const int64_t delay = SLEEP_USECONDS;
113
const bool repeat = true;
114
const bool immediate = true;
115
if (OB_FAIL(TG_START(lib::TGDefIDs::TIMEZONE_MGR))) {
116
LOG_WARN("fail to start timer", K(ret));
117
} else if (OB_FAIL(TG_SCHEDULE(lib::TGDefIDs::TIMEZONE_MGR, add_task_, delay, repeat, immediate))) {
118
LOG_WARN("schedual time zone mgr failed", K(ret));
119
} else if (OB_FAIL(TG_SCHEDULE(lib::TGDefIDs::TIMEZONE_MGR, delete_task_, delay, repeat, immediate))) {
120
LOG_WARN("schedual time zone mgr failed", K(ret));
121
} else if (OB_FAIL(TG_SCHEDULE(lib::TGDefIDs::TIMEZONE_MGR, update_task_, delay, repeat, immediate))) {
122
LOG_WARN("schedual time zone mgr failed", K(ret));
127
void ObTenantTimezoneMgr::init(tenant_timezone_map_getter tz_map_getter)
129
tenant_tz_map_getter_ = tz_map_getter;
133
void ObTenantTimezoneMgr::stop()
135
TG_STOP(lib::TGDefIDs::TIMEZONE_MGR);
138
void ObTenantTimezoneMgr::wait()
140
TG_WAIT(lib::TGDefIDs::TIMEZONE_MGR);
143
void ObTenantTimezoneMgr::destroy()
145
TG_DESTROY(lib::TGDefIDs::TIMEZONE_MGR);
146
timezone_map_.destroy();
149
int ObTenantTimezoneMgr::add_tenant_timezone(uint64_t tenant_id)
151
int ret = OB_SUCCESS;
152
ObTenantTimezone *const *timezone = nullptr;
153
DRWLock::WRLockGuard guard(rwlock_);
156
LOG_WARN("tenant timezone mgr not inited", K(ret));
157
} else if (is_virtual_tenant_id(tenant_id)
158
|| OB_NOT_NULL(timezone = timezone_map_.get(tenant_id))) {
160
ObTenantTimezone *new_timezone = nullptr;
161
new_timezone = OB_NEW(ObTenantTimezone, "TenantTZ", OBSERVER.get_mysql_proxy(), tenant_id);
162
if (OB_ISNULL(new_timezone)) {
163
ret = OB_ALLOCATE_MEMORY_FAILED;
164
LOG_WARN("alloc new tenant timezone failed", K(ret));
165
} else if(OB_FAIL(new_timezone->init())) {
166
LOG_WARN("new tenant timezone init failed", K(ret));
167
} else if (OB_FAIL(timezone_map_.set_refactored(tenant_id, new_timezone, 1))) {
168
LOG_WARN("add new tenant timezone failed", K(ret));
170
LOG_INFO("add tenant timezone success!", K(tenant_id), K(sizeof(ObTenantTimezone)));
173
ob_delete(new_timezone);
179
int ObTenantTimezoneMgr::del_tenant_timezone(uint64_t tenant_id)
181
int ret = OB_SUCCESS;
182
ObTenantTimezone *timezone = nullptr;
183
DRWLock::WRLockGuard guard(rwlock_);
184
if (is_virtual_tenant_id(tenant_id)) {
185
} else if (OB_FAIL(timezone_map_.get_refactored(tenant_id, timezone))) {
186
if (OB_HASH_NOT_EXIST == ret) {
189
LOG_WARN("get tenant timezone failed", K(tenant_id), K(ret));
191
} else if (OB_ISNULL(timezone)) {
192
ret = OB_ERR_UNEXPECTED;
193
LOG_WARN("time zone is null", K(ret), K(tenant_id));
194
} else if (OB_FAIL(timezone_map_.erase_refactored(tenant_id))) {
195
LOG_WARN("erase tenant timezone failed", K(ret), K(tenant_id));
197
LOG_INFO("drop tenant tz push back succeed", K(timezone->get_tenant_id()));
203
int ObTenantTimezoneMgr::get_tenant_timezone_inner(const uint64_t tenant_id,
204
ObTZMapWrap &timezone_wrap,
205
ObTimeZoneInfoManager *&tz_info_mgr)
207
int ret = OB_SUCCESS;
208
ObTenantTimezone *timezone = nullptr;
209
DRWLock::RDLockGuard guard(rwlock_);
210
if (OB_FAIL(timezone_map_.get_refactored(tenant_id, timezone))) {
211
if (OB_HASH_NOT_EXIST != ret) {
212
LOG_WARN("timezone map get refactored failed", K(ret));
214
} else if (OB_ISNULL(timezone)) {
215
ret = OB_ERR_UNEXPECTED;
216
LOG_WARN("tenant tz is null", K(ret));
218
timezone_wrap.set_tz_map(timezone->get_tz_map());
219
tz_info_mgr = &(timezone->get_tz_mgr());
225
int ObTenantTimezoneMgr::refresh_tenant_timezone(const uint64_t tenant_id)
227
int ret = OB_SUCCESS;
228
bool is_exist = false;
229
if (OB_LIKELY(OB_INVALID_ID != tenant_id)) {
230
share::schema::ObSchemaGetterGuard sys_schema_guard;
231
if (OB_ISNULL(schema_service_)) {
233
LOG_WARN("not init", K(ret));
234
} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID,
235
sys_schema_guard))) {
236
LOG_WARN("get sys tenant schema guard failed", K(ret));
237
} else if (OB_FAIL(sys_schema_guard.check_tenant_exist(tenant_id, is_exist))) {
238
LOG_WARN("get tenant ids failed", K(ret));
242
} else if (is_exist && OB_FAIL(add_tenant_timezone(tenant_id))) {
243
LOG_WARN("add tenant timezone failed", K(ret));
248
int ObTenantTimezoneMgr::get_tenant_timezone(const uint64_t tenant_id,
249
ObTZMapWrap &timezone_wrap,
250
ObTimeZoneInfoManager *&tz_info_mgr)
252
int ret = OB_SUCCESS;
253
if (OB_FAIL(get_tenant_timezone_inner(tenant_id, timezone_wrap, tz_info_mgr))) {
254
if (OB_HASH_NOT_EXIST == ret) {
256
if (OB_FAIL(refresh_tenant_timezone(tenant_id))) {
257
LOG_WARN("update timezone map failed", K(ret));
258
} else if (OB_FAIL(get_tenant_timezone_inner(tenant_id, timezone_wrap, tz_info_mgr))) {
259
if (OB_HASH_NOT_EXIST == ret) {
261
if (OB_FAIL(get_tenant_timezone_inner(OB_SYS_TENANT_ID, timezone_wrap, tz_info_mgr))) {
262
LOG_ERROR("get tenant time zone failed", K(ret), K(tenant_id));
265
LOG_WARN("get tenant time zone failed", K(ret), K(tenant_id));
269
LOG_WARN("failed to get tenant timezone", K(ret), K(tenant_id));
275
int ObTenantTimezoneMgr::remove_nonexist_tenant()
277
int ret = OB_SUCCESS;
278
ObArray<uint64_t> remove_tenant_ids;
280
TenantTimezoneMap::const_iterator it = timezone_map_.begin();
281
share::schema::ObSchemaGetterGuard sys_schema_guard;
282
if (OB_ISNULL(schema_service_)) {
284
LOG_WARN("not init", K(ret));
285
} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID,
286
sys_schema_guard))) {
287
LOG_WARN("get sys tenant schema guard failed", K(ret));
289
for(; OB_SUCC(ret) && it != timezone_map_.end(); it++) {
290
bool is_dropped = false;
291
if (OB_FAIL(sys_schema_guard.check_if_tenant_has_been_dropped(it->first, is_dropped))) {
292
LOG_WARN("check if tenant has been dropped failed", K(ret));
293
} else if (is_dropped && OB_FAIL(remove_tenant_ids.push_back(it->first))) {
294
LOG_WARN("push back failed", K(ret));
298
for (int64_t i = 0; OB_SUCC(ret) && i < remove_tenant_ids.count(); i++) {
299
if (OB_FAIL(del_tenant_timezone(remove_tenant_ids.at(i)))) {
300
LOG_WARN("del tenant timezone failed", K(ret));
307
int ObTenantTimezoneMgr::add_new_tenants(const common::ObIArray<uint64_t> &latest_tenant_ids)
309
int ret = OB_SUCCESS;
310
ObTenantTimezone *timezone = nullptr;
311
for (int64_t i = 0; i < latest_tenant_ids.count(); i++) {
312
uint64_t tenant_id = latest_tenant_ids.at(i);
313
if (OB_FAIL(timezone_map_.get_refactored(tenant_id, timezone))) {
314
if (OB_HASH_NOT_EXIST == ret) {
315
if (OB_FAIL(add_tenant_timezone(tenant_id))) {
316
LOG_WARN("add tenant timezone failed", K(ret));
319
LOG_WARN("get tenant timezone failed", K(ret));
328
int ObTenantTimezoneMgr::update_timezone_map()
330
int ret = OB_SUCCESS;
331
ObArray<uint64_t> latest_tenant_ids;
333
share::schema::ObSchemaGetterGuard sys_schema_guard;
334
if (OB_ISNULL(schema_service_)) {
336
LOG_WARN("not init", K(ret));
337
} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID,
338
sys_schema_guard))) {
339
LOG_WARN("get sys tenant schema guard failed", K(ret));
340
} else if (OB_FAIL(sys_schema_guard.get_tenant_ids(latest_tenant_ids))) {
341
LOG_WARN("get tenant ids failed", K(ret));
345
} else if (OB_FAIL(add_new_tenants(latest_tenant_ids))) {
346
LOG_WARN("add new tenants failed", K(ret));
350
int ObTenantTimezoneMgr::get_tenant_timezone_static(const uint64_t tenant_id,
351
ObTZMapWrap &timezone_wrap)
353
ObTimeZoneInfoManager *tz_info_mgr = NULL;
354
return get_instance().get_tenant_timezone(tenant_id, timezone_wrap, tz_info_mgr);
357
int ObTenantTimezoneMgr::get_tenant_tz(const uint64_t tenant_id,
358
ObTZMapWrap &timezone_wrap)
360
int ret = OB_SUCCESS;
361
if (OB_ISNULL(tenant_tz_map_getter_)) {
362
ret = OB_ERR_UNEXPECTED;
363
LOG_ERROR("tenant tz map getter is null", K(ret), K(tenant_id));
364
} else if (OB_FAIL(tenant_tz_map_getter_(tenant_id, timezone_wrap))) {
365
LOG_WARN("get tenant tz map failed", K(ret), K(tenant_id));
370
int ObTenantTimezoneMgr::get_tenant_timezone_default(const uint64_t tenant_id,
371
ObTZMapWrap &timezone_wrap)
373
int ret = OB_SUCCESS;
374
static ObTZInfoMap tz_map;
376
if (OB_UNLIKELY(! tz_map.is_inited()) &&
377
OB_FAIL(tz_map.init(SET_USE_500("TzMapStatic")))) {
378
LOG_WARN("init time zone info map failed", K(ret));
380
timezone_wrap.set_tz_map(&tz_map);