oceanbase
11324 строки · 444.2 Кб
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 "observer/ob_server.h"
16#include "rootserver/ob_root_service.h"
17
18#include "share/ob_define.h"
19#include "lib/time/ob_time_utility.h"
20#include "lib/string/ob_sql_string.h"
21#include "lib/utility/ob_preload.h"
22#include "lib/worker.h"
23#include "lib/oblog/ob_log_module.h"
24#include "lib/container/ob_se_array_iterator.h"
25#include "lib/container/ob_array_iterator.h"
26#include "lib/file/file_directory_utils.h"
27#include "lib/encrypt/ob_encrypted_helper.h"
28
29#include "share/ob_srv_rpc_proxy.h"
30#include "share/ob_thread_mgr.h"
31#include "common/ob_timeout_ctx.h"
32#include "common/object/ob_object.h"
33#include "share/ob_cluster_version.h"
34
35#include "share/ob_define.h"
36#include "share/ob_version.h"
37#include "share/schema/ob_schema_service.h"
38#include "share/schema/ob_multi_version_schema_service.h"
39#include "share/schema/ob_schema_utils.h"
40#include "share/schema/ob_schema_mgr.h"
41#include "share/ob_lease_struct.h"
42#include "share/ob_common_rpc_proxy.h"
43#include "share/config/ob_config_helper.h"
44#include "share/config/ob_config_manager.h"
45#include "share/inner_table/ob_inner_table_schema.h"
46#include "share/schema/ob_part_mgr_util.h"
47#include "share/ob_web_service_root_addr.h"
48#include "share/ob_inner_config_root_addr.h"
49#include "share/ob_global_stat_proxy.h"
50#include "share/ob_autoincrement_service.h"
51#include "share/ob_time_zone_info_manager.h"
52#include "share/ob_server_status.h"
53#include "share/ob_index_builder_util.h"
54#include "observer/ob_server_struct.h"
55#include "observer/omt/ob_tenant_config_mgr.h"
56#include "observer/ob_server_event_history_table_operator.h"
57#include "share/ob_upgrade_utils.h"
58#include "share/deadlock/ob_deadlock_inner_table_service.h"
59#ifdef OB_BUILD_TDE_SECURITY
60#include "share/ob_master_key_getter.h"
61#endif
62#ifdef OB_BUILD_ARBITRATION
63#include "share/arbitration_service/ob_arbitration_service_utils.h" // ObArbitrationServiceUtils
64#endif
65#include "share/ob_max_id_fetcher.h" // ObMaxIdFetcher
66#include "share/backup/ob_backup_config.h"
67#include "share/backup/ob_backup_helper.h"
68#include "share/scheduler/ob_sys_task_stat.h"
69
70#include "sql/executor/ob_executor_rpc_proxy.h"
71#include "sql/engine/cmd/ob_user_cmd_executor.h"
72#include "sql/engine/px/ob_px_util.h"
73#include "observer/dbms_job/ob_dbms_job_master.h"
74#include "observer/dbms_scheduler/ob_dbms_sched_job_master.h"
75
76#include "rootserver/ob_bootstrap.h"
77#include "rootserver/ob_schema2ddl_sql.h"
78#include "rootserver/ob_index_builder.h"
79#include "rootserver/ob_mlog_builder.h"
80#include "rootserver/ob_update_rs_list_task.h"
81#include "rootserver/ob_resource_weight_parser.h"
82#include "rootserver/ob_rs_job_table_operator.h"
83#include "rootserver/restore/ob_restore_util.h"
84#include "rootserver/ob_root_utils.h"
85#include "rootserver/ob_vertical_partition_builder.h"
86#include "rootserver/ob_ddl_sql_generator.h"
87#include "rootserver/ddl_task/ob_ddl_task.h"
88#include "rootserver/ddl_task/ob_constraint_task.h"
89#include "share/ob_ddl_sim_point.h"
90#include "storage/ob_file_system_router.h"
91#include "storage/tx/ob_ts_mgr.h"
92#include "lib/stat/ob_diagnose_info.h"
93#include "rootserver/ob_cluster_event.h" // CLUSTER_EVENT_ADD_CONTROL
94#include "observer/omt/ob_tenant_timezone_mgr.h"
95#include "share/backup/ob_backup_io_adapter.h"
96#include "share/ob_global_context_operator.h"
97
98#include "share/ls/ob_ls_table_operator.h" // for ObLSTableOperator
99#include "share/ls/ob_ls_status_operator.h"//ls_status_operator
100#include "share/ob_max_id_fetcher.h" //ObMaxIdFetcher
101#include "observer/ob_service.h"
102#include "storage/ob_file_system_router.h"
103#include "storage/ddl/ob_ddl_heart_beat_task.h"
104#include "rootserver/freeze/ob_major_freeze_helper.h"
105#include "share/restore/ob_physical_restore_table_operator.h"//ObPhysicalRestoreTableOperator
106#include "share/ob_cluster_event_history_table_operator.h"//CLUSTER_EVENT_INSTANCE
107#include "share/scn.h"
108#include "share/restore/ob_recover_table_util.h"
109#include "rootserver/backup/ob_backup_proxy.h" //ObBackupServiceProxy
110#include "logservice/palf_handle_guard.h"
111#include "logservice/ob_log_service.h"
112#include "rootserver/restore/ob_recover_table_initiator.h"
113#include "rootserver/ob_heartbeat_service.h"
114#include "share/tenant_snapshot/ob_tenant_snapshot_table_operator.h"
115#include "share/restore/ob_tenant_clone_table_operator.h"
116#include "rootserver/tenant_snapshot/ob_tenant_snapshot_util.h"
117#include "rootserver/restore/ob_tenant_clone_util.h"
118
119#include "parallel_ddl/ob_create_table_helper.h" // ObCreateTableHelper
120#include "parallel_ddl/ob_create_view_helper.h" // ObCreateViewHelper
121
122namespace oceanbase
123{
124
125using namespace common;
126using namespace obrpc;
127using namespace share;
128using namespace share::schema;
129using namespace storage;
130using namespace dbms_job;
131
132namespace rootserver
133{
134
135#define PUSH_BACK_TO_ARRAY_AND_SET_RET(array, msg) \
136do { \
137if (OB_FAIL(array.push_back(msg))) { \
138LOG_WARN("push reason array error", KR(ret), K(array), K(msg)); \
139} \
140} while(0)
141
142ObRootService::ObStatusChangeCallback::ObStatusChangeCallback(ObRootService &root_service)
143: root_service_(root_service)
144{
145}
146
147ObRootService::ObStatusChangeCallback::~ObStatusChangeCallback()
148{
149}
150
151int ObRootService::ObStatusChangeCallback::wakeup_balancer()
152{
153int ret = OB_SUCCESS;
154if (!root_service_.is_inited()) {
155ret = OB_NOT_INIT;
156LOG_WARN("root_service not init", K(ret));
157} else {
158root_service_.get_root_balancer().wakeup();
159}
160return ret;
161}
162
163int ObRootService::ObStatusChangeCallback::wakeup_daily_merger()
164{
165int ret = OB_SUCCESS;
166if (!root_service_.is_inited()) {
167ret = OB_NOT_INIT;
168LOG_WARN("root_service not init", K(ret));
169} else {
170//root_service_.get_daily_merge_scheduler().wakeup();
171}
172return ret;
173}
174
175int ObRootService::ObStatusChangeCallback::on_server_status_change(const common::ObAddr &server)
176{
177int ret = OB_SUCCESS;
178if (!root_service_.is_inited()) {
179ret = OB_NOT_INIT;
180LOG_WARN("root service not inited", K(ret));
181} else if (!server.is_valid()) {
182ret = OB_INVALID_ARGUMENT;
183LOG_WARN("invalid server", K(server), K(ret));
184} else if (OB_FAIL(root_service_.submit_update_all_server_task(server))) {
185LOG_WARN("root service commit task failed", K(server), K(ret));
186}
187LOG_INFO("on_server_status_change finish", KR(ret), K(server));
188return ret;
189}
190
191int ObRootService::ObStatusChangeCallback::on_start_server(const common::ObAddr &server)
192{
193int ret = OB_SUCCESS;
194if (!root_service_.is_inited()) {
195ret = OB_NOT_INIT;
196LOG_WARN("root service not inited", K(ret));
197} else if (!server.is_valid()) {
198ret = OB_INVALID_ARGUMENT;
199LOG_WARN("invalid server", K(ret), K(server));
200} else if (OB_FAIL(root_service_.submit_start_server_task(server))) {
201LOG_WARN("fail to submit start server task", K(ret));
202}
203return ret;
204}
205
206int ObRootService::ObStatusChangeCallback::on_stop_server(const common::ObAddr &server)
207{
208int ret = OB_SUCCESS;
209if (!root_service_.is_inited()) {
210ret = OB_NOT_INIT;
211LOG_WARN("root service not inited", K(ret));
212} else if (!server.is_valid()) {
213ret = OB_INVALID_ARGUMENT;
214LOG_WARN("invalid server", K(ret), K(server));
215} else if (OB_FAIL(root_service_.submit_stop_server_task(server))) {
216LOG_WARN("fail to submit stop server task", K(ret));
217}
218return ret;
219}
220
221int ObRootService::ObStatusChangeCallback::on_offline_server(const common::ObAddr &server)
222{
223int ret = OB_SUCCESS;
224if (!root_service_.is_inited()) {
225ret = OB_NOT_INIT;
226LOG_WARN("root service not inited", K(ret));
227} else if (!server.is_valid()) {
228ret = OB_INVALID_ARGUMENT;
229LOG_WARN("invalid server", K(ret), K(server));
230} else if (OB_FAIL(root_service_.submit_offline_server_task(server))) {
231LOG_WARN("fail to submit stop server task", K(ret));
232}
233return ret;
234}
235
236int ObRootService::ObServerChangeCallback::on_server_change()
237{
238int ret = OB_SUCCESS;
239if (!root_service_.is_inited()) {
240ret = OB_NOT_INIT;
241LOG_WARN("root service not inited", K(ret));
242} else if (OB_FAIL(root_service_.submit_update_all_server_config_task())) {
243LOG_WARN("root service commit task failed", K(ret));
244}
245return ret;
246}
247
248int ObRootService::ObStartStopServerTask::process()
249{
250int ret = OB_SUCCESS;
251bool exist = false;
252if (!server_.is_valid()) {
253ret = OB_INVALID_ARGUMENT;
254LOG_WARN("invalid argument", K(ret), K(server_));
255// still use server manager here, since this func. will be called only in version < 4.2
256} else if (OB_FAIL(root_service_.get_server_mgr().is_server_exist(server_, exist))) {
257LOG_WARN("fail to check server exist", KR(ret), K(server_));
258} else if (!exist) {
259// server does not exist, ignore
260} else {
261obrpc::ObAdminServerArg arg;
262if (OB_FAIL(arg.servers_.push_back(server_))) {
263LOG_WARN("fail to push back", K(ret), K(server_));
264} else if (start_) {
265if (OB_FAIL(root_service_.start_server(arg))) {
266LOG_WARN("fail to start server", K(ret), K(arg));
267}
268} else {
269if (OB_FAIL(root_service_.stop_server(arg))) {
270LOG_WARN("fail to stop server", K(ret), K(arg));
271}
272}
273}
274return ret;
275}
276
277int64_t ObRootService::ObStartStopServerTask::get_deep_copy_size() const
278{
279return sizeof(*this);
280}
281
282ObAsyncTask *ObRootService::ObStartStopServerTask::deep_copy(
283char *buf, const int64_t buf_size) const
284{
285ObAsyncTask *task = NULL;
286int ret = OB_SUCCESS;
287const int64_t need_size = get_deep_copy_size();
288if (NULL == buf) {
289ret = OB_INVALID_ARGUMENT;
290LOG_WARN("buf is null", K(ret));
291} else if (buf_size < need_size) {
292ret = OB_INVALID_ARGUMENT;
293LOG_WARN("buf is not long enough", K(need_size), K(buf_size), K(ret));
294} else {
295task = new (buf) ObStartStopServerTask(root_service_, server_, start_);
296}
297return task;
298}
299
300int ObRootService::ObOfflineServerTask::process()
301{
302int ret = OB_SUCCESS;
303ObRsListArg arg;
304ObLSInfo ls_info;
305const int64_t cluster_id = GCONF.cluster_id;
306const int64_t tenant_id = OB_SYS_TENANT_ID;
307if (!server_.is_valid()) {
308ret = OB_INVALID_ARGUMENT;
309LOG_WARN("invalid argument", KR(ret), K(server_));
310} else if (OB_FAIL(root_service_.get_lst_operator().get(
311cluster_id,
312tenant_id,
313SYS_LS,
314share::ObLSTable::DEFAULT_MODE,
315ls_info))) {
316LOG_WARN("fail to get", KR(ret));
317} else {
318arg.master_rs_ = GCONF.self_addr_;
319FOREACH_CNT_X(replica, ls_info.get_replicas(), OB_SUCCESS == ret) {
320if (replica->get_server() == GCONF.self_addr_
321|| (replica->is_in_service()
322&& ObReplicaTypeCheck::is_paxos_replica_V2(replica->get_replica_type()))) {
323if (OB_FAIL(arg.rs_list_.push_back(replica->get_server()))) {
324LOG_WARN("fail to push back", KR(ret));
325}
326}
327}
328if (OB_FAIL(ret)) {
329} else if (OB_FAIL(root_service_.get_rpc_proxy().to(server_).broadcast_rs_list(arg))) {
330LOG_DEBUG("fail to broadcast rs list", KR(ret));
331} else {
332LOG_INFO("broadcast rs list success", K(arg), K_(server));
333}
334}
335return ret;
336}
337
338int64_t ObRootService::ObOfflineServerTask::get_deep_copy_size() const
339{
340return sizeof(*this);
341}
342
343ObAsyncTask *ObRootService::ObOfflineServerTask::deep_copy(
344char *buf, const int64_t buf_size) const
345{
346ObAsyncTask *task = NULL;
347int ret = OB_SUCCESS;
348const int64_t need_size = get_deep_copy_size();
349if (NULL == buf) {
350ret = OB_INVALID_ARGUMENT;
351LOG_WARN("buf is null", K(ret));
352} else if (buf_size < need_size) {
353ret = OB_INVALID_ARGUMENT;
354LOG_WARN("buf is not long enough", K(need_size), K(buf_size), K(ret));
355} else {
356task = new (buf) ObOfflineServerTask(root_service_, server_);
357}
358return task;
359}
360
361int ObRootService::ObMinorFreezeTask::process()
362{
363int ret = OB_SUCCESS;
364ObAddr rs_addr;
365DEBUG_SYNC(BEFORE_DO_MINOR_FREEZE);
366if (OB_ISNULL(GCTX.rs_rpc_proxy_) || OB_ISNULL(GCTX.rs_mgr_)) {
367ret = OB_ERR_UNEXPECTED;
368LOG_WARN("invalid global context", K(ret));
369} else if (OB_FAIL(GCTX.rs_mgr_->get_master_root_server(rs_addr))) {
370LOG_WARN("get rootservice address failed", K(ret));
371} else if (OB_FAIL(GCTX.rs_rpc_proxy_->to(rs_addr).timeout(GCONF.rpc_timeout)
372.root_minor_freeze(arg_))) {
373LOG_WARN("minor freeze rpc failed", K(ret), K_(arg));
374} else {
375LOG_INFO("minor freeze rpc success", K(ret), K_(arg));
376}
377return ret;
378}
379
380int64_t ObRootService::ObMinorFreezeTask::get_deep_copy_size() const
381{
382return sizeof(*this);
383}
384
385ObAsyncTask *ObRootService::ObMinorFreezeTask::deep_copy(char *buf, const int64_t buf_size) const
386{
387ObAsyncTask *task = NULL;
388int ret = OB_SUCCESS;
389const int64_t need_size = get_deep_copy_size();
390if (NULL == buf) {
391ret = OB_INVALID_ARGUMENT;
392LOG_WARN("buf is null", K(ret));
393} else if (buf_size < need_size) {
394ret = OB_INVALID_ARGUMENT;
395LOG_WARN("buf is not long enough", K(need_size), K(buf_size), K(ret));
396} else {
397task = new(buf) ObMinorFreezeTask(arg_);
398}
399return task;
400}
401
402////////////////////////////////////////////////////////////////
403
404bool ObRsStatus::can_start_service() const
405{
406bool bret = false;
407SpinRLockGuard guard(lock_);
408status::ObRootServiceStatus rs_status = ATOMIC_LOAD(&rs_status_);
409if (status::INIT == rs_status) {
410bret = true;
411}
412return bret;
413}
414
415bool ObRsStatus::is_start() const
416{
417bool bret = false;
418SpinRLockGuard guard(lock_);
419status::ObRootServiceStatus stat = ATOMIC_LOAD(&rs_status_);
420if (status::STARTING == stat || status::IN_SERVICE == stat
421|| status::FULL_SERVICE == stat || status::STARTED == stat) {
422bret = true;
423}
424return bret;
425}
426
427bool ObRsStatus::is_stopping() const
428{
429bool bret = false;
430SpinRLockGuard guard(lock_);
431status::ObRootServiceStatus stat = ATOMIC_LOAD(&rs_status_);
432if (status::STOPPING == stat) {
433bret = true;
434}
435return bret;
436}
437
438bool ObRsStatus::need_do_restart() const
439{
440bool bret = false;
441SpinRLockGuard guard(lock_);
442status::ObRootServiceStatus stat = ATOMIC_LOAD(&rs_status_);
443if (status::IN_SERVICE == stat) {
444bret = true;
445}
446return bret;
447}
448
449bool ObRsStatus::is_full_service() const
450{
451SpinRLockGuard guard(lock_);
452bool bret = false;
453status::ObRootServiceStatus stat = ATOMIC_LOAD(&rs_status_);
454if (status::FULL_SERVICE == stat || status::STARTED == stat) {
455bret = true;
456}
457return bret;
458}
459
460bool ObRsStatus::in_service() const
461{
462bool bret = false;
463SpinRLockGuard guard(lock_);
464status::ObRootServiceStatus stat = ATOMIC_LOAD(&rs_status_);
465if (status::IN_SERVICE == stat
466|| status::FULL_SERVICE == stat
467|| status::STARTED == stat) {
468bret = true;
469}
470return bret;
471}
472
473bool ObRsStatus::is_need_stop() const
474{
475SpinRLockGuard guard(lock_);
476status::ObRootServiceStatus stat = ATOMIC_LOAD(&rs_status_);
477return status::NEED_STOP == stat;
478}
479
480status::ObRootServiceStatus ObRsStatus::get_rs_status() const
481{
482SpinRLockGuard guard(lock_);
483return ATOMIC_LOAD(&rs_status_);
484}
485
486//RS need stop after leader revoke
487int ObRsStatus::revoke_rs()
488{
489int ret = OB_SUCCESS;
490FLOG_INFO("[ROOTSERVICE_NOTICE] try to revoke rs");
491SpinWLockGuard guard(lock_);
492if (status::IN_SERVICE == rs_status_ || status::FULL_SERVICE == rs_status_) {
493rs_status_ = status::NEED_STOP;
494FLOG_INFO("[ROOTSERVICE_NOTICE] rs_status is setted to need_stop", K_(rs_status));
495} else if (status::STOPPING != rs_status_) {
496rs_status_ = status::STOPPING;
497FLOG_INFO("[ROOTSERVICE_NOTICE] rs_status is setted to stopping", K_(rs_status));
498}
499return ret;
500}
501
502int ObRsStatus::try_set_stopping()
503{
504int ret = OB_SUCCESS;
505FLOG_INFO("[ROOTSERVICE_NOTICE] try set rs_status to stopping");
506SpinWLockGuard guard(lock_);
507if (status::NEED_STOP == rs_status_) {
508rs_status_ = status::STOPPING;
509FLOG_INFO("[ROOTSERVICE_NOTICE] rs_status is setted to stopping");
510}
511return ret;
512}
513
514int ObRsStatus::set_rs_status(const status::ObRootServiceStatus status)
515{
516int ret = OB_SUCCESS;
517SpinWLockGuard guard(lock_);
518const char* new_status_str = NULL;
519const char* old_status_str = NULL;
520if (OB_FAIL(get_rs_status_str(status, new_status_str))) {
521FLOG_WARN("fail to get rs status", KR(ret), K(status));
522} else if (OB_FAIL(get_rs_status_str(rs_status_, old_status_str))) {
523FLOG_WARN("fail to get rs status", KR(ret), K(rs_status_));
524} else if (OB_ISNULL(new_status_str) || OB_ISNULL(old_status_str)) {
525ret = OB_ERR_UNEXPECTED;
526FLOG_WARN("error unexpect", KR(ret), K(new_status_str), K(old_status_str));
527}
528if (OB_SUCC(ret)) {
529switch(rs_status_) {
530case status::INIT:
531{
532if (status::STARTING == status
533|| status::STOPPING == status) {
534//rs.stop() will be executed while obs exit
535rs_status_ = status;
536FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
537K(new_status_str), K(old_status_str), K(rs_status_));
538} else {
539ret = OB_OP_NOT_ALLOW;
540FLOG_WARN("can't set rs status", KR(ret));
541}
542break;
543}
544case status::STARTING:
545{
546if (status::IN_SERVICE == status
547|| status::STOPPING == status) {
548rs_status_ = status;
549FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
550K(new_status_str), K(old_status_str), K(rs_status_));
551} else {
552ret = OB_OP_NOT_ALLOW;
553FLOG_WARN("can't set rs status", KR(ret));
554}
555break;
556}
557case status::IN_SERVICE:
558{
559if (status::FULL_SERVICE == status
560|| status::NEED_STOP == status
561|| status::STOPPING == status) {
562rs_status_ = status;
563FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
564K(new_status_str), K(old_status_str), K(rs_status_));
565} else {
566ret = OB_OP_NOT_ALLOW;
567FLOG_WARN("can't set rs status", KR(ret));
568}
569break;
570}
571case status::FULL_SERVICE:
572{
573if (status::STARTED == status
574|| status::NEED_STOP == status
575|| status::STOPPING == status) {
576rs_status_ = status;
577FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
578K(new_status_str), K(old_status_str), K(rs_status_));
579} else {
580ret = OB_OP_NOT_ALLOW;
581FLOG_WARN("can't set rs status", KR(ret));
582}
583break;
584}
585case status::STARTED:
586{
587if (status::STOPPING == status) {
588rs_status_ = status;
589FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
590K(new_status_str), K(old_status_str), K(rs_status_));
591} else {
592ret = OB_OP_NOT_ALLOW;
593FLOG_WARN("can't set rs status", KR(ret));
594}
595break;
596}
597case status::NEED_STOP:
598{
599if (status::STOPPING == status) {
600rs_status_ = status;
601FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
602K(new_status_str), K(old_status_str), K(rs_status_));
603} else {
604ret = OB_OP_NOT_ALLOW;
605FLOG_WARN("can't set rs status", KR(ret));
606}
607break;
608}
609case status::STOPPING:
610{
611if (status::INIT == status
612|| status::STOPPING == status) {
613rs_status_ = status;
614FLOG_INFO("[ROOTSERVICE_NOTICE] success to set rs status",
615K(new_status_str), K(old_status_str), K(rs_status_));
616} else {
617ret = OB_OP_NOT_ALLOW;
618FLOG_WARN("can't set rs status", KR(ret));
619}
620break;
621}
622default:
623ret = OB_ERR_UNEXPECTED;
624FLOG_WARN("invalid rs status", KR(ret), K(rs_status_));
625}
626}
627return ret;
628}
629
630////////////////////////////////////////////////////////////////
631ObRootService::ObRootService()
632: inited_(false), server_refreshed_(false),
633debug_(false),
634self_addr_(), config_(NULL), config_mgr_(NULL),
635rpc_proxy_(), common_proxy_(), sql_proxy_(), restore_ctx_(NULL), rs_mgr_(NULL),
636schema_service_(NULL), status_change_cb_(*this),
637server_change_callback_(*this),
638server_manager_(), hb_checker_(),
639server_checker_(),
640rs_list_change_cb_(*this),
641server_zone_op_service_(),
642root_minor_freeze_(),
643lst_operator_(NULL),
644zone_manager_(), ddl_service_(), unit_manager_(server_manager_, zone_manager_),
645root_balancer_(), empty_server_checker_(), lost_replica_checker_(), thread_checker_(),
646vtable_location_getter_(unit_manager_),
647addr_agent_(NULL), root_inspection_(),
648upgrade_executor_(),
649upgrade_storage_format_executor_(), create_inner_schema_executor_(),
650bootstrap_lock_(), broadcast_rs_list_lock_(ObLatchIds::RS_BROADCAST_LOCK),
651task_queue_(),
652inspect_task_queue_(),
653restart_task_(*this),
654refresh_server_task_(*this),
655check_server_task_(task_queue_, server_checker_),
656self_check_task_(*this),
657load_ddl_task_(*this),
658refresh_io_calibration_task_(*this),
659event_table_clear_task_(ROOTSERVICE_EVENT_INSTANCE,
660SERVER_EVENT_INSTANCE,
661DEALOCK_EVENT_INSTANCE,
662task_queue_),
663inspector_task_(*this),
664purge_recyclebin_task_(*this),
665ddl_scheduler_(),
666snapshot_manager_(),
667core_meta_table_version_(0),
668update_rs_list_timer_task_(*this),
669update_all_server_config_task_(*this),
670baseline_schema_version_(0),
671start_service_time_(0),
672rs_status_(),
673fail_count_(0),
674schema_history_recycler_(),
675#ifdef OB_BUILD_TDE_SECURITY
676master_key_mgr_(),
677#endif
678disaster_recovery_task_executor_(),
679disaster_recovery_task_mgr_(),
680global_ctx_task_(*this)
681{
682}
683
684ObRootService::~ObRootService()
685{
686if (inited_) {
687destroy();
688}
689}
690
691int ObRootService::fake_init(ObServerConfig &config,
692ObConfigManager &config_mgr,
693ObSrvRpcProxy &srv_rpc_proxy,
694ObCommonRpcProxy &common_proxy,
695ObAddr &self,
696ObMySQLProxy &sql_proxy,
697ObRsMgr &rs_mgr,
698ObMultiVersionSchemaService *schema_service,
699ObLSTableOperator &lst_operator)
700{
701int ret = OB_SUCCESS;
702if (inited_) {
703ret = OB_INIT_TWICE;
704LOG_WARN("rootservice already inited", K(ret));
705} else if (!self.is_valid()) {
706ret = OB_INVALID_ARGUMENT;
707LOG_WARN("invalid self address", K(self), K(ret));
708} else if (NULL == schema_service) {
709ret = OB_INVALID_ARGUMENT;
710LOG_WARN("schema_service must not null", KP(schema_service), K(ret));
711} else {
712LOG_INFO("start to init rootservice");
713config_ = &config;
714config_mgr_ = &config_mgr;
715
716rpc_proxy_ = srv_rpc_proxy;
717common_proxy_ = common_proxy;
718
719const bool rpc_active = false;
720common_proxy_.active(rpc_active);
721rpc_proxy_.active(rpc_active);
722
723self_addr_ = self;
724
725sql_proxy_.assign(sql_proxy);
726sql_proxy_.set_inactive();
727oracle_sql_proxy_.set_inactive();
728
729rs_mgr_ = &rs_mgr;
730addr_agent_ = &rs_mgr.get_addr_agent();
731schema_service_ = schema_service;
732lst_operator_ = &lst_operator;
733}
734
735// init server management related
736if (OB_SUCC(ret)) {
737if (OB_FAIL(server_manager_.init(
738status_change_cb_, server_change_callback_, sql_proxy_, unit_manager_, zone_manager_,
739config, self, rpc_proxy_))) {
740LOG_WARN("init server manager failed", K(ret));
741} else if (OB_FAIL(hb_checker_.init(server_manager_))) {
742LOG_WARN("init heartbeat checker failed", K(ret));
743} else if (OB_FAIL(server_checker_.init(server_manager_, self))) {
744LOG_WARN("init server checker failed", K(self), K(ret));
745}
746}
747
748// init ddl service
749if (OB_SUCC(ret)) {
750if (OB_FAIL(ddl_service_.init(rpc_proxy_, common_proxy_, sql_proxy_, *schema_service,
751lst_operator, zone_manager_, unit_manager_,
752snapshot_manager_))) {
753LOG_WARN("ddl_service_ init failed", K(ret));
754}
755}
756
757if (OB_SUCC(ret)) {
758if (OB_FAIL(dbms_job::ObDBMSJobMaster::get_instance()
759.init(&sql_proxy_, schema_service_))) {
760LOG_WARN("failed to init ObDBMSJobMaster", K(ret));
761}
762}
763
764if (OB_SUCC(ret)) {
765if (OB_FAIL(dbms_scheduler::ObDBMSSchedJobMaster::get_instance()
766.init(&unit_manager_, &sql_proxy_, schema_service_))) {
767LOG_WARN("failed to init ObDBMSSchedJobMaster", K(ret));
768}
769}
770
771if (OB_SUCC(ret)) {
772inited_ = true;
773}
774
775LOG_INFO("init rootservice", K(ret));
776return ret;
777}
778int ObRootService::init(ObServerConfig &config,
779ObConfigManager &config_mgr,
780ObSrvRpcProxy &srv_rpc_proxy,
781ObCommonRpcProxy &common_proxy,
782ObAddr &self,
783ObMySQLProxy &sql_proxy,
784observer::ObRestoreCtx &restore_ctx,
785ObRsMgr &rs_mgr,
786ObMultiVersionSchemaService *schema_service,
787ObLSTableOperator &lst_operator)
788{
789int ret = OB_SUCCESS;
790FLOG_INFO("[ROOTSERVICE_NOTICE] begin to init rootservice");
791if (inited_) {
792ret = OB_INIT_TWICE;
793FLOG_WARN("rootservice already inited", KR(ret));
794} else if (!self.is_valid()) {
795ret = OB_INVALID_ARGUMENT;
796FLOG_WARN("invalid self address", K(self), KR(ret));
797} else if (NULL == schema_service) {
798ret = OB_INVALID_ARGUMENT;
799FLOG_WARN("schema_service must not null", KP(schema_service), KR(ret));
800} else {
801config_ = &config;
802config_mgr_ = &config_mgr;
803
804rpc_proxy_ = srv_rpc_proxy;
805common_proxy_ = common_proxy;
806
807const bool rpc_active = false;
808common_proxy_.active(rpc_active);
809rpc_proxy_.active(rpc_active);
810
811self_addr_ = self;
812
813restore_ctx_ = &restore_ctx;
814
815sql_proxy_.assign(sql_proxy);
816sql_proxy_.set_inactive();
817
818if (OB_FAIL(oracle_sql_proxy_.init(sql_proxy.get_pool()))) {
819FLOG_WARN("init oracle sql proxy failed", KR(ret));
820} else {
821oracle_sql_proxy_.set_inactive();
822}
823
824rs_mgr_ = &rs_mgr;
825addr_agent_ = &rs_mgr.get_addr_agent();
826schema_service_ = schema_service;
827lst_operator_ = &lst_operator;
828}
829
830// init inner queue
831if (FAILEDx(task_queue_.init(
832config_->rootservice_async_task_thread_count,
833config_->rootservice_async_task_queue_size,
834"RSAsyncTask"))) {
835FLOG_WARN("init inner queue failed",
836"thread_count", static_cast<int64_t>(config_->rootservice_async_task_thread_count),
837"queue_size", static_cast<int64_t>(config_->rootservice_async_task_queue_size), KR(ret));
838} else if (OB_FAIL(inspect_task_queue_.init(1/*only for the inspection of RS*/,
839config_->rootservice_async_task_queue_size,
840"RSInspectTask"))) {
841FLOG_WARN("init inner queue failed",
842"thread_count", 1,
843"queue_size", static_cast<int64_t>(config_->rootservice_async_task_queue_size), KR(ret));
844} else if (OB_FAIL(zone_manager_.init(sql_proxy_))) {
845// init zone manager
846FLOG_WARN("init zone manager failed", KR(ret));
847} else if (OB_FAIL(server_manager_.init(status_change_cb_, server_change_callback_, sql_proxy_,
848unit_manager_, zone_manager_, config, self, rpc_proxy_))) {
849// init server management related
850FLOG_WARN("init server manager failed", KR(ret));
851} else if (OB_FAIL(server_zone_op_service_.init(
852server_change_callback_,
853rpc_proxy_,
854lst_operator,
855unit_manager_,
856sql_proxy_
857#ifdef OB_BUILD_TDE_SECURITY
858, &master_key_mgr_
859#endif
860))) {
861FLOG_WARN("init server zone op service failed", KR(ret));
862} else if (OB_FAIL(hb_checker_.init(server_manager_))) {
863FLOG_WARN("init heartbeat checker failed", KR(ret));
864} else if (OB_FAIL(server_checker_.init(server_manager_, self))) {
865FLOG_WARN("init server checker failed", KR(ret), K(self));
866} else if (OB_FAIL(root_minor_freeze_.init(rpc_proxy_, unit_manager_))) {
867// init root minor freeze
868FLOG_WARN("init root_minor_freeze_ failed", KR(ret));
869} else if (OB_FAIL(ddl_service_.init(rpc_proxy_, common_proxy_, sql_proxy_, *schema_service,
870lst_operator, zone_manager_, unit_manager_,
871snapshot_manager_))) {
872// init ddl service
873FLOG_WARN("init ddl_service_ failed", KR(ret));
874} else if (OB_FAIL(unit_manager_.init(sql_proxy_, *config_, rpc_proxy_, *schema_service,
875root_balancer_, *this))) {
876// init unit manager
877FLOG_WARN("init unit_manager failed", KR(ret));
878} else if (OB_FAIL(snapshot_manager_.init(self_addr_))) {
879FLOG_WARN("init snapshot manager failed", KR(ret));
880} else if (OB_FAIL(root_inspection_.init(*schema_service_, zone_manager_, sql_proxy_, &common_proxy_))) {
881FLOG_WARN("init root inspection failed", KR(ret));
882} else if (OB_FAIL(upgrade_executor_.init(*schema_service_,
883root_inspection_, sql_proxy_, rpc_proxy_, common_proxy_))) {
884FLOG_WARN("init upgrade_executor failed", KR(ret));
885} else if (OB_FAIL(upgrade_storage_format_executor_.init(*this, ddl_service_))) {
886FLOG_WARN("init upgrade storage format executor failed", KR(ret));
887} else if (OB_FAIL(create_inner_schema_executor_.init(*schema_service_, sql_proxy_, common_proxy_))) {
888FLOG_WARN("init create inner role executor failed", KR(ret));
889} else if (OB_FAIL(thread_checker_.init())) {
890FLOG_WARN("init thread checker failed", KR(ret));
891} else if (OB_FAIL(empty_server_checker_.init(
892server_manager_,
893unit_manager_,
894*lst_operator_,
895*schema_service_,
896server_zone_op_service_))) {
897FLOG_WARN("init empty server checker failed", KR(ret));
898} else if (OB_FAIL(lost_replica_checker_.init(*lst_operator_, *schema_service_))) {
899FLOG_WARN("init empty server checker failed", KR(ret));
900} else if (OB_FAIL(root_balancer_.init(*config_, *schema_service_, unit_manager_,
901server_manager_, zone_manager_, rpc_proxy_,
902self_addr_, sql_proxy, disaster_recovery_task_mgr_))) {
903FLOG_WARN("init root balancer failed", KR(ret));
904} else if (OB_FAIL(ROOTSERVICE_EVENT_INSTANCE.init(sql_proxy, self_addr_))) {
905FLOG_WARN("init rootservice event history failed", KR(ret));
906} else if (OB_FAIL(THE_RS_JOB_TABLE.init(&sql_proxy, self_addr_))) {
907FLOG_WARN("init THE_RS_JOB_TABLE failed", KR(ret));
908} else if (OB_FAIL(ddl_scheduler_.init(this))) {
909FLOG_WARN("init ddl task scheduler failed", KR(ret));
910} else if (OB_FAIL(schema_history_recycler_.init(*schema_service_,
911zone_manager_,
912sql_proxy_))) {
913FLOG_WARN("fail to init schema history recycler failed", KR(ret));
914} else if (OB_FAIL(dbms_job::ObDBMSJobMaster::get_instance().init(&sql_proxy_,
915schema_service_))) {
916FLOG_WARN("init ObDBMSJobMaster failed", KR(ret));
917} else if (OB_FAIL(dbms_scheduler::ObDBMSSchedJobMaster::get_instance().init(&unit_manager_,
918&sql_proxy_,
919schema_service_))) {
920FLOG_WARN("init ObDBMSSchedJobMaster failed", KR(ret));
921#ifdef OB_BUILD_TDE_SECURITY
922} else if (OB_FAIL(master_key_mgr_.init(&zone_manager_, schema_service_))) {
923FLOG_WARN("init master key mgr failed", KR(ret));
924#endif
925} else if (OB_FAIL(disaster_recovery_task_executor_.init(lst_operator,
926rpc_proxy_))) {
927FLOG_WARN("init disaster recovery task executor failed", KR(ret));
928} else if (OB_FAIL(disaster_recovery_task_mgr_.init(self,
929*config_,
930disaster_recovery_task_executor_,
931&rpc_proxy_,
932&sql_proxy_,
933schema_service_))) {
934FLOG_WARN("init disaster recovery task mgr failed", KR(ret));
935}
936if (OB_SUCC(ret)) {
937inited_ = true;
938FLOG_INFO("[ROOTSERVICE_NOTICE] init rootservice success", KR(ret), K_(inited));
939} else {
940LOG_ERROR("[ROOTSERVICE_NOTICE] fail to init root service", KR(ret));
941LOG_DBA_ERROR(OB_ERR_ROOTSERVICE_START, "msg", "rootservice init() has failure", KR(ret));
942}
943
944return ret;
945}
946
947void ObRootService::destroy()
948{
949int ret = OB_SUCCESS;
950int fail_ret = OB_SUCCESS;
951FLOG_INFO("[ROOTSERVICE_NOTICE] start to destroy rootservice");
952if (in_service()) {
953if (OB_FAIL(stop_service())) {
954FLOG_WARN("stop service failed", KR(ret));
955fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
956}
957}
958
959if (OB_FAIL(lost_replica_checker_.destroy())) {
960FLOG_WARN("lost replica checker failed", KR(ret));
961fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
962} else {
963FLOG_INFO("lost replica checker destroy");
964}
965
966// continue executing while error happen
967if (OB_FAIL(root_balancer_.destroy())) {
968FLOG_WARN("root balance destroy failed", KR(ret));
969fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
970} else {
971FLOG_INFO("root balance destroy");
972}
973
974if (OB_FAIL(empty_server_checker_.destroy())) {
975FLOG_WARN("empty server checker destroy failed", KR(ret));
976fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
977} else {
978FLOG_INFO("empty server checker destroy");
979}
980
981if (OB_FAIL(thread_checker_.destroy())) {
982FLOG_WARN("rs_monitor_check : thread checker destroy failed", KR(ret));
983fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
984} else {
985FLOG_INFO("rs_monitor_check : thread checker destroy");
986}
987if (OB_FAIL(schema_history_recycler_.destroy())) {
988FLOG_WARN("schema history recycler destroy failed", KR(ret));
989fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
990} else {
991FLOG_INFO("schema history recycler destroy");
992}
993
994task_queue_.destroy();
995FLOG_INFO("inner queue destroy");
996inspect_task_queue_.destroy();
997FLOG_INFO("inspect queue destroy");
998ddl_builder_.destroy();
999FLOG_INFO("ddl builder destroy");
1000if (OB_FAIL(hb_checker_.destroy())) {
1001FLOG_WARN("heartbeat checker destroy failed", KR(ret));
1002fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1003} else {
1004FLOG_INFO("heartbeat checker destroy");
1005}
1006
1007ROOTSERVICE_EVENT_INSTANCE.destroy();
1008FLOG_INFO("event table operator destroy");
1009
1010dbms_job::ObDBMSJobMaster::get_instance().destroy();
1011FLOG_INFO("ObDBMSJobMaster destroy");
1012
1013ddl_scheduler_.destroy();
1014FLOG_INFO("ddl task scheduler destroy");
1015
1016#ifdef OB_BUILD_TDE_SECURITY
1017if (OB_FAIL(master_key_mgr_.destroy())) {
1018FLOG_WARN("master key mgr destroy failed", KR(ret));
1019fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1020} else {
1021FLOG_INFO("master key mgr destroy");
1022}
1023#endif
1024
1025if (OB_FAIL(disaster_recovery_task_mgr_.destroy())) {
1026FLOG_WARN("disaster recovery task mgr destroy failed", KR(ret));
1027fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1028} else {
1029FLOG_INFO("disaster recovery task mgr destroy");
1030}
1031
1032dbms_scheduler::ObDBMSSchedJobMaster::get_instance().destroy();
1033FLOG_INFO("ObDBMSSchedJobMaster destroy");
1034TG_DESTROY(lib::TGDefIDs::GlobalCtxTimer);
1035FLOG_INFO("global ctx timer destroyed");
1036
1037
1038if (OB_SUCC(ret)) {
1039if (inited_) {
1040inited_ = false;
1041}
1042}
1043
1044FLOG_INFO("[ROOTSERVICE_NOTICE] destroy rootservice end", KR(ret));
1045if (OB_SUCCESS != fail_ret) {
1046LOG_DBA_WARN(OB_ERR_ROOTSERVICE_STOP, "msg", "rootservice destroy() has failure", KR(fail_ret));
1047}
1048}
1049
1050int ObRootService::start_service()
1051{
1052int ret = OB_SUCCESS;
1053start_service_time_ = ObTimeUtility::current_time();
1054ROOTSERVICE_EVENT_ADD("root_service", "start_rootservice", K_(self_addr));
1055FLOG_INFO("[ROOTSERVICE_NOTICE] start to start rootservice", K_(start_service_time));
1056if (!inited_) {
1057ret = OB_NOT_INIT;
1058FLOG_WARN("rootservice not inited", KR(ret));
1059} else if (OB_FAIL(rs_status_.set_rs_status(status::STARTING))) {
1060FLOG_WARN("fail to set rs status", KR(ret));
1061} else if (!ObRootServiceRoleChecker::is_rootserver()) {
1062ret = OB_NOT_MASTER;
1063FLOG_WARN("not master", KR(ret));
1064} else {
1065sql_proxy_.set_active();
1066oracle_sql_proxy_.set_active();
1067const bool rpc_active = true;
1068common_proxy_.active(rpc_active);
1069rpc_proxy_.active(rpc_active);
1070ddl_service_.restart();
1071server_manager_.reset();
1072zone_manager_.reset();
1073OTC_MGR.reset_version_has_refreshed();
1074
1075if (OB_FAIL(hb_checker_.start())) {
1076FLOG_WARN("hb checker start failed", KR(ret));
1077} else if (OB_FAIL(task_queue_.start())) {
1078FLOG_WARN("inner queue start failed", KR(ret));
1079} else if (OB_FAIL(inspect_task_queue_.start())) {
1080FLOG_WARN("inspect queue start failed", KR(ret));
1081} else if (OB_FAIL(ddl_builder_.start())) {
1082FLOG_WARN("start ddl builder failed", KR(ret));
1083} else if (OB_FAIL(TG_START(lib::TGDefIDs::GlobalCtxTimer))) {
1084FLOG_WARN("init global ctx timer fail", KR(ret));
1085} else if (OB_FAIL(global_ctx_task_.schedule(lib::TGDefIDs::GlobalCtxTimer))) {
1086FLOG_WARN("failed to schedule global ctx task", KR(ret));
1087} else if (OB_FAIL(lst_operator_->set_callback_for_rs(rs_list_change_cb_))) {
1088FLOG_WARN("lst_operator set as rs leader failed", KR(ret));
1089} else if (OB_FAIL(rs_status_.set_rs_status(status::IN_SERVICE))) {
1090FLOG_WARN("fail to set rs status", KR(ret));
1091} else if (OB_FAIL(schedule_refresh_server_timer_task(0))) {
1092FLOG_WARN("failed to schedule refresh_server task", KR(ret));
1093} else if (OB_FAIL(schedule_restart_timer_task(0))) {
1094FLOG_WARN("failed to schedule restart task", KR(ret));
1095} else if (OB_FAIL(schema_service_->get_ddl_epoch_mgr().remove_all_ddl_epoch())) {
1096FLOG_WARN("fail to remove ddl epoch", KR(ret));
1097} else if (debug_) {
1098if (OB_FAIL(init_debug_database())) {
1099FLOG_WARN("init_debug_database failed", KR(ret));
1100}
1101}
1102}
1103
1104ROOTSERVICE_EVENT_ADD("root_service", "finish_start_rootservice",
1105"result", ret, K_(self_addr));
1106
1107if (OB_FAIL(ret)) {
1108// increase fail count for self checker and print log.
1109update_fail_count(ret);
1110FLOG_WARN("start service failed, do stop service", KR(ret));
1111int tmp_ret = OB_SUCCESS;
1112if (OB_SUCCESS != (tmp_ret = rs_status_.set_rs_status(status::STOPPING))) {
1113FLOG_WARN("fail to set status", KR(tmp_ret));
1114} else if (OB_SUCCESS != (tmp_ret = stop_service())) {
1115FLOG_WARN("stop service failed", KR(tmp_ret));
1116}
1117}
1118
1119FLOG_INFO("[ROOTSERVICE_NOTICE] rootservice start_service finished", KR(ret));
1120return ret;
1121}
1122
1123int ObRootService::stop_service()
1124{
1125int ret = OB_SUCCESS;
1126FLOG_INFO("[ROOTSERVICE_NOTICE] stop service begin");
1127if (OB_FAIL(stop())) {
1128FLOG_WARN("fail to stop thread", KR(ret));
1129} else {
1130wait();
1131}
1132if (FAILEDx(rs_status_.set_rs_status(status::INIT))) {
1133FLOG_WARN("fail to set rs status", KR(ret));
1134}
1135FLOG_INFO("[ROOTSERVICE_NOTICE] stop service finished", KR(ret));
1136return ret;
1137}
1138
1139int ObRootService::stop()
1140{
1141int ret = OB_SUCCESS;
1142int fail_ret = OB_SUCCESS;
1143start_service_time_ = 0;
1144int64_t start_time = ObTimeUtility::current_time();
1145ROOTSERVICE_EVENT_ADD("root_service", "stop_rootservice", K_(self_addr));
1146FLOG_INFO("[ROOTSERVICE_NOTICE] start to stop rootservice", K(start_time));
1147if (!inited_) {
1148ret = OB_NOT_INIT;
1149FLOG_WARN("rootservice not inited", KR(ret));
1150fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1151} else if (OB_FAIL(rs_status_.set_rs_status(status::STOPPING))) {
1152FLOG_WARN("fail to set rs status", KR(ret));
1153fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1154} else {
1155// set to rpc ls table as soon as possible
1156if (OB_FAIL(lst_operator_->set_callback_for_obs(
1157common_proxy_,
1158rpc_proxy_,
1159*rs_mgr_,
1160sql_proxy_))) {
1161FLOG_WARN("set as rs follower failed", KR(ret));
1162fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1163} else {
1164FLOG_INFO("set old rs to follower finished");
1165}
1166//full_service_ = false;
1167server_refreshed_ = false;
1168//in_service_ = false;
1169sql_proxy_.set_inactive();
1170FLOG_INFO("sql_proxy set inactive finished");
1171oracle_sql_proxy_.set_inactive();
1172FLOG_INFO("oracle_sql_proxy set inactive finished");
1173const bool rpc_active = false;
1174common_proxy_.active(rpc_active);
1175FLOG_INFO("commom_proxy set inactive finished");
1176rpc_proxy_.active(rpc_active);
1177FLOG_INFO("rpc_proxy set inactive finished");
1178
1179int tmp_ret = OB_SUCCESS;
1180if (OB_SUCCESS != (tmp_ret = upgrade_executor_.stop())) {
1181FLOG_WARN("upgrade_executor stop failed", KR(tmp_ret));
1182fail_ret = OB_SUCCESS == fail_ret ? tmp_ret : fail_ret;
1183} else {
1184FLOG_INFO("upgrade_executor stop finished");
1185}
1186if (OB_SUCCESS != (tmp_ret = upgrade_storage_format_executor_.stop())) {
1187FLOG_WARN("fail to stop upgrade storage format executor", KR(tmp_ret));
1188fail_ret = OB_SUCCESS == fail_ret ? tmp_ret : fail_ret;
1189} else {
1190FLOG_INFO("upgrade_storage_format_executor stop finished");
1191}
1192
1193if (OB_SUCCESS != (tmp_ret = create_inner_schema_executor_.stop())) {
1194FLOG_WARN("fail to stop create inner schema executor", KR(tmp_ret));
1195fail_ret = OB_SUCCESS == fail_ret ? tmp_ret : fail_ret;
1196} else {
1197FLOG_INFO("create_inner_schema_executor stop finished");
1198}
1199
1200if (OB_SUCC(ret)) {
1201if (OB_FAIL(stop_timer_tasks())) {
1202FLOG_WARN("stop timer tasks failed", KR(ret));
1203fail_ret = OB_SUCCESS == fail_ret ? ret : fail_ret;
1204} else {
1205FLOG_INFO("stop timer tasks success");
1206}
1207}
1208
1209if (OB_SUCC(ret)) {
1210// ddl_service may be trying refresh schema, stop it
1211ddl_service_.stop();
1212FLOG_INFO("ddl service stop");
1213root_minor_freeze_.stop();
1214FLOG_INFO("minor freeze stop");
1215root_inspection_.stop();
1216FLOG_INFO("root inspection stop");
1217}
1218if (OB_SUCC(ret)) {
1219ddl_builder_.stop();
1220FLOG_INFO("ddl builder stop");
1221task_queue_.stop();
1222FLOG_INFO("task_queue stop");
1223inspect_task_queue_.stop();
1224FLOG_INFO("inspect queue stop");
1225root_balancer_.stop();
1226FLOG_INFO("root_balancer stop");
1227empty_server_checker_.stop();
1228FLOG_INFO("empty_server_checker stop");
1229lost_replica_checker_.stop();
1230FLOG_INFO("lost_replica_checker stop");
1231thread_checker_.stop();
1232FLOG_INFO("rs_monitor_check : thread_checker stop");
1233schema_history_recycler_.stop();
1234FLOG_INFO("schema_history_recycler stop");
1235hb_checker_.stop();
1236FLOG_INFO("hb_checker stop");
1237ddl_scheduler_.stop();
1238FLOG_INFO("ddl task scheduler stop");
1239dbms_job::ObDBMSJobMaster::get_instance().stop();
1240FLOG_INFO("dbms job master stop");
1241#ifdef OB_BUILD_TDE_SECURITY
1242master_key_mgr_.stop();
1243FLOG_INFO("master key mgr stop");
1244#endif
1245disaster_recovery_task_mgr_.stop();
1246FLOG_INFO("disaster_recovery_task_mgr stop");
1247dbms_scheduler::ObDBMSSchedJobMaster::get_instance().stop();
1248FLOG_INFO("dbms sched job master stop");
1249TG_STOP(lib::TGDefIDs::GlobalCtxTimer);
1250FLOG_INFO("global ctx timer stop");
1251}
1252}
1253
1254ROOTSERVICE_EVENT_ADD("root_service", "finish_stop_thread", KR(ret), K_(self_addr));
1255FLOG_INFO("[ROOTSERVICE_NOTICE] finish stop rootservice", KR(ret));
1256if (OB_SUCCESS != fail_ret) {
1257LOG_DBA_WARN(OB_ERR_ROOTSERVICE_STOP, "msg", "rootservice stop() has failure", KR(fail_ret));
1258}
1259return ret;
1260}
1261
1262void ObRootService::wait()
1263{
1264FLOG_INFO("[ROOTSERVICE_NOTICE] wait rootservice begin");
1265int64_t start_time = ObTimeUtility::current_time();
1266FLOG_INFO("start to wait all thread exit");
1267root_balancer_.wait();
1268FLOG_INFO("root balancer exit success");
1269empty_server_checker_.wait();
1270FLOG_INFO("empty server checker exit success");
1271lost_replica_checker_.wait();
1272FLOG_INFO("lost replica checker exit success");
1273thread_checker_.wait();
1274FLOG_INFO("rs_monitor_check : thread checker exit success");
1275schema_history_recycler_.wait();
1276FLOG_INFO("schema_history_recycler exit success");
1277hb_checker_.wait();
1278FLOG_INFO("hb checker exit success");
1279task_queue_.wait();
1280FLOG_INFO("task queue exit success");
1281inspect_task_queue_.wait();
1282FLOG_INFO("inspect queue exit success");
1283ddl_scheduler_.wait();
1284FLOG_INFO("ddl task scheduler exit success");
1285#ifdef OB_BUILD_TDE_SECURITY
1286master_key_mgr_.wait();
1287FLOG_INFO("master key mgr exit success");
1288#endif
1289disaster_recovery_task_mgr_.wait();
1290FLOG_INFO("rebalance task mgr exit success");
1291TG_WAIT(lib::TGDefIDs::GlobalCtxTimer);
1292FLOG_INFO("global ctx timer exit success");
1293ddl_service_.get_index_name_checker().reset_all_cache();
1294FLOG_INFO("reset index name checker success");
1295ddl_service_.get_non_partitioned_tablet_allocator().reset_all_cache();
1296FLOG_INFO("reset non partitioned tablet allocator success");
1297ObUpdateRsListTask::clear_lock();
1298THE_RS_JOB_TABLE.reset_max_job_id();
1299int64_t cost = ObTimeUtility::current_time() - start_time;
1300ROOTSERVICE_EVENT_ADD("root_service", "finish_wait_stop", K(cost));
1301FLOG_INFO("[ROOTSERVICE_NOTICE] rootservice wait finished", K(start_time), K(cost));
1302if (cost > 10 * 60 * 1000 * 1000L) { // 10min
1303int ret = OB_ERROR;
1304LOG_ERROR("cost too much time to wait rs stop", KR(ret), K(start_time), K(cost));
1305}
1306}
1307
1308int ObRootService::reload_config()
1309{
1310int ret = OB_SUCCESS;
1311if (!inited_) {
1312ret = OB_NOT_INIT;
1313LOG_WARN("not init", K(ret));
1314} else {
1315if (OB_FAIL(addr_agent_->reload())) {
1316LOG_WARN("root address agent reload failed", K(ret));
1317}
1318}
1319return ret;
1320}
1321
1322int ObRootService::submit_update_all_server_config_task()
1323{
1324int ret = OB_SUCCESS;
1325ObUpdateAllServerConfigTask task(*this);
1326if (!inited_) {
1327ret = OB_NOT_INIT;
1328LOG_WARN("not init", K(ret));
1329} else if (OB_FAIL(task_queue_.add_async_task(task))) {
1330LOG_WARN("fail to add async task", K(ret));
1331} else {
1332LOG_INFO("ass async task for update all server config");
1333}
1334return ret;
1335}
1336
1337int ObRootService::submit_ddl_single_replica_build_task(ObAsyncTask &task)
1338{
1339int ret = OB_SUCCESS;
1340if (OB_UNLIKELY(!inited_)) {
1341ret = OB_NOT_INIT;
1342LOG_WARN("ObRootService has not been inited", K(ret));
1343} else if (OB_FAIL(ddl_builder_.push_task(task))) {
1344LOG_WARN("add task to ddl builder failed", K(ret));
1345}
1346return ret;
1347}
1348
1349int ObRootService::submit_update_all_server_task(const ObAddr &server)
1350{
1351int ret = OB_SUCCESS;
1352if (!inited_) {
1353ret = OB_NOT_INIT;
1354LOG_WARN("not init", K(ret));
1355} else if (!server.is_valid()) {
1356ret = OB_INVALID_ARGUMENT;
1357LOG_WARN("invalid server", K(server), K(ret));
1358} else {
1359const bool with_rootserver = (server == self_addr_);
1360if (!ObHeartbeatService::is_service_enabled()) {
1361ObAllServerTask task(server_manager_, disaster_recovery_task_mgr_, server, with_rootserver);
1362if (OB_FAIL(task_queue_.add_async_task(task))) {
1363LOG_WARN("inner queue push task failed", K(ret));
1364}
1365}
1366}
1367
1368// FIXME: @wanhong.wwh: If self is RS and self status change, submit_update_rslist_task
1369if (OB_SUCC(ret)) {
1370if (!in_service()) {
1371LOG_INFO("self is not RS, need not submit update rslist task in update_all_server_task",
1372K(server));
1373} else {
1374LOG_INFO("self is RS and self status change, submit update rslist task", K(server));
1375if (OB_FAIL(submit_update_rslist_task())) {
1376LOG_WARN("submit update rslist task failed", KR(ret));
1377}
1378}
1379}
1380return ret;
1381}
1382
1383int ObRootService::submit_start_server_task(const common::ObAddr &server)
1384{
1385int ret = OB_SUCCESS;
1386if (!inited_) {
1387ret = OB_NOT_INIT;
1388LOG_WARN("not init", K(ret));
1389} else if (!server.is_valid()) {
1390ret = OB_INVALID_ARGUMENT;
1391LOG_WARN("invalid server", K(ret), K(server));
1392} else {
1393const bool start = true;
1394ObStartStopServerTask task(*this, server, start);
1395if (OB_FAIL(task_queue_.add_async_task(task))) {
1396LOG_WARN("inner queue push task failed", K(ret));
1397}
1398}
1399return ret;
1400}
1401
1402int ObRootService::submit_stop_server_task(const common::ObAddr &server)
1403{
1404int ret = OB_SUCCESS;
1405if (!inited_) {
1406ret = OB_NOT_INIT;
1407LOG_WARN("not init", K(ret));
1408} else if (!server.is_valid()) {
1409ret = OB_INVALID_ARGUMENT;
1410LOG_WARN("invalid server", K(ret), K(server));
1411} else {
1412const bool start = false;
1413ObStartStopServerTask task(*this, server, start);
1414if (OB_FAIL(task_queue_.add_async_task(task))) {
1415LOG_WARN("inner queue push task failed", K(ret));
1416}
1417}
1418return ret;
1419}
1420
1421int ObRootService::submit_offline_server_task(const common::ObAddr &server)
1422{
1423int ret = OB_SUCCESS;
1424if (!inited_) {
1425ret = OB_NOT_INIT;
1426LOG_WARN("not init", K(ret));
1427} else if (!server.is_valid()) {
1428ret = OB_INVALID_ARGUMENT;
1429LOG_WARN("invalid server", K(ret), K(server));
1430} else {
1431ObOfflineServerTask task(*this, server);
1432if (OB_FAIL(task_queue_.add_async_task(task))) {
1433LOG_WARN("inner queue push task failed", K(ret));
1434}
1435}
1436return ret;
1437}
1438
1439int ObRootService::submit_upgrade_task(
1440const obrpc::ObUpgradeJobArg &arg)
1441{
1442int ret = OB_SUCCESS;
1443ObUpgradeTask task(upgrade_executor_);
1444task.set_retry_times(0); //not repeat
1445if (!inited_) {
1446ret = OB_NOT_INIT;
1447LOG_WARN("not init", KR(ret));
1448} else if (OB_FAIL(task.init(arg))) {
1449LOG_WARN("task init failed", KR(ret), K(arg));
1450} else if (OB_FAIL(upgrade_executor_.can_execute())) {
1451LOG_WARN("can't run task now", KR(ret), K(arg));
1452} else if (OB_FAIL(task_queue_.add_async_task(task))) {
1453LOG_WARN("submit upgrade task fail", KR(ret), K(arg));
1454} else {
1455LOG_INFO("submit upgrade task success", KR(ret), K(arg));
1456}
1457return ret;
1458}
1459
1460int ObRootService::submit_upgrade_storage_format_version_task()
1461{
1462int ret = OB_SUCCESS;
1463ObUpgradeStorageFormatVersionTask task(upgrade_storage_format_executor_);
1464task.set_retry_times(0);
1465if (OB_UNLIKELY(!inited_)) {
1466ret = OB_NOT_INIT;
1467LOG_WARN("ObRootService has not been inited", K(ret));
1468} else if (OB_FAIL(upgrade_storage_format_executor_.can_execute())) {
1469LOG_WARN("cannot run task now", K(ret));
1470} else if (OB_FAIL(task_queue_.add_async_task(task))) {
1471LOG_WARN("submit upgrade storage format version", K(ret));
1472} else {
1473LOG_INFO("submit upgrade storage format version success", K(ret), K(common::lbt()));
1474}
1475return ret;
1476}
1477
1478int ObRootService::submit_create_inner_schema_task()
1479{
1480int ret = OB_SUCCESS;
1481ObCreateInnerSchemaTask task(create_inner_schema_executor_);
1482task.set_retry_times(0);
1483if (OB_UNLIKELY(!inited_)) {
1484ret = OB_NOT_INIT;
1485LOG_WARN("ObRootService has not been inited", K(ret));
1486} else if (OB_FAIL(create_inner_schema_executor_.can_execute())) {
1487LOG_WARN("cannot run task now", K(ret));
1488} else if (OB_FAIL(task_queue_.add_async_task(task))) {
1489LOG_WARN("submit create inner role task", K(ret));
1490} else {
1491LOG_INFO("submit create inner role task success", K(ret), K(common::lbt()));
1492}
1493return ret;
1494}
1495
1496int ObRootService::schedule_check_server_timer_task()
1497{
1498int ret = OB_SUCCESS;
1499if (!inited_) {
1500ret = OB_NOT_INIT;
1501LOG_WARN("not init", K(ret));
1502} else if (!ObHeartbeatService::is_service_enabled()) {
1503if (OB_FAIL(task_queue_.add_timer_task(check_server_task_, config_->server_check_interval, true))) {
1504LOG_WARN("failed to add check_server task", K(ret));
1505}
1506} else {
1507LOG_TRACE("no need to schedule ObCheckServerTask in version >= 4.2");
1508}
1509return ret;
1510}
1511
1512int ObRootService::schedule_recyclebin_task(int64_t delay)
1513{
1514int ret = OB_SUCCESS;
1515const bool did_repeat = false;
1516
1517if (OB_FAIL(get_inspect_task_queue().add_timer_task(
1518purge_recyclebin_task_, delay, did_repeat))) {
1519if (OB_CANCELED != ret) {
1520LOG_ERROR("schedule purge recyclebin task failed", KR(ret), K(delay), K(did_repeat));
1521} else {
1522LOG_WARN("schedule purge recyclebin task failed", KR(ret), K(delay), K(did_repeat));
1523}
1524}
1525
1526return ret;
1527}
1528
1529int ObRootService::schedule_inspector_task()
1530{
1531int ret = OB_SUCCESS;
1532int64_t inspect_interval = ObInspector::INSPECT_INTERVAL;
1533int64_t delay = 1 * 60 * 1000 * 1000;
1534int64_t purge_interval = GCONF._recyclebin_object_purge_frequency;
1535int64_t expire_time = GCONF.recyclebin_object_expire_time;
1536if (purge_interval > 0 && expire_time > 0) {
1537delay = purge_interval;
1538}
1539if (!inited_) {
1540ret = OB_NOT_INIT;
1541LOG_WARN("not init", KR(ret));
1542} else if (!inspect_task_queue_.exist_timer_task(inspector_task_)
1543&& OB_FAIL(inspect_task_queue_.add_timer_task(inspector_task_, inspect_interval, true))) {
1544LOG_WARN("failed to add inspect task", KR(ret));
1545} else if (!inspect_task_queue_.exist_timer_task(purge_recyclebin_task_)
1546&& OB_FAIL(inspect_task_queue_.add_timer_task(purge_recyclebin_task_,
1547delay, false))) {
1548LOG_WARN("failed to add purge recyclebin task", KR(ret));
1549} else {
1550LOG_INFO("schedule inspector task", K(inspect_interval), K(purge_interval));
1551}
1552return ret;
1553}
1554
1555int ObRootService::schedule_self_check_task()
1556{
1557int ret = OB_SUCCESS;
1558const bool did_repeat = false;
1559const int64_t delay = 5L * 1000L * 1000L; //5s
1560if (!inited_) {
1561ret = OB_NOT_INIT;
1562LOG_WARN("not init", K(ret));
1563} else if (task_queue_.exist_timer_task(self_check_task_)) {
1564// ignore error
1565LOG_WARN("already have one self_check_task, ignore this");
1566} else if (OB_FAIL(task_queue_.add_timer_task(self_check_task_, delay, did_repeat))) {
1567LOG_WARN("fail to add timer task", K(ret));
1568} else {
1569LOG_INFO("add self_check task success");
1570}
1571return ret;
1572}
1573
1574int ObRootService::schedule_update_rs_list_task()
1575{
1576int ret = OB_SUCCESS;
1577const bool did_repeat = true;
1578if (!inited_) {
1579ret = OB_NOT_INIT;
1580LOG_WARN("not init", K(ret));
1581} else if (task_queue_.exist_timer_task(update_rs_list_timer_task_)) {
1582// ignore error
1583LOG_WARN("already have one update rs list timer task , ignore this");
1584} else if (OB_FAIL(task_queue_.add_timer_task(update_rs_list_timer_task_,
1585ObUpdateRsListTimerTask::RETRY_INTERVAL,
1586did_repeat))) {
1587LOG_WARN("fail to add timer task", K(ret));
1588} else {
1589LOG_INFO("add update rs list task success");
1590}
1591return ret;
1592}
1593ERRSIM_POINT_DEF(ALL_SERVER_SCHEDULE_ERROR);
1594int ObRootService::schedule_update_all_server_config_task()
1595{
1596int ret = OB_SUCCESS;
1597const bool did_repeat = true;
1598if (OB_UNLIKELY(!inited_)) {
1599ret = OB_NOT_INIT;
1600LOG_WARN("not init", KR(ret), K(inited_));
1601} else if (task_queue_.exist_timer_task(update_all_server_config_task_)) {
1602// ignore error
1603LOG_WARN("already have one update_all_server_config task , ignore this");
1604} else if (OB_FAIL(task_queue_.add_timer_task(
1605update_all_server_config_task_,
1606ALL_SERVER_SCHEDULE_ERROR ? (ObUpdateAllServerConfigTask::RETRY_INTERVAL / 2) : ObUpdateAllServerConfigTask::RETRY_INTERVAL,
1607did_repeat))) {
1608LOG_WARN("fail to add timer task", KR(ret));
1609} else {
1610LOG_INFO("add update server config task success");
1611}
1612return ret;
1613}
1614
1615int ObRootService::schedule_load_ddl_task()
1616{
1617int ret = OB_SUCCESS;
1618const bool did_repeat = false;
1619#ifdef ERRSIM
1620const int64_t delay = 1000L * 1000L; //1s
1621#else
1622const int64_t delay = 5L * 1000L * 1000L; //5s
1623#endif
1624if (OB_UNLIKELY(!inited_)) {
1625ret = OB_NOT_INIT;
1626LOG_WARN("not init", K(ret));
1627} else if (task_queue_.exist_timer_task(load_ddl_task_)) {
1628// ignore error
1629LOG_WARN("load ddl task already exist", K(ret));
1630} else if (OB_FAIL(task_queue_.add_timer_task(load_ddl_task_, delay, did_repeat))) {
1631LOG_WARN("fail to add timer task", K(ret));
1632} else {
1633LOG_INFO("succeed to add load ddl task");
1634}
1635return ret;
1636}
1637
1638int ObRootService::schedule_refresh_io_calibration_task()
1639{
1640int ret = OB_SUCCESS;
1641const bool did_repeat = false;
1642const int64_t delay = 5L * 1000L * 1000L; //5s
1643if (OB_UNLIKELY(!inited_)) {
1644ret = OB_NOT_INIT;
1645LOG_WARN("not init", K(ret));
1646} else if (task_queue_.exist_timer_task(refresh_io_calibration_task_)) {
1647// ignore error
1648LOG_WARN("refresh io calibration task already exist", K(ret));
1649} else if (OB_FAIL(task_queue_.add_timer_task(refresh_io_calibration_task_, delay, did_repeat))) {
1650LOG_WARN("fail to add timer task", K(ret));
1651} else {
1652LOG_INFO("succeed to add refresh io calibration task");
1653}
1654return ret;
1655}
1656
1657int ObRootService::submit_update_rslist_task(const bool force_update)
1658{
1659int ret = OB_SUCCESS;
1660if (OB_UNLIKELY(!inited_)) {
1661ret = OB_NOT_INIT;
1662LOG_WARN("not init", KR(ret));
1663} else {
1664if (ObUpdateRsListTask::try_lock()) {
1665bool task_added = false;
1666ObUpdateRsListTask task;
1667if (OB_FAIL(task.init(*lst_operator_, addr_agent_, zone_manager_,
1668broadcast_rs_list_lock_,
1669force_update, self_addr_))) {
1670LOG_WARN("task init failed", KR(ret));
1671} else if (OB_FAIL(task_queue_.add_async_task(task))) {
1672LOG_WARN("inner queue push task failed", K(ret));
1673} else {
1674task_added = true;
1675LOG_INFO("added async task to update rslist", K(force_update));
1676}
1677if (!task_added) {
1678ObUpdateRsListTask::unlock();
1679}
1680} else {
1681LOG_WARN("fail to submit update rslist task, need retry", K(force_update));
1682}
1683}
1684return ret;
1685}
1686
1687int ObRootService::submit_report_core_table_replica_task()
1688{
1689int ret = OB_SUCCESS;
1690if (OB_UNLIKELY(!inited_)) {
1691ret = OB_NOT_INIT;
1692LOG_WARN("not init", K(ret));
1693} else {
1694ObReportCoreTableReplicaTask task(*this);
1695if (OB_FAIL(task_queue_.add_async_task(task))) {
1696LOG_WARN("inner queue push task failed", K(ret));
1697} else {} // no more to do
1698}
1699return ret;
1700}
1701
1702int ObRootService::submit_reload_unit_manager_task()
1703{
1704int ret = OB_SUCCESS;
1705if (OB_UNLIKELY(!inited_)) {
1706ret = OB_NOT_INIT;
1707LOG_WARN("not init", K(ret));
1708} else {
1709ObReloadUnitManagerTask task(*this, unit_manager_);
1710if (OB_FAIL(task_queue_.add_async_task(task))) {
1711LOG_WARN("inner queue push reload_unit task failed", K(ret));
1712} else {
1713LOG_INFO("submit reload unit task success", K(ret));
1714}
1715}
1716return ret;
1717}
1718
1719int ObRootService::schedule_restart_timer_task(const int64_t delay)
1720{
1721int ret = OB_SUCCESS;
1722if (!inited_) {
1723ret = OB_NOT_INIT;
1724LOG_WARN("not init", K(ret));
1725} else {
1726const bool did_repeat = false;
1727if (OB_FAIL(task_queue_.add_timer_task(restart_task_,
1728delay, did_repeat))) {
1729LOG_WARN("schedule restart task failed", K(ret), K(delay), K(did_repeat));
1730} else {
1731LOG_INFO("submit restart task success", K(delay));
1732}
1733}
1734return ret;
1735}
1736
1737int ObRootService::schedule_refresh_server_timer_task(const int64_t delay)
1738{
1739int ret = OB_SUCCESS;
1740if (!inited_) {
1741ret = OB_NOT_INIT;
1742LOG_WARN("not init", K(ret));
1743} else {
1744const bool did_repeat = false;
1745if (OB_FAIL(task_queue_.add_timer_task(refresh_server_task_,
1746delay, did_repeat))) {
1747LOG_WARN("schedule restart task failed", K(ret), K(delay), K(did_repeat));
1748} else {
1749LOG_INFO("schedule refresh server timer task", K(delay));
1750}
1751}
1752return ret;
1753}
1754
1755int ObRootService::update_rslist()
1756{
1757int ret = OB_SUCCESS;
1758ObUpdateRsListTask task;
1759ObTimeoutCtx ctx;
1760ctx.set_timeout(config_->rpc_timeout);
1761const bool force_update = true;
1762if (OB_FAIL(task.init(*lst_operator_, addr_agent_,
1763zone_manager_, broadcast_rs_list_lock_, force_update, self_addr_))) {
1764LOG_WARN("task init failed", K(ret), K(force_update));
1765} else if (OB_FAIL(task.process_without_lock())) {
1766LOG_WARN("failed to update rslist", K(ret));
1767} else {
1768LOG_INFO("broadcast root address succeed");
1769}
1770return ret;
1771}
1772
1773//only used in bootstrap
1774int ObRootService::update_all_server_and_rslist()
1775{
1776int ret = OB_SUCCESS;
1777if (!inited_) {
1778ret = OB_NOT_INIT;
1779LOG_WARN("not init", K(ret));
1780} else {
1781SpinWLockGuard rs_list_guard(broadcast_rs_list_lock_);
1782ret = update_rslist();
1783if (OB_FAIL(ret)) {
1784LOG_INFO("fail to update rslist, ignore it", KR(ret));
1785ret = OB_SUCCESS;
1786}
1787}
1788
1789if (OB_SUCC(ret)) {
1790ObArray<ObAddr> servers;
1791ObZone empty_zone; // empty zone for all servers
1792if (OB_FAIL(SVR_TRACER.get_servers_of_zone(empty_zone, servers))) {
1793LOG_WARN("get server list failed", K(ret));
1794} else {
1795FOREACH_X(s, servers, OB_SUCC(ret)) {
1796const bool with_rootserver = (*s == self_addr_);
1797ObAllServerTask task(server_manager_, disaster_recovery_task_mgr_, *s, with_rootserver);
1798if (OB_FAIL(task.process())) {
1799LOG_WARN("sync server status to __all_server table failed",
1800K(ret), "server", *s);
1801}
1802}
1803}
1804}
1805return ret;
1806}
1807
1808int ObRootService::request_heartbeats()
1809{
1810int ret = OB_SUCCESS;
1811ObServerManager::ObServerStatusArray statuses;
1812ObZone zone; // empty zone means all zone
1813if (!inited_) {
1814ret = OB_NOT_INIT;
1815LOG_WARN("not init", K(ret));
1816} else if (OB_FAIL(server_manager_.get_server_statuses(zone, statuses))) {
1817LOG_WARN("get_server_statuses failed", K(zone), K(ret));
1818} else {
1819const int64_t rpc_timeout = 250 * 1000; // 250ms
1820ObLeaseRequest lease_request;
1821// should continue even some failed, so don't look at condition OB_SUCCESS == ret
1822FOREACH_CNT(status, statuses) {
1823if (ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED == status->hb_status_
1824|| (ObServerStatus::OB_SERVER_ADMIN_DELETING == status->admin_status_
1825&& !status->is_alive())) {
1826uint64_t server_id = OB_INVALID_ID;
1827lease_request.reset();
1828int temp_ret = OB_SUCCESS;
1829bool to_alive = false;
1830if (OB_SUCCESS != (temp_ret = rpc_proxy_.to(status->server_).timeout(rpc_timeout)
1831.request_heartbeat(lease_request))) {
1832LOG_WARN("request_heartbeat failed", "server", status->server_,
1833K(rpc_timeout), K(temp_ret));
1834} else if (OB_SUCCESS != (temp_ret = server_manager_.receive_hb(
1835lease_request, server_id, to_alive))) {
1836LOG_WARN("receive hb failed", K(lease_request), K(temp_ret));
1837}
1838ret = (OB_SUCCESS != ret) ? ret : temp_ret;
1839}
1840}
1841}
1842return ret;
1843}
1844
1845int ObRootService::self_check()
1846{
1847int ret = OB_SUCCESS;
1848if (!inited_) {
1849ret = OB_NOT_INIT;
1850LOG_WARN("not init", K(ret));
1851} else if (!in_service()) {
1852// nothing todo
1853} else if (GCONF.in_upgrade_mode()) {
1854// nothing todo
1855} else if (OB_FAIL(root_inspection_.check_all())) { //ignore failed
1856LOG_WARN("root_inspection check_all failed", K(ret));
1857if (OB_FAIL(schedule_self_check_task())) {
1858if (OB_CANCELED != ret) {
1859LOG_ERROR("fail to schedule self check task", K(ret));
1860}
1861}
1862}
1863return ret;
1864}
1865
1866int ObRootService::after_restart()
1867{
1868ObCurTraceId::init(GCONF.self_addr_);
1869
1870// avoid concurrent with bootstrap
1871FLOG_INFO("[ROOTSERVICE_NOTICE] try to get lock for bootstrap in after_restart");
1872ObLatchRGuard guard(bootstrap_lock_, ObLatchIds::RS_BOOTSTRAP_LOCK);
1873
1874// NOTE: Following log print after lock
1875FLOG_INFO("[ROOTSERVICE_NOTICE] start to do restart task");
1876
1877int ret = OB_SUCCESS;
1878if (!inited_) {
1879ret = OB_NOT_INIT;
1880FLOG_WARN("rootservice not init", KR(ret));
1881} else if (!ObRootServiceRoleChecker::is_rootserver()) {
1882ret = OB_NOT_MASTER;
1883FLOG_WARN("not master", KR(ret));
1884} else if (need_do_restart() && OB_FAIL(do_restart())) {
1885FLOG_WARN("do restart failed, retry again", KR(ret));
1886} else if (OB_FAIL(do_after_full_service())) {
1887FLOG_WARN("fail to do after full service", KR(ret));
1888}
1889
1890int64_t cost = ObTimeUtility::current_time() - start_service_time_;
1891if (OB_FAIL(ret)) {
1892FLOG_WARN("do restart task failed, retry again", KR(ret), K(cost));
1893} else if (OB_FAIL(rs_status_.set_rs_status(status::STARTED))) {
1894FLOG_WARN("fail to set rs status", KR(ret));
1895} else {
1896FLOG_INFO("do restart task success, finish restart", KR(ret), K(cost), K_(start_service_time));
1897}
1898
1899if (OB_FAIL(ret)) {
1900rs_status_.try_set_stopping();
1901if (rs_status_.is_stopping()) {
1902// need stop
1903FLOG_INFO("rs_status_ is set to stopping");
1904} else {
1905const int64_t RETRY_TIMES = 3;
1906int64_t tmp_ret = OB_SUCCESS;
1907for (int64_t i = 0; i < RETRY_TIMES; ++i) {
1908if (OB_SUCCESS != (tmp_ret = schedule_restart_timer_task(config_->rootservice_ready_check_interval))) {
1909FLOG_WARN("fail to schedule_restart_timer_task at this retry", KR(tmp_ret), K(i));
1910} else {
1911FLOG_INFO("success to schedule_restart_timer_task");
1912break;
1913}
1914}
1915if (OB_SUCCESS != tmp_ret) {
1916LOG_ERROR("fatal error, fail to add restart task", KR(tmp_ret));
1917if (OB_FAIL(rs_status_.set_rs_status(status::STOPPING))) {
1918LOG_ERROR("fail to set rs status", KR(ret));
1919}
1920}
1921}
1922}
1923
1924// NOTE: Following log print after lock
1925FLOG_INFO("[ROOTSERVICE_NOTICE] finish do restart task", KR(ret));
1926return ret;
1927}
1928
1929int ObRootService::do_after_full_service() {
1930int ret = OB_SUCCESS;
1931ObGlobalStatProxy global_proxy(sql_proxy_, OB_SYS_TENANT_ID);
1932if (OB_FAIL(global_proxy.get_baseline_schema_version(baseline_schema_version_))) {
1933LOG_WARN("fail to get baseline schema version", KR(ret));
1934}
1935
1936if (OB_FAIL(ret)) {
1937} else if (OB_FAIL(schedule_self_check_task())) {
1938LOG_WARN("fail to schedule self check task", K(ret));
1939} else {
1940LOG_INFO("schedule self check to root_inspection success");
1941}
1942
1943// force broadcast rs list again to make sure rootserver list be updated
1944if (OB_SUCC(ret)) {
1945int tmp_ret = update_rslist();
1946if (OB_SUCCESS != tmp_ret) {
1947LOG_WARN("broadcast root address failed", K(tmp_ret));
1948}
1949}
1950return ret;
1951}
1952
1953////////////////////////////////////////////////////////////////
1954int ObRootService::execute_bootstrap(const obrpc::ObBootstrapArg &arg)
1955{
1956int ret = OB_SUCCESS;
1957const obrpc::ObServerInfoList &server_list = arg.server_list_;
1958BOOTSTRAP_LOG(INFO, "STEP_1.1:execute_bootstrap start to executor.");
1959if (!inited_) {
1960ret = OB_NOT_INIT;
1961LOG_WARN("root_service not inited", K(ret));
1962} else if (!sql_proxy_.is_inited() || !sql_proxy_.is_active()) {
1963ret = OB_INVALID_ARGUMENT;
1964LOG_WARN("sql_proxy not inited or not active", "sql_proxy inited",
1965sql_proxy_.is_inited(), "sql_proxy active", sql_proxy_.is_active(), K(ret));
1966} else if (server_list.count() <= 0) {
1967ret = OB_INVALID_ARGUMENT;
1968LOG_WARN("server_list is empty", K(server_list), K(ret));
1969} else if (OB_UNLIKELY(nullptr == lst_operator_)) {
1970ret = OB_ERR_UNEXPECTED;
1971LOG_WARN("lst_operator_ ptr is null", KR(ret), KP(lst_operator_));
1972} else {
1973update_cpu_quota_concurrency_in_memory_();
1974// avoid bootstrap and do_restart run concurrently
1975FLOG_INFO("[ROOTSERVICE_NOTICE] try to get lock for bootstrap in execute_bootstrap");
1976ObLatchWGuard guard(bootstrap_lock_, ObLatchIds::RS_BOOTSTRAP_LOCK);
1977FLOG_INFO("[ROOTSERVICE_NOTICE] success to get lock for bootstrap in execute_bootstrap");
1978ObBootstrap bootstrap(rpc_proxy_, *lst_operator_, ddl_service_, unit_manager_,
1979*config_, arg, common_proxy_);
1980if (OB_FAIL(bootstrap.execute_bootstrap(server_zone_op_service_))) {
1981LOG_ERROR("failed to execute_bootstrap", K(server_list), K(ret));
1982}
1983
1984BOOTSTRAP_LOG(INFO, "start to do_restart");
1985ObGlobalStatProxy global_proxy(sql_proxy_, OB_SYS_TENANT_ID);
1986ObArray<ObAddr> self_addr;
1987if (OB_FAIL(ret)) {
1988} else if (OB_FAIL(do_restart())) {
1989LOG_WARN("do restart task failed", K(ret));
1990} else if (OB_FAIL(check_ddl_allowed())) {
1991LOG_WARN("fail to check ddl allowed", K(ret));
1992} else if (OB_FAIL(update_all_server_and_rslist())) {
1993LOG_WARN("failed to update all_server and rslist", K(ret));
1994} else if (OB_FAIL(zone_manager_.reload())) {
1995LOG_WARN("failed to reload zone manager", K(ret));
1996} else if (OB_FAIL(set_cluster_version())) {
1997LOG_WARN("set cluster version failed", K(ret));
1998} else if (OB_FAIL(pl::ObPLPackageManager::load_all_sys_package(sql_proxy_))) {
1999LOG_WARN("load all system package failed", K(ret));
2000} else if (OB_FAIL(finish_bootstrap())) {
2001LOG_WARN("failed to finish bootstrap", K(ret));
2002} else if (OB_FAIL(update_baseline_schema_version())) {
2003LOG_WARN("failed to update baseline schema version", K(ret));
2004} else if (OB_FAIL(global_proxy.get_baseline_schema_version(
2005baseline_schema_version_))) {
2006LOG_WARN("fail to get baseline schema version", KR(ret));
2007} else if (OB_FAIL(set_cpu_quota_concurrency_config_())) {
2008LOG_WARN("failed to update cpu_quota_concurrency", K(ret));
2009}
2010
2011if (OB_SUCC(ret)) {
2012char ori_min_server_version[OB_SERVER_VERSION_LENGTH] = {'\0'};
2013uint64_t ori_cluster_version = GET_MIN_CLUSTER_VERSION();
2014share::ObServerInfoInTable::ObBuildVersion build_version;
2015if (OB_INVALID_INDEX == ObClusterVersion::print_version_str(
2016ori_min_server_version, OB_SERVER_VERSION_LENGTH, ori_cluster_version)) {
2017ret = OB_INVALID_ARGUMENT;
2018LOG_WARN("fail to print version str", KR(ret), K(ori_cluster_version));
2019} else if (OB_FAIL(observer::ObService::get_build_version(build_version))) {
2020LOG_WARN("fail to get build version", KR(ret));
2021} else {
2022CLUSTER_EVENT_SYNC_ADD("BOOTSTRAP", "BOOTSTRAP_SUCCESS",
2023"cluster_version", ori_min_server_version,
2024"build_version", build_version.ptr());
2025}
2026}
2027
2028//clear bootstrap flag, regardless failure or success
2029int tmp_ret = OB_SUCCESS;
2030if (OB_SUCCESS != (tmp_ret = clear_special_cluster_schema_status())) {
2031LOG_WARN("failed to clear special cluster schema status",
2032KR(ret), K(tmp_ret));
2033}
2034ret = OB_SUCC(ret) ? tmp_ret : ret;
2035}
2036BOOTSTRAP_LOG(INFO, "execute_bootstrap finished", K(ret));
2037return ret;
2038}
2039
2040#ifdef OB_BUILD_TDE_SECURITY
2041int ObRootService::check_sys_tenant_initial_master_key_valid()
2042{
2043int ret = OB_SUCCESS;
2044const int64_t start = ObTimeUtility::current_time();
2045const int64_t MAX_WAIT_US = 120L * 1000L * 1000L; //120s
2046const int64_t end = start + MAX_WAIT_US;
2047const int64_t IDLING_US = 100L * 1000L; // 100ms
2048while (OB_SUCC(ret)) {
2049if (ObTimeUtility::current_time() >= end) {
2050ret = OB_TIMEOUT;
2051LOG_WARN("wait sys tenant initial master key valid timeout", KR(ret));
2052} else {
2053bool has_available_master_key = false;
2054if (OB_FAIL(master_key_mgr_.check_if_tenant_has_available_master_keys(
2055OB_SYS_TENANT_ID, has_available_master_key))) {
2056LOG_WARN("fail to check if tenant has available master key", KR(ret));
2057} else if (!has_available_master_key) {
2058ob_usleep(std::min(IDLING_US, end - ObTimeUtility::current_time()));
2059} else {
2060break;
2061}
2062}
2063}
2064return ret;
2065}
2066#endif
2067
2068int ObRootService::check_config_result(const char *name, const char* value)
2069{
2070int ret = OB_SUCCESS;
2071const int64_t start = ObTimeUtility::current_time();
2072const uint64_t DEFAULT_WAIT_US = 120 * 1000 * 1000L; //120s
2073int64_t timeout = DEFAULT_WAIT_US;
2074if (INT64_MAX != THIS_WORKER.get_timeout_ts()) {
2075timeout = MAX(DEFAULT_WAIT_US, THIS_WORKER.get_timeout_remain());
2076}
2077ObSqlString sql;
2078HEAP_VAR(ObMySQLProxy::MySQLResult, res) {
2079common::sqlclient::ObMySQLResult *result = NULL;
2080if (OB_FAIL(sql.assign_fmt("SELECT count(*) as count FROM %s "
2081"WHERE name = '%s' and value != '%s'",
2082"__all_virtual_tenant_parameter_stat", name, value))) {
2083LOG_WARN("fail to append sql", K(ret));
2084}
2085while(OB_SUCC(ret) || OB_ERR_WAIT_REMOTE_SCHEMA_REFRESH == ret /* remote schema not ready, return -4029 on remote */) {
2086if (ObTimeUtility::current_time() - start > timeout) {
2087ret = OB_TIMEOUT;
2088LOG_WARN("sync config info use too much time", K(ret), K(name), K(value),
2089"cost_us", ObTimeUtility::current_time() - start);
2090} else {
2091if (OB_FAIL(sql_proxy_.read(res, sql.ptr()))) {
2092LOG_WARN("fail to execute sql", K(ret), K(sql));
2093} else if (NULL == (result = res.get_result())) {
2094ret = OB_ERR_UNEXPECTED;
2095LOG_WARN("fail to get sql result", K(ret));
2096} else if (OB_FAIL(result->next())) {
2097LOG_WARN("fail to get result", K(ret));
2098} else {
2099int32_t count = OB_INVALID_COUNT;
2100EXTRACT_INT_FIELD_MYSQL(*result, "count", count, int32_t);
2101if (OB_SUCC(ret)) {
2102if (count == 0) { break; }
2103}
2104}
2105}
2106} // while end
2107}
2108return ret;
2109}
2110
2111// DDL exection depends on full_service & major_freeze_done state. the sequence of these two status in bootstrap is:
2112// 1.rs do_restart: major_freeze_launcher start
2113// 2.rs do_restart success: full_service is true
2114// 3.root_major_freeze success: major_freeze_done is true (need full_service is true)
2115// the success of do_restart does not mean to execute DDL, therefor, add wait to bootstrap, to avoid bootstrap failure cause by DDL failure
2116int ObRootService::check_ddl_allowed()
2117{
2118int ret = OB_SUCCESS;
2119const int64_t SLEEP_INTERVAL_US = 1 * 1000 * 1000; //1s
2120while (OB_SUCC(ret) && !is_ddl_allowed()) {
2121if (!in_service() && !is_start()) {
2122ret = OB_RS_SHUTDOWN;
2123LOG_WARN("rs shutdown", K(ret));
2124} else if (THIS_WORKER.is_timeout()) {
2125ret = OB_TIMEOUT;
2126LOG_WARN("wait too long", K(ret));
2127} else {
2128ob_usleep(SLEEP_INTERVAL_US);
2129}
2130}
2131return ret;
2132}
2133
2134// used by bootstrap
2135int ObRootService::update_baseline_schema_version()
2136{
2137int ret = OB_SUCCESS;
2138ObMySQLTransaction trans;
2139int64_t baseline_schema_version = OB_INVALID_VERSION;
2140if (!inited_) {
2141ret = OB_NOT_INIT;
2142LOG_WARN("not init", K(ret));
2143} else if (OB_FAIL(trans.start(&sql_proxy_, OB_SYS_TENANT_ID))) {
2144LOG_WARN("trans start failed", K(ret));
2145} else if (OB_FAIL(ddl_service_.get_schema_service().
2146get_tenant_refreshed_schema_version(OB_SYS_TENANT_ID,
2147baseline_schema_version))) {
2148LOG_WARN("fail to get refreshed schema version", K(ret));
2149} else {
2150ObGlobalStatProxy proxy(trans, OB_SYS_TENANT_ID);
2151if (OB_FAIL(proxy.set_baseline_schema_version(baseline_schema_version))) {
2152LOG_WARN("set_baseline_schema_version failed", K(baseline_schema_version), K(ret));
2153}
2154}
2155int temp_ret = OB_SUCCESS;
2156if (!trans.is_started()) {
2157} else if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCCESS == ret))) {
2158LOG_WARN("trans end failed", "commit", OB_SUCCESS == ret, K(temp_ret));
2159ret = (OB_SUCCESS == ret) ? temp_ret : ret;
2160}
2161LOG_DEBUG("update_baseline_schema_version finish", K(ret), K(temp_ret),
2162K(baseline_schema_version));
2163return ret;
2164}
2165
2166int ObRootService::finish_bootstrap()
2167{
2168int ret = OB_SUCCESS;
2169if (!inited_) {
2170ret = OB_NOT_INIT;
2171LOG_WARN("not init", K(ret));
2172} else {
2173const int64_t tenant_id = OB_SYS_TENANT_ID;
2174int64_t new_schema_version = OB_INVALID_VERSION;
2175ObMultiVersionSchemaService &multi_schema_service = ddl_service_.get_schema_service();
2176share::schema::ObSchemaService *tmp_schema_service = multi_schema_service.get_schema_service();
2177if (OB_ISNULL(tmp_schema_service)) {
2178ret = OB_ERR_UNEXPECTED;
2179LOG_WARN("schema service is null", K(ret), KP(tmp_schema_service));
2180} else {
2181ObMySQLProxy &sql_proxy = ddl_service_.get_sql_proxy();
2182share::schema::ObDDLSqlService ddl_sql_service(*tmp_schema_service);
2183share::schema::ObSchemaOperation schema_operation;
2184schema_operation.op_type_ = share::schema::OB_DDL_FINISH_BOOTSTRAP;
2185schema_operation.tenant_id_ = tenant_id;
2186if (OB_FAIL(multi_schema_service.gen_new_schema_version(tenant_id, new_schema_version))) {
2187LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id), K(new_schema_version));
2188} else if (OB_FAIL(ddl_sql_service.log_nop_operation(schema_operation,
2189new_schema_version,
2190schema_operation.ddl_stmt_str_,
2191sql_proxy))) {
2192LOG_WARN("log finish bootstrap operation failed", K(ret), K(schema_operation));
2193} else if (OB_FAIL(ddl_service_.refresh_schema(OB_SYS_TENANT_ID))) {
2194LOG_WARN("failed to refresh_schema", K(ret));
2195} else {
2196LOG_INFO("finish bootstrap", K(ret), K(new_schema_version));
2197}
2198}
2199}
2200return ret;
2201}
2202
2203void ObRootService::construct_lease_expire_time(
2204const ObLeaseRequest &lease_request,
2205share::ObLeaseResponse &lease_response,
2206const share::ObServerStatus &server_status)
2207{
2208UNUSED(lease_request);
2209const int64_t now = ObTimeUtility::current_time();
2210// if force_stop_hb is true,
2211// then lease_expire_time_ won't be changed
2212lease_response.heartbeat_expire_time_ = is_full_service() && server_status.force_stop_hb_
2213? server_status.last_hb_time_ + config_->lease_time
2214: now + config_->lease_time;
2215lease_response.lease_expire_time_ = lease_response.heartbeat_expire_time_;
2216}
2217
2218int ObRootService::renew_lease(const ObLeaseRequest &lease_request, ObLeaseResponse &lease_response)
2219{
2220int ret = OB_SUCCESS;
2221ObServerStatus server_stat;
2222uint64_t server_id = OB_INVALID_ID;
2223bool to_alive = false;
2224DEBUG_SYNC(HANG_HEART_BEAT_ON_RS);
2225if (!inited_) {
2226ret = OB_NOT_INIT;
2227LOG_WARN("not init", K(ret));
2228} else if (!lease_request.is_valid()) {
2229ret = OB_INVALID_ARGUMENT;
2230LOG_WARN("invalid lease_request", K(lease_request), K(ret));
2231} else if (OB_FAIL(server_manager_.receive_hb(lease_request, server_id, to_alive))) {
2232LOG_WARN("server manager receive hb failed", K(lease_request), K(ret));
2233} else if (OB_ISNULL(schema_service_)) {
2234ret = OB_ERR_UNEXPECTED;
2235LOG_WARN("schema_service is null", K(ret));
2236} else {
2237// before __all_zone load, it may fail, ignore it
2238int temp_ret = OB_SUCCESS;
2239int64_t lease_info_version = 0;
2240bool is_stopped = false;
2241lease_response.rs_server_status_ = RSS_INVALID;
2242if (is_full_service()) {
2243if (OB_FAIL(zone_manager_.get_lease_info_version(lease_info_version))) {
2244LOG_WARN("get_lease_info_version failed", K(ret));
2245} else if (OB_FAIL(server_manager_.get_server_status(
2246lease_request.server_, server_stat))) {
2247// get server_stat for construct_lease_expire_time only!
2248LOG_WARN("get server status failed", K(ret), "server", lease_request.server_);
2249}
2250if (!ObHeartbeatService::is_service_enabled()) {
2251if (FAILEDx(server_manager_.is_server_stopped(lease_request.server_, is_stopped))) {
2252LOG_WARN("check_server_stopped failed", KR(ret), "server", lease_request.server_);
2253} else {
2254lease_response.rs_server_status_ = is_stopped ? RSS_IS_STOPPED : RSS_IS_WORKING;
2255}
2256}
2257#ifdef OB_BUILD_TDE_SECURITY
2258if (OB_SUCCESS != (temp_ret = master_key_mgr_.input_server_master_key(
2259lease_request.server_, lease_request.tenant_max_flushed_key_version_))) {
2260LOG_WARN("fail to input server master key", KR(temp_ret), K(lease_request));
2261}
2262#endif
2263}
2264if (OB_SUCC(ret)) {
2265lease_response.version_ = ObLeaseResponse::LEASE_VERSION;
2266construct_lease_expire_time(lease_request, lease_response, server_stat);
2267lease_response.lease_info_version_ = lease_info_version;
2268lease_response.server_id_ = server_id;
2269lease_response.force_frozen_status_ = to_alive;
2270lease_response.baseline_schema_version_ = baseline_schema_version_;
2271(void)OTC_MGR.get_lease_response(lease_response);
2272
2273// after split schema, the schema_version is not used, but for the legality detection, set schema_version to sys's schema_version
2274if (OB_SUCCESS != (temp_ret = schema_service_->get_tenant_schema_version(OB_SYS_TENANT_ID, lease_response.schema_version_))) {
2275LOG_WARN("fail to get tenant schema version", K(temp_ret));
2276}
2277
2278if (OB_SUCCESS != (temp_ret = schema_service_->get_refresh_schema_info(
2279lease_response.refresh_schema_info_))) {
2280LOG_WARN("fail to get refresh_schema_info", K(temp_ret));
2281}
2282
2283#ifdef OB_BUILD_TDE_SECURITY
2284if (OB_SUCCESS != (temp_ret = master_key_mgr_.get_all_tenant_master_key(
2285lease_request.zone_,
2286lease_response.tenant_max_key_version_))) {
2287LOG_WARN("fail to get all tenant master key", KR(temp_ret),
2288"server", lease_request.server_, "zone", lease_request.zone_);
2289}
2290#endif
2291LOG_TRACE("lease_request", K(lease_request), K(lease_response));
2292}
2293}
2294return ret;
2295}
2296
2297int ObRootService::report_sys_ls(const share::ObLSReplica &replica)
2298{
2299int ret = OB_SUCCESS;
2300ObInMemoryLSTable *inmemory_ls = NULL;
2301ObRole role = FOLLOWER;
2302bool inner_table_only = false;
2303LOG_INFO("receive request to report sys ls", K(replica));
2304if (OB_UNLIKELY(!inited_) || OB_ISNULL(lst_operator_)) {
2305ret = OB_NOT_INIT;
2306LOG_WARN("rootservice not inited", KR(ret));
2307} else if (OB_FAIL(lst_operator_->get_role(OB_SYS_TENANT_ID, SYS_LS, role))) {
2308LOG_WARN("fail to get local role by lst_operator", KR(ret));
2309} else if (OB_UNLIKELY(!is_strong_leader(role))) {
2310ret = OB_RS_NOT_MASTER;
2311LOG_WARN("local role is not leader", KR(ret), K(role));
2312} else if (OB_UNLIKELY(!replica.is_valid())) {
2313ret = OB_INVALID_ARGUMENT;
2314LOG_WARN("invalid replica", KR(ret), K(replica));
2315} else if (OB_ISNULL(inmemory_ls = lst_operator_->get_inmemory_ls())) {
2316ret = OB_ERR_UNEXPECTED;
2317LOG_WARN("fail to get inmemory ls", KR(ret), K(replica));
2318} else if (OB_FAIL(inmemory_ls->update(replica, inner_table_only))) {
2319LOG_WARN("update sys ls failed", KR(ret), K(replica));
2320} else {
2321LOG_INFO("update sys ls on rs success", K(replica));
2322}
2323return ret;
2324}
2325
2326int ObRootService::remove_sys_ls(const obrpc::ObRemoveSysLsArg &arg)
2327{
2328int ret = OB_SUCCESS;
2329ObInMemoryLSTable *inmemory_ls = NULL;
2330ObRole role = FOLLOWER;
2331bool inner_table_only = false;
2332LOG_INFO("receive request to remove sys ls", K(arg));
2333if (OB_UNLIKELY(!inited_) || OB_ISNULL(lst_operator_)) {
2334ret = OB_NOT_INIT;
2335LOG_WARN("rootservice not inited", KR(ret));
2336} else if (OB_FAIL(lst_operator_->get_role(OB_SYS_TENANT_ID, SYS_LS, role))) {
2337LOG_WARN("fail to get local role by lst_operator", KR(ret));
2338} else if (OB_UNLIKELY(!is_strong_leader(role))) {
2339ret = OB_RS_NOT_MASTER;
2340LOG_WARN("local role is not leader", KR(ret), K(role));
2341} else if (OB_UNLIKELY(!arg.is_valid())) {
2342ret = OB_INVALID_ARGUMENT;
2343LOG_WARN("invalid server", KR(ret), K(arg));
2344} else if (OB_ISNULL(inmemory_ls = lst_operator_->get_inmemory_ls())) {
2345ret = OB_ERR_UNEXPECTED;
2346LOG_WARN("fail to get inmemory ls", KR(ret), K(arg));
2347} else if (OB_FAIL(inmemory_ls->remove(
2348OB_SYS_TENANT_ID,
2349SYS_LS,
2350arg.server_,
2351inner_table_only))) {
2352LOG_WARN("remove sys ls failed", KR(ret), K(arg));
2353} else {
2354LOG_INFO("remove sys ls on rs success", K(arg));
2355}
2356return ret;
2357}
2358
2359int ObRootService::fetch_location(
2360const obrpc::ObFetchLocationArg &arg,
2361obrpc::ObFetchLocationResult &res)
2362{
2363int ret = OB_SUCCESS;
2364const ObVtableLocationType &vtable_type = arg.get_vtable_type();
2365ObSArray<ObAddr> servers;
2366if (!inited_) {
2367ret = OB_NOT_INIT;
2368LOG_WARN("rootservice not init", KR(ret));
2369} else if (!arg.is_valid()) {
2370ret = OB_INVALID_ARGUMENT;
2371LOG_WARN("invalid arg", KR(ret), K(arg));
2372} else if (OB_FAIL(vtable_location_getter_.get(vtable_type, servers))) {
2373LOG_WARN("vtable_location_getter get failed", KR(ret), K(arg));
2374} else if (OB_FAIL(res.set_servers(servers))) {
2375LOG_WARN("fail to assign servers", KR(ret), K(servers), K(arg));
2376}
2377return ret;
2378}
2379
2380////////////////////////////////////////////////////////////////
2381
2382int ObRootService::create_resource_unit(const obrpc::ObCreateResourceUnitArg &arg)
2383{
2384int ret = OB_SUCCESS;
2385const bool if_not_exist = arg.get_if_not_exist();
2386LOG_INFO("receive create_resource_unit request", K(arg));
2387
2388if (!inited_) {
2389ret = OB_NOT_INIT;
2390LOG_WARN("not init", K(ret));
2391} else if (OB_FAIL(unit_manager_.create_unit_config(arg.get_unit_config(), if_not_exist))) {
2392LOG_WARN("create_unit_config failed", K(arg), K(if_not_exist), KR(ret));
2393int mysql_error = -common::ob_mysql_errno(ret);
2394if (OB_TIMEOUT == ret || OB_TIMEOUT == mysql_error) {
2395int tmp_ret = OB_SUCCESS;
2396if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2397if (OB_CANCELED != tmp_ret) {
2398LOG_ERROR("fail to reload unit_manager, please try 'alter system reload unit', please try 'alter system reload unit'", K(tmp_ret));
2399}
2400}
2401}
2402}
2403
2404LOG_INFO("finish create_resource_unit", K(arg), KR(ret));
2405ROOTSERVICE_EVENT_ADD("root_service", "create_resource_unit", K(ret), K(arg));
2406return ret;
2407}
2408
2409int ObRootService::alter_resource_unit(const obrpc::ObAlterResourceUnitArg &arg)
2410{
2411int ret = OB_SUCCESS;
2412if (!inited_) {
2413ret = OB_NOT_INIT;
2414LOG_WARN("not init", K(ret));
2415} else {
2416LOG_INFO("receive alter_resource_unit request", K(arg));
2417if (OB_FAIL(unit_manager_.alter_unit_config(arg.get_unit_config()))) {
2418LOG_WARN("alter_unit_config failed", K(arg), KR(ret));
2419int mysql_error = -common::ob_mysql_errno(ret);
2420if (OB_TIMEOUT == ret || OB_TIMEOUT == mysql_error) {
2421int tmp_ret = OB_SUCCESS;
2422if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2423if (OB_CANCELED != tmp_ret) {
2424LOG_ERROR("fail to reload unit_manager, please try 'alter system reload unit', please try 'alter system reload unit'", K(tmp_ret));
2425}
2426}
2427}
2428}
2429LOG_INFO("finish alter_resource_unit", K(arg), KR(ret));
2430}
2431ROOTSERVICE_EVENT_ADD("root_service", "alter_resource_unit", K(ret), K(arg));
2432return ret;
2433}
2434
2435int ObRootService::drop_resource_unit(const obrpc::ObDropResourceUnitArg &arg)
2436{
2437int ret = OB_SUCCESS;
2438const bool if_exist = arg.if_exist_;
2439if (!inited_) {
2440ret = OB_NOT_INIT;
2441LOG_WARN("not init", K(ret));
2442} else if (!arg.is_valid()) {
2443ret = OB_INVALID_ARGUMENT;
2444LOG_WARN("invalid arg", K(arg), K(ret));
2445} else {
2446LOG_INFO("receive drop_resource_unit request", K(arg));
2447if (OB_FAIL(unit_manager_.drop_unit_config(arg.unit_name_, if_exist))) {
2448LOG_WARN("drop_unit_config failed", "unit_config", arg.unit_name_, K(if_exist), K(ret));
2449int mysql_error = -common::ob_mysql_errno(ret);
2450if (OB_TIMEOUT == ret || OB_TIMEOUT == mysql_error) {
2451int tmp_ret = OB_SUCCESS;
2452if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2453if (OB_CANCELED != tmp_ret) {
2454LOG_ERROR("fail to reload unit_manager, please try 'alter system reload unit'", K(tmp_ret));
2455}
2456}
2457}
2458}
2459LOG_INFO("finish drop_resource_unit", K(arg), K(ret));
2460}
2461ROOTSERVICE_EVENT_ADD("root_service", "drop_resource_unit", K(ret), K(arg));
2462return ret;
2463}
2464
2465int ObRootService::clone_resource_pool(const obrpc::ObCloneResourcePoolArg &arg)
2466{
2467int ret = OB_SUCCESS;
2468bool is_compatible = false;
2469LOG_INFO("receive clone_resource_pool request", K(arg));
2470if (!inited_) {
2471ret = OB_NOT_INIT;
2472LOG_WARN("rootservice not init", KR(ret), K_(inited));
2473} else if (!arg.is_valid()) {
2474ret = OB_INVALID_ARGUMENT;
2475LOG_WARN("invalid argument to clone resource pool", KR(ret), K(arg));
2476} else if (OB_FAIL(ObShareUtil::check_compat_version_for_clone_tenant(
2477arg.get_source_tenant_id(),
2478is_compatible))) {
2479LOG_WARN("fail to check compat version", KR(ret), K(arg));
2480} else if (!is_compatible) {
2481ret = OB_STATE_NOT_MATCH;
2482LOG_WARN("clone tenant or sys tenant data version is below 4.3", KR(ret), K(arg), K(is_compatible));
2483} else {
2484share::ObResourcePool pool_to_clone;
2485pool_to_clone.name_ = arg.get_pool_name();
2486pool_to_clone.resource_pool_id_ = arg.get_resource_pool_id();
2487if (OB_FAIL(unit_manager_.clone_resource_pool(pool_to_clone, arg.get_unit_config_name(), arg.get_source_tenant_id()))) {
2488LOG_WARN("clone_resource_pool failed", KR(ret), K(pool_to_clone), K(arg));
2489int tmp_ret = OB_SUCCESS;
2490if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2491if (OB_CANCELED != tmp_ret) {
2492LOG_ERROR("fail to reload unit_manager, please try 'alter system reload unit'", K(tmp_ret));
2493}
2494}
2495}
2496}
2497LOG_INFO("finish clone_resource_pool", KR(ret), K(arg));
2498ROOTSERVICE_EVENT_ADD("root_service", "clone_resource_pool", KR(ret), K(arg));
2499return ret;
2500}
2501
2502int ObRootService::create_resource_pool(const obrpc::ObCreateResourcePoolArg &arg)
2503{
2504int ret = OB_SUCCESS;
2505const bool if_not_exist = arg.if_not_exist_;
2506if (!inited_) {
2507ret = OB_NOT_INIT;
2508LOG_WARN("not init", K(ret));
2509} else if (!arg.is_valid()) {
2510ret = OB_MISS_ARGUMENT;
2511if (arg.pool_name_.empty()) {
2512LOG_USER_ERROR(OB_MISS_ARGUMENT, "resource pool name");
2513} else if (arg.unit_.empty()) {
2514LOG_USER_ERROR(OB_MISS_ARGUMENT, "unit");
2515} else if (arg.unit_num_ <= 0) {
2516LOG_USER_ERROR(OB_MISS_ARGUMENT, "unit_num");
2517}
2518LOG_WARN("missing arg to create resource pool", K(arg), K(ret));
2519} else if (REPLICA_TYPE_LOGONLY != arg.replica_type_
2520&& REPLICA_TYPE_FULL != arg.replica_type_) {
2521ret = OB_NOT_SUPPORTED;
2522LOG_WARN("only full/logonly pool are supported", K(ret), K(arg));
2523} else if (REPLICA_TYPE_LOGONLY == arg.replica_type_
2524&& arg.unit_num_> 1) {
2525ret = OB_NOT_SUPPORTED;
2526LOG_WARN("logonly resource pool should only have one unit on one zone", K(ret), K(arg));
2527} else if (0 == arg.unit_.case_compare(OB_STANDBY_UNIT_CONFIG_TEMPLATE_NAME)) {
2528ret = OB_OP_NOT_ALLOW;
2529LOG_WARN("can not create resource pool use standby unit config template", K(ret), K(arg));
2530LOG_USER_ERROR(OB_OP_NOT_ALLOW, "create resource pool use stanby unit config template");
2531} else {
2532LOG_INFO("receive create_resource_pool request", K(arg));
2533share::ObResourcePool pool;
2534pool.name_ = arg.pool_name_;
2535pool.unit_count_ = arg.unit_num_;
2536pool.replica_type_ = arg.replica_type_;
2537if (OB_FAIL(pool.zone_list_.assign(arg.zone_list_))) {
2538LOG_WARN("assign failed", K(ret));
2539} else if (OB_FAIL(unit_manager_.create_resource_pool(pool, arg.unit_, if_not_exist))) {
2540LOG_WARN("create_resource_pool failed", K(pool),
2541"unit_config", arg.unit_, K(if_not_exist), K(ret));
2542int mysql_error = -common::ob_mysql_errno(ret);
2543if (OB_TIMEOUT == ret || OB_TIMEOUT == mysql_error) {
2544int tmp_ret = OB_SUCCESS;
2545if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2546if (OB_CANCELED != tmp_ret) {
2547LOG_ERROR("fail to reload unit_manager, please try 'alter system reload unit'", K(tmp_ret));
2548}
2549}
2550}
2551}
2552LOG_INFO("finish create_resource_pool", K(arg), K(ret));
2553}
2554ROOTSERVICE_EVENT_ADD("root_service", "create_resource_pool", K(ret), K(arg));
2555return ret;
2556}
2557
2558int ObRootService::split_resource_pool(const obrpc::ObSplitResourcePoolArg &arg)
2559{
2560int ret = OB_SUCCESS;
2561if (!inited_) {
2562ret = OB_NOT_INIT;
2563LOG_WARN("not init", K(ret));
2564} else if (!arg.is_valid()) {
2565ret = OB_INVALID_ARGUMENT;
2566LOG_WARN("invalid argument", K(ret), K(arg));
2567} else {
2568LOG_INFO("receive split resource pool request", K(arg));
2569share::ObResourcePoolName pool_name = arg.pool_name_;
2570const common::ObIArray<common::ObString> &split_pool_list = arg.split_pool_list_;
2571const common::ObIArray<common::ObZone> &zone_list = arg.zone_list_;
2572if (OB_FAIL(unit_manager_.split_resource_pool(pool_name, split_pool_list, zone_list))) {
2573LOG_WARN("fail to split resource pool", K(ret));
2574int mysql_error = -common::ob_mysql_errno(ret);
2575if (OB_TIMEOUT == ret || OB_TIMEOUT == mysql_error) {
2576int tmp_ret = OB_SUCCESS;
2577if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2578if (OB_CANCELED != tmp_ret) {
2579LOG_ERROR("fail to reload unit_mgr, please try 'alter system reload unit'", K(tmp_ret));
2580}
2581}
2582}
2583}
2584LOG_INFO("finish split_resource_pool", K(ret), K(arg));
2585}
2586ROOTSERVICE_EVENT_ADD("root_service", "split_resource_pool", K(ret), K(arg));
2587return ret;
2588}
2589
2590int ObRootService::alter_resource_tenant(const obrpc::ObAlterResourceTenantArg &arg)
2591{
2592int ret = OB_SUCCESS;
2593if (OB_UNLIKELY(!inited_)) {
2594ret = OB_NOT_INIT;
2595LOG_WARN("not init", KR(ret));
2596} else if (OB_UNLIKELY(!arg.is_valid())) {
2597ret = OB_INVALID_ARGUMENT;
2598LOG_WARN("invalid argument", KR(ret), K(arg));
2599} else if (OB_UNLIKELY(nullptr == schema_service_)) {
2600ret = OB_ERR_UNEXPECTED;
2601LOG_WARN("schema_service ptr is null", KR(ret));
2602} else {
2603LOG_INFO("receive alter resource tenant request", K(arg));
2604const ObString &target_tenant_name = arg.tenant_name_;
2605const int64_t new_unit_num = arg.unit_num_;
2606const common::ObIArray<uint64_t> &delete_unit_group_id_array = arg.unit_group_id_array_;
2607share::schema::ObSchemaGetterGuard schema_guard;
2608uint64_t target_tenant_id = OB_INVALID_ID;
2609int tmp_ret = OB_SUCCESS;
2610
2611if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) {
2612LOG_WARN("fail to get tenant schema guard", KR(ret), "tenant_id", OB_SYS_TENANT_ID);
2613} else if (OB_FAIL(schema_guard.get_tenant_id(target_tenant_name, target_tenant_id))) {
2614LOG_WARN("fail to get tenant id", KR(ret), K(target_tenant_name));
2615} else if (OB_UNLIKELY(OB_INVALID_ID == target_tenant_id)) {
2616ret = OB_ERR_UNEXPECTED;
2617LOG_WARN("target_tenant_id value unexpected", KR(ret), K(target_tenant_name), K(target_tenant_id));
2618} else if (OB_FAIL(unit_manager_.alter_resource_tenant(
2619target_tenant_id, new_unit_num, delete_unit_group_id_array, arg.ddl_stmt_str_))) {
2620LOG_WARN("fail to alter resource tenant", KR(ret), K(target_tenant_id),
2621K(new_unit_num), K(delete_unit_group_id_array));
2622if (OB_TMP_FAIL(submit_reload_unit_manager_task())) {
2623if (OB_CANCELED != tmp_ret) {
2624LOG_ERROR("fail to reload unit_mgr, please try 'alter system reload unit'", KR(ret), KR(tmp_ret));
2625}
2626}
2627}
2628LOG_INFO("finish alter_resource_tenant", KR(ret), K(arg));
2629}
2630
2631ROOTSERVICE_EVENT_ADD("root_service", "alter_resource_tenant", K(ret), K(arg));
2632return ret;
2633}
2634
2635int ObRootService::merge_resource_pool(const obrpc::ObMergeResourcePoolArg &arg)
2636{
2637int ret = OB_SUCCESS;
2638if (!inited_) {
2639ret = OB_NOT_INIT;
2640LOG_WARN("not init", K(ret));
2641} else if (!arg.is_valid()) {
2642ret = OB_INVALID_ARGUMENT;
2643LOG_WARN("invalid argument", K(ret), K(arg));
2644} else {
2645LOG_INFO("receive merge resource pool request", K(arg));
2646const common::ObIArray<common::ObString> &old_pool_list = arg.old_pool_list_;
2647const common::ObIArray<common::ObString> &new_pool_list = arg.new_pool_list_;
2648if (OB_FAIL(unit_manager_.merge_resource_pool(old_pool_list, new_pool_list))) {
2649LOG_WARN("fail to merge resource pool", K(ret));
2650int tmp_ret = OB_SUCCESS;
2651if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {//ensure submit task all case
2652if (OB_CANCELED != tmp_ret) {
2653LOG_ERROR("fail to reload unit_mgr, please try 'alter system reload unit'", KR(ret), K(tmp_ret));
2654}
2655}
2656}
2657LOG_INFO("finish merge_resource_pool", K(ret), K(arg));
2658}
2659ROOTSERVICE_EVENT_ADD("root_service", "merge_resource_pool", K(ret), K(arg));
2660return ret;
2661}
2662
2663int ObRootService::alter_resource_pool(const obrpc::ObAlterResourcePoolArg &arg)
2664{
2665int ret = OB_SUCCESS;
2666if (!inited_) {
2667ret = OB_NOT_INIT;
2668LOG_WARN("not init", K(ret));
2669} else if (!arg.is_valid()) {
2670ret = OB_MISS_ARGUMENT;
2671if (arg.pool_name_.empty()) {
2672LOG_USER_ERROR(OB_MISS_ARGUMENT, "resource pool name");
2673}
2674LOG_WARN("missing arg to alter resource pool", K(arg), K(ret));
2675} else if (0 == arg.unit_.case_compare(OB_STANDBY_UNIT_CONFIG_TEMPLATE_NAME)) {
2676ret = OB_OP_NOT_ALLOW;
2677LOG_WARN("can not alter resource pool use standby unit config template", K(ret), K(arg));
2678LOG_USER_ERROR(OB_OP_NOT_ALLOW, "alter resource pool use stanby unit config template");
2679} else {
2680LOG_INFO("receive alter_resource_pool request", K(arg));
2681share::ObResourcePool pool;
2682pool.name_ = arg.pool_name_;
2683pool.unit_count_ = arg.unit_num_;
2684if (OB_FAIL(pool.zone_list_.assign(arg.zone_list_))) {
2685LOG_WARN("assign failed", K(ret));
2686} else if (OB_FAIL(unit_manager_.alter_resource_pool(
2687pool, arg.unit_, arg.delete_unit_id_array_))) {
2688LOG_WARN("alter_resource_pool failed", K(pool), K(arg), "resource unit", arg.unit_, K(ret));
2689int tmp_ret = OB_SUCCESS;
2690if (OB_TMP_FAIL(submit_reload_unit_manager_task())) {//ensure submit task all case
2691if (OB_CANCELED != tmp_ret) {
2692LOG_ERROR("fail to reload unit_mgr, please try 'alter system reload unit'", KR(ret), K(tmp_ret));
2693}
2694}
2695}
2696LOG_INFO("finish alter_resource_pool", K(arg), K(ret));
2697}
2698ROOTSERVICE_EVENT_ADD("root_service", "alter_resource_pool", K(ret), K(arg));
2699return ret;
2700}
2701
2702int ObRootService::drop_resource_pool(const obrpc::ObDropResourcePoolArg &arg)
2703{
2704int ret = OB_SUCCESS;
2705const bool if_exist = arg.if_exist_;
2706if (!inited_) {
2707ret = OB_NOT_INIT;
2708LOG_WARN("not init", K(ret));
2709} else if (!arg.is_valid()) {
2710ret = OB_MISS_ARGUMENT;
2711if (arg.pool_name_.empty()) {
2712LOG_USER_ERROR(OB_MISS_ARGUMENT, "resource pool name");
2713}
2714LOG_WARN("missing arg to drop resource pool", K(arg), K(ret));
2715} else {
2716LOG_INFO("receive drop_resource_pool request", K(arg));
2717if (OB_INVALID_ID != arg.pool_id_) {
2718if (OB_FAIL(unit_manager_.drop_resource_pool(arg.pool_id_, if_exist))) {
2719LOG_WARN("drop_resource_pool failed", "pool", arg.pool_id_, K(if_exist), KR(ret));
2720}
2721} else {
2722if (OB_FAIL(unit_manager_.drop_resource_pool(arg.pool_name_, if_exist))) {
2723LOG_WARN("drop_resource_pool failed", "pool", arg.pool_name_, K(if_exist), KR(ret));
2724}
2725}
2726
2727if (OB_FAIL(ret)) {
2728int mysql_error = -common::ob_mysql_errno(ret);
2729if (OB_TIMEOUT == ret || OB_TIMEOUT == mysql_error) {
2730int tmp_ret = OB_SUCCESS;
2731if (OB_SUCCESS != (tmp_ret = submit_reload_unit_manager_task())) {
2732if (OB_CANCELED != tmp_ret) {
2733LOG_ERROR("fail to reload unit_manager, please try 'alter system reload unit'", K(tmp_ret));
2734}
2735}
2736}
2737}
2738LOG_INFO("finish drop_resource_pool", K(arg), K(ret));
2739}
2740ROOTSERVICE_EVENT_ADD("root_service", "drop_resource_pool", K(ret), K(arg));
2741return ret;
2742}
2743
2744int ObRootService::check_tenant_in_alter_locality(
2745const uint64_t tenant_id,
2746bool &in_alter_locality)
2747{
2748int ret = OB_SUCCESS;
2749if (OB_UNLIKELY(!inited_)) {
2750ret = OB_NOT_INIT;
2751LOG_WARN("not init", K(ret));
2752} else if (OB_UNLIKELY(OB_INVALID_ID == tenant_id)) {
2753ret = OB_INVALID_ARGUMENT;
2754LOG_WARN("invalid argument", K(ret));
2755} else if (OB_FAIL(ddl_service_.check_tenant_in_alter_locality(tenant_id, in_alter_locality))) {
2756LOG_WARN("fail to check tenant in alter locality", K(ret));
2757} else {} // no more to do
2758return ret;
2759}
2760
2761int ObRootService::create_tenant(const ObCreateTenantArg &arg, UInt64 &tenant_id)
2762{
2763LOG_INFO("receive create tenant arg", K(arg), "timeout_ts", THIS_WORKER.get_timeout_ts());
2764int ret = OB_SUCCESS;
2765int tmp_ret = OB_SUCCESS;
2766bool compatible_with_clone_tenant = false;
2767const ObString &tenant_name = arg.tenant_schema_.get_tenant_name_str();
2768// when recovering table, it needs to create tmp tenant
2769const bool tmp_tenant = arg.is_tmp_tenant_for_recover_;
2770if (!inited_) {
2771ret = OB_NOT_INIT;
2772LOG_WARN("not init", KR(ret));
2773} else if (!tmp_tenant && OB_FAIL(ObResolverUtils::check_not_supported_tenant_name(tenant_name))) {
2774LOG_WARN("unsupported tenant name", KR(ret), K(tenant_name));
2775} else if (arg.is_clone_tenant()
2776&& OB_FAIL(ObShareUtil::check_compat_version_for_clone_tenant(
2777arg.source_tenant_id_,
2778compatible_with_clone_tenant))) {
2779LOG_WARN("fail to check compatible version with clone tenant", KR(ret), K(arg));
2780} else if (arg.is_clone_tenant() && !compatible_with_clone_tenant) {
2781ret = OB_OP_NOT_ALLOW;
2782LOG_WARN("create clone tenant with data version below 4.3 not allowed",
2783KR(ret), K(arg), K(compatible_with_clone_tenant));
2784LOG_USER_ERROR(OB_OP_NOT_ALLOW, "create clone tenant with data version below 4.3");
2785} else if (OB_FAIL(ddl_service_.create_tenant(arg, tenant_id))) {
2786LOG_WARN("fail to create tenant", KR(ret), K(arg));
2787if (OB_TMP_FAIL(submit_reload_unit_manager_task())) {
2788if (OB_CANCELED != tmp_ret) {
2789LOG_ERROR("fail to reload unit_mgr, please try 'alter system reload unit'", KR(ret), KR(tmp_ret));
2790}
2791}
2792}
2793LOG_INFO("finish create tenant", KR(ret), K(tenant_id), K(arg), "timeout_ts", THIS_WORKER.get_timeout_ts());
2794return ret;
2795}
2796
2797int ObRootService::create_tenant_end(const ObCreateTenantEndArg &arg)
2798{
2799LOG_DEBUG("receive create tenant end arg", K(arg));
2800int ret = OB_SUCCESS;
2801if (!inited_) {
2802ret = OB_NOT_INIT;
2803LOG_WARN("not init", K(ret));
2804} else if (!arg.is_valid()) {
2805ret = OB_INVALID_ARGUMENT;
2806LOG_WARN("invalid arg", K(ret));
2807} else if (OB_FAIL(ddl_service_.create_tenant_end(arg.tenant_id_))) {
2808LOG_WARN("fail to create tenant end", K(ret), K(arg));
2809} else {
2810LOG_INFO("success to create tenant end", K(ret), K(arg));
2811}
2812return ret;
2813}
2814
2815int ObRootService::commit_alter_tenant_locality(
2816const rootserver::ObCommitAlterTenantLocalityArg &arg)
2817{
2818int ret = OB_SUCCESS;
2819LOG_INFO("commit alter tenant locality", K(arg));
2820if (OB_UNLIKELY(!inited_)) {
2821ret = OB_NOT_INIT;
2822LOG_WARN("not init", K(ret));
2823} else if (!arg.is_valid()) {
2824ret = OB_INVALID_ARGUMENT;
2825LOG_WARN("invalid argument", K(ret), K(arg));
2826} else if (OB_FAIL(ddl_service_.commit_alter_tenant_locality(arg))) {
2827LOG_WARN("fail to commit alter tenant locality", K(ret));
2828} else {
2829LOG_INFO("commit alter tenant locality succeed", K(ret));
2830}
2831return ret;
2832}
2833
2834
2835int ObRootService::drop_tenant(const ObDropTenantArg &arg)
2836{
2837int ret = OB_SUCCESS;
2838if (!inited_) {
2839ret = OB_NOT_INIT;
2840LOG_WARN("not init", K(ret));
2841} else if (!arg.is_valid()) {
2842ret = OB_INVALID_ARGUMENT;
2843LOG_WARN("invalid arg", K(arg), K(ret));
2844} else if (OB_FAIL(ddl_service_.drop_tenant(arg))) {
2845LOG_WARN("ddl_service_ drop_tenant failed", K(arg), K(ret));
2846}
2847return ret;
2848}
2849
2850int ObRootService::flashback_tenant(const ObFlashBackTenantArg &arg)
2851{
2852int ret = OB_SUCCESS;
2853if (!inited_) {
2854ret = OB_NOT_INIT;
2855LOG_WARN("not init", K(ret));
2856} else if (!arg.is_valid()) {
2857ret = OB_INVALID_ARGUMENT;
2858LOG_WARN("invalid argument", K(arg), K(ret));
2859} else if (OB_FAIL(ObResolverUtils::check_not_supported_tenant_name(arg.new_tenant_name_))) {
2860LOG_WARN("unsupported tenant name", KR(ret), "new_tenant_name", arg.new_tenant_name_);
2861} else if (OB_FAIL(ddl_service_.flashback_tenant(arg))) {
2862LOG_WARN("failed to flash back tenant", K(ret));
2863}
2864LOG_INFO("flashback tenant success");
2865return ret;
2866}
2867
2868int ObRootService::purge_tenant(const ObPurgeTenantArg &arg)
2869{
2870int ret = OB_SUCCESS;
2871if (!inited_) {
2872ret = OB_NOT_INIT;
2873LOG_WARN("not init", K(ret));
2874} else if (!arg.is_valid()) {
2875ret = OB_INVALID_ARGUMENT;
2876LOG_WARN("invalid argument", K(arg), K(ret));
2877} else if (OB_FAIL(ddl_service_.purge_tenant(arg))) {
2878LOG_WARN("failed to purge tenant", K(ret));
2879}
2880LOG_INFO("purge tenant success");
2881return ret;
2882}
2883
2884int ObRootService::modify_tenant(const ObModifyTenantArg &arg)
2885{
2886LOG_DEBUG("receive modify tenant arg", K(arg));
2887int ret = OB_NOT_SUPPORTED;
2888if (!inited_) {
2889ret = OB_NOT_INIT;
2890LOG_WARN("not init", K(ret));
2891} else if (!arg.is_valid()) {
2892ret = OB_INVALID_ARGUMENT;
2893LOG_WARN("invalid arg", K(arg), K(ret));
2894} else if (OB_FAIL(ObResolverUtils::check_not_supported_tenant_name(arg.new_tenant_name_))) {
2895LOG_WARN("unsupported tenant name", KR(ret), "new_tenant_name", arg.new_tenant_name_);
2896} else if (OB_FAIL(ddl_service_.modify_tenant(arg))) {
2897LOG_WARN("ddl service modify tenant failed", K(arg), K(ret));
2898} else {
2899root_balancer_.wakeup();
2900}
2901// weak leader coordinator while modify primary zone
2902//if (OB_SUCC(ret)
2903// && arg.alter_option_bitset_.has_member(obrpc::ObModifyTenantArg::PRIMARY_ZONE)) {
2904// leader_coordinator_.signal();
2905//}
2906return ret;
2907}
2908
2909int ObRootService::lock_tenant(const obrpc::ObLockTenantArg &arg)
2910{
2911int ret = OB_SUCCESS;
2912LOG_INFO("receive lock tenant request", K(arg));
2913if (!inited_) {
2914ret = OB_NOT_INIT;
2915LOG_WARN("not init", K(ret));
2916} else if (!arg.is_valid()) {
2917ret = OB_INVALID_ARGUMENT;
2918LOG_WARN("invalid arg", K(arg), K(ret));
2919} else if (OB_FAIL(ddl_service_.lock_tenant(arg.tenant_name_, arg.is_locked_))) {
2920LOG_WARN("ddl_service lock_tenant failed", K(arg), K(ret));
2921}
2922LOG_INFO("finish lock tenant", K(arg), K(ret));
2923return ret;
2924}
2925
2926int ObRootService::add_system_variable(const ObAddSysVarArg &arg)
2927{
2928int ret = OB_SUCCESS;
2929if (!inited_) {
2930ret = OB_NOT_INIT;
2931LOG_WARN("not init", K(ret));
2932} else if (OB_UNLIKELY(!arg.is_valid())) {
2933ret = OB_INVALID_ARGUMENT;
2934LOG_WARN("invalid sysvar arg", K(arg));
2935} else if (OB_FAIL(ddl_service_.add_system_variable(arg))) {
2936LOG_WARN("add system variable failed", K(ret));
2937}
2938return ret;
2939}
2940
2941int ObRootService::modify_system_variable(const obrpc::ObModifySysVarArg &arg)
2942{
2943int ret = OB_SUCCESS;
2944if (!inited_) {
2945ret = OB_NOT_INIT;
2946LOG_WARN("not init", K(ret));
2947} else if (OB_UNLIKELY(!arg.is_valid())) {
2948ret = OB_INVALID_ARGUMENT;
2949LOG_WARN("invalid sysvar arg", K(arg));
2950} else if (OB_FAIL(ddl_service_.modify_system_variable(arg))) {
2951LOG_WARN("modify system variable failed", K(ret));
2952}
2953return ret;
2954}
2955
2956int ObRootService::create_database(const ObCreateDatabaseArg &arg, UInt64 &db_id)
2957{
2958int ret = OB_SUCCESS;
2959if (!inited_) {
2960ret = OB_NOT_INIT;
2961LOG_WARN("not init", K(ret));
2962} else if (!arg.is_valid()) {
2963ret = OB_INVALID_ARGUMENT;
2964LOG_WARN("invalid arg", K(arg), K(ret));
2965} else {
2966ObDatabaseSchema copied_db_schema = arg.database_schema_;
2967if (OB_FAIL(ddl_service_.create_database(arg.if_not_exist_,
2968copied_db_schema, &arg.ddl_stmt_str_))) {
2969LOG_WARN("create_database failed", "if_not_exist", arg.if_not_exist_,
2970K(copied_db_schema), "ddl_stmt_str", arg.ddl_stmt_str_, K(ret));
2971} else {
2972db_id = copied_db_schema.get_database_id();
2973}
2974}
2975return ret;
2976}
2977
2978int ObRootService::alter_database(const ObAlterDatabaseArg &arg)
2979{
2980int ret = OB_SUCCESS;
2981if (!inited_) {
2982ret = OB_NOT_INIT;
2983LOG_WARN("not init", K(ret));
2984} else if (!arg.is_valid()) {
2985ret = OB_INVALID_ARGUMENT;
2986LOG_WARN("invalid arg", K(arg), K(ret));
2987} else if (common::STANDBY_CLUSTER == ObClusterInfoGetter::get_cluster_role_v2()) {
2988const int64_t tenant_id = arg.database_schema_.get_tenant_id();
2989ObSchemaGetterGuard schema_guard;
2990uint64_t database_id = OB_INVALID_ID;
2991if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
2992tenant_id, schema_guard))) {
2993LOG_WARN("get_schema_guard with version in inner table failed", K(ret), K(tenant_id));
2994} else if (OB_FAIL(schema_guard.get_database_id(tenant_id,
2995arg.database_schema_.get_database_name_str(), database_id))) {
2996LOG_WARN("failed to get database id", K(ret), K(tenant_id), K(arg));
2997}
2998}
2999if (OB_FAIL(ret)) {
3000} else if (OB_FAIL(ddl_service_.alter_database(arg))) {
3001LOG_WARN("alter database failed", K(arg), K(ret));
3002}
3003return ret;
3004}
3005
3006int ObRootService::create_tablegroup(const ObCreateTablegroupArg &arg, UInt64 &tg_id)
3007{
3008LOG_INFO("receive create tablegroup arg", K(arg));
3009int ret = OB_SUCCESS;
3010if (!inited_) {
3011ret = OB_NOT_INIT;
3012LOG_WARN("not init", K(ret));
3013} else if (!arg.is_valid()) {
3014ret = OB_INVALID_ARGUMENT;
3015LOG_WARN("invalid arg", K(arg), K(ret));
3016} else {
3017ObTablegroupSchema copied_tg_schema;
3018if (OB_FAIL(copied_tg_schema.assign(arg.tablegroup_schema_))) {
3019LOG_WARN("failed to assign tablegroup schema", K(ret), K(arg));
3020} else if (OB_FAIL(ddl_service_.create_tablegroup(
3021arg.if_not_exist_, copied_tg_schema, &arg.ddl_stmt_str_))) {
3022LOG_WARN("create_tablegroup failed", "if_not_exist", arg.if_not_exist_,
3023K(copied_tg_schema), "ddl_stmt_str", arg.ddl_stmt_str_, K(ret));
3024} else {
3025tg_id = copied_tg_schema.get_tablegroup_id();
3026}
3027}
3028return ret;
3029}
3030
3031int ObRootService::handle_security_audit(const ObSecurityAuditArg &arg)
3032{
3033int ret = OB_SUCCESS;
3034if (OB_UNLIKELY(!inited_)) {
3035ret = OB_NOT_INIT;
3036LOG_WARN("not init", K(ret));
3037} else if (OB_FAIL(ddl_service_.handle_security_audit(arg))) {
3038LOG_WARN("handle audit request failed", K(ret), K(arg));
3039}
3040return ret;
3041}
3042
3043
3044int ObRootService::parallel_ddl_pre_check_(const uint64_t tenant_id)
3045{
3046int ret = OB_SUCCESS;
3047bool is_dropped = false;
3048if (OB_UNLIKELY(!inited_)) {
3049ret = OB_NOT_INIT;
3050LOG_WARN("not init", KR(ret));
3051} else if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)) {
3052ret = OB_INVALID_ARGUMENT;
3053LOG_WARN("invalid tenant_id", KR(ret), K(tenant_id));
3054} else if (OB_FAIL(schema_service_->check_if_tenant_has_been_dropped(tenant_id, is_dropped))) {
3055LOG_WARN("fail to check if tenant has been dropped", KR(ret), K(tenant_id));
3056} else if (is_dropped) {
3057ret = OB_TENANT_HAS_BEEN_DROPPED;
3058LOG_WARN("tenant has been dropped", KR(ret), K(tenant_id));
3059} else if (!schema_service_->is_tenant_refreshed(tenant_id)) {
3060// use this err to trigger DDL retry and release current thread.
3061ret = OB_ERR_PARALLEL_DDL_CONFLICT;
3062LOG_WARN("tenant' schema not refreshed yet, need retry", KR(ret), K(tenant_id));
3063}
3064return ret;
3065}
3066
3067int ObRootService::parallel_create_table(const ObCreateTableArg &arg, ObCreateTableRes &res)
3068{
3069LOG_TRACE("receive create table arg", K(arg));
3070int64_t begin_time = ObTimeUtility::current_time();
3071const uint64_t tenant_id = arg.exec_tenant_id_;
3072int ret = OB_SUCCESS;
3073if (OB_UNLIKELY(!inited_)) {
3074ret = OB_NOT_INIT;
3075LOG_WARN("not init", KR(ret));
3076} else if (OB_UNLIKELY(!arg.is_valid())) {
3077ret = OB_INVALID_ARGUMENT;
3078LOG_WARN("invalid arg", KR(ret), K(arg));
3079} else if (OB_FAIL(parallel_ddl_pre_check_(tenant_id))) {
3080LOG_WARN("pre check failed before parallel ddl execute", KR(ret), K(tenant_id));
3081} else if (arg.schema_.is_view_table()) {
3082ObCreateViewHelper create_view_helper(schema_service_, tenant_id, arg, res);
3083if (OB_FAIL(create_view_helper.init(ddl_service_))) {
3084LOG_WARN("fail to init create view helper", KR(ret), K(tenant_id));
3085} else if (OB_FAIL(create_view_helper.execute())) {
3086LOG_WARN("fail to execute create view", KR(ret), K(tenant_id));
3087}
3088} else {
3089ObCreateTableHelper create_table_helper(schema_service_, tenant_id, arg, res);
3090if (OB_FAIL(create_table_helper.init(ddl_service_))) {
3091LOG_WARN("fail to init create table helper", KR(ret), K(tenant_id));
3092} else if (OB_FAIL(create_table_helper.execute())) {
3093LOG_WARN("fail to execute create table", KR(ret), K(tenant_id));
3094}
3095}
3096int64_t cost = ObTimeUtility::current_time() - begin_time;
3097LOG_TRACE("finish create table", KR(ret), K(arg), K(cost));
3098ROOTSERVICE_EVENT_ADD("ddl scheduler", "parallel create table",
3099K(tenant_id),
3100"ret", ret,
3101"trace_id", *ObCurTraceId::get_trace_id(),
3102"table_id", res.table_id_,
3103"schema_version", res.schema_version_,
3104K(cost));
3105return ret;
3106}
3107
3108int ObRootService::gen_container_table_schema_(const ObCreateTableArg &arg,
3109ObSchemaGetterGuard &schema_guard,
3110ObTableSchema &mv_table_schema,
3111ObArray<ObTableSchema> &table_schemas)
3112{
3113int ret = OB_SUCCESS;
3114SMART_VAR(ObTableSchema, container_table_schema) {
3115if (arg.mv_ainfo_.count() >= 2) {
3116ret = OB_ERR_UNEXPECTED;
3117LOG_WARN("container table should be less than two", KR(ret), K(arg.mv_ainfo_.count()));
3118}
3119
3120for (int64_t i = 0; OB_SUCC(ret) && i < arg.mv_ainfo_.count(); i ++) {
3121container_table_schema.reset();
3122char buf[OB_MAX_TABLE_NAME_LENGTH];
3123memset(buf, 0, OB_MAX_TABLE_NAME_LENGTH);
3124
3125if (OB_SUCC(ret)) {
3126if (OB_FAIL(container_table_schema.assign(arg.mv_ainfo_.at(i).container_table_schema_))) {
3127LOG_WARN("fail to assign index schema", KR(ret));
3128} else if (OB_FAIL(databuff_printf(buf, OB_MAX_TABLE_NAME_LENGTH, "__mv_container_%ld", mv_table_schema.get_table_id()))) {
3129LOG_WARN("fail to print table name", KR(ret));
3130} else if (OB_FAIL(container_table_schema.set_table_name(buf))) {
3131LOG_WARN("fail to set table_name", KR(ret));
3132} else {
3133container_table_schema.set_database_id(mv_table_schema.get_database_id());
3134}
3135}
3136
3137if (OB_SUCC(ret)) {
3138ObArray<ObSchemaType> conflict_schema_types;
3139if (!arg.is_alter_view_
3140&& OB_FAIL(schema_guard.check_oracle_object_exist(container_table_schema.get_tenant_id(),
3141container_table_schema.get_database_id(), container_table_schema.get_table_name_str(),
3142TABLE_SCHEMA, INVALID_ROUTINE_TYPE, arg.if_not_exist_, conflict_schema_types))) {
3143LOG_WARN("fail to check oracle_object exist", K(ret), K(container_table_schema));
3144} else if (conflict_schema_types.count() > 0) {
3145ret = OB_ERR_EXIST_OBJECT;
3146LOG_WARN("Name is already used by an existing object",
3147K(ret), K(container_table_schema), K(conflict_schema_types));
3148}
3149}
3150if (OB_SUCC(ret)) { // check same table_name
3151bool table_exist = false;
3152bool object_exist = false;
3153uint64_t synonym_id = OB_INVALID_ID;
3154ObSchemaGetterGuard::CheckTableType check_type = ObSchemaGetterGuard::ALL_NON_HIDDEN_TYPES;
3155
3156if (FAILEDx(schema_guard.check_synonym_exist_with_name(container_table_schema.get_tenant_id(),
3157container_table_schema.get_database_id(),
3158container_table_schema.get_table_name_str(),
3159object_exist,
3160synonym_id))) {
3161LOG_WARN("fail to check synonym exist", K(container_table_schema), KR(ret));
3162} else if (object_exist) {
3163ret = OB_ERR_EXIST_OBJECT;
3164LOG_WARN("Name is already used by an existing object", K(container_table_schema), KR(ret));
3165} else if (OB_FAIL(schema_guard.check_table_exist(container_table_schema.get_tenant_id(),
3166container_table_schema.get_database_id(),
3167container_table_schema.get_table_name_str(),
3168false, /*is index*/
3169check_type,
3170table_exist))) {
3171LOG_WARN("check table exist failed", KR(ret), K(container_table_schema));
3172} else if (table_exist) {
3173ret = OB_ERR_TABLE_EXIST;
3174LOG_WARN("table exist", KR(ret), K(container_table_schema), K(arg.if_not_exist_));
3175}
3176}
3177
3178if (OB_SUCC(ret)) {
3179if (OB_FAIL(ddl_service_.generate_schema(arg, container_table_schema))) {
3180LOG_WARN("fail to generate container table schema", KR(ret));
3181} else {
3182//table_schema.get_view_schema().set_container_table_id(container_table_schema.get_table_id());
3183mv_table_schema.set_data_table_id(container_table_schema.get_table_id());
3184}
3185}
3186if (OB_SUCC(ret)) {
3187if (OB_FAIL(table_schemas.push_back(container_table_schema))) {
3188LOG_WARN("push_back failed", KR(ret));
3189}
3190}
3191}
3192}
3193return ret;
3194}
3195
3196int ObRootService::create_table(const ObCreateTableArg &arg, ObCreateTableRes &res)
3197{
3198LOG_DEBUG("receive create table arg", K(arg));
3199int ret = OB_SUCCESS;
3200int64_t begin_time = ObTimeUtility::current_time();
3201LOG_INFO("receive create table ddl", K(begin_time));
3202RS_TRACE(create_table_begin);
3203if (!inited_) {
3204ret = OB_NOT_INIT;
3205LOG_WARN("not init", K(ret));
3206} else if (!arg.is_valid()) {
3207ret = OB_INVALID_ARGUMENT;
3208LOG_WARN("invalid arg", K(arg), K(ret));
3209} else {
3210ObArray<ObTableSchema> table_schemas;
3211ObSchemaGetterGuard schema_guard;
3212const ObDatabaseSchema *db_schema = NULL;
3213schema_guard.set_session_id(arg.schema_.get_session_id());
3214ObSchemaService *schema_service = schema_service_->get_schema_service();
3215ObTableSchema table_schema;
3216bool is_oracle_mode = false;
3217int64_t ddl_task_id = 0;
3218// generate base table schema
3219if (OB_FAIL(table_schema.assign(arg.schema_))) {
3220LOG_WARN("fail to assign schema", K(ret));
3221} else if (OB_ISNULL(schema_service)) {
3222ret = OB_ERR_UNEXPECTED;
3223LOG_WARN("schema_service is null", KP(schema_service), K(ret));
3224} else if (OB_FAIL(generate_table_schema_in_tenant_space(arg, table_schema))) {
3225LOG_WARN("fail to generate table schema in tenant space", K(ret), K(arg));
3226} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
3227table_schema.get_tenant_id(), schema_guard))) {
3228LOG_WARN("get_schema_guard with version in inner table failed", K(ret));
3229} else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) {
3230LOG_WARN("check parallel ddl conflict failed", K(ret));
3231} else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(
3232table_schema.get_tenant_id(), is_oracle_mode))) {
3233LOG_WARN("fail to check is oracle mode", K(ret));
3234} else if (OB_INVALID_ID == table_schema.get_database_id()) {
3235ObString database_name = arg.db_name_;
3236if (OB_FAIL(schema_guard.get_database_schema(table_schema.get_tenant_id(),
3237database_name,
3238db_schema))) {
3239LOG_WARN("get databas schema failed", K(arg));
3240} else if (OB_ISNULL(db_schema)) {
3241ret = OB_ERR_BAD_DATABASE;
3242LOG_USER_ERROR(OB_ERR_BAD_DATABASE, database_name.length(), database_name.ptr());
3243} else if (!arg.is_inner_ && db_schema->is_in_recyclebin()) {
3244ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
3245LOG_WARN("Can't not create table of db in recyclebin", K(ret), K(arg), K(*db_schema));
3246} else if (OB_INVALID_ID == db_schema->get_database_id()) {
3247ret = OB_ERR_BAD_DATABASE;
3248LOG_WARN("database id is invalid", "tenant_id",
3249table_schema.get_tenant_id(), K(database_name), K(*db_schema), K(ret));
3250} else {
3251table_schema.set_database_id(db_schema->get_database_id());
3252}
3253} else {
3254// for view, database_id must be filled
3255}
3256if (OB_SUCC(ret)) {
3257bool table_exist = false;
3258bool object_exist = false;
3259uint64_t synonym_id = OB_INVALID_ID;
3260ObSchemaGetterGuard::CheckTableType check_type = ObSchemaGetterGuard::ALL_NON_HIDDEN_TYPES;
3261if (table_schema.is_mysql_tmp_table()) {
3262check_type = ObSchemaGetterGuard::TEMP_TABLE_TYPE;
3263} else if (0 == table_schema.get_session_id()) {
3264//if session_id <> 0 during create table, need to exclude the existence of temporary table with the same table_name,
3265//if there is, need to throw error.
3266check_type = ObSchemaGetterGuard::NON_TEMP_WITH_NON_HIDDEN_TABLE_TYPE;
3267}
3268if (OB_SUCC(ret)) {
3269ObArray<ObSchemaType> conflict_schema_types;
3270if (!arg.is_alter_view_
3271&& OB_FAIL(schema_guard.check_oracle_object_exist(table_schema.get_tenant_id(),
3272table_schema.get_database_id(), table_schema.get_table_name_str(),
3273TABLE_SCHEMA, INVALID_ROUTINE_TYPE, arg.if_not_exist_, conflict_schema_types))) {
3274LOG_WARN("fail to check oracle_object exist", K(ret), K(table_schema));
3275} else if (conflict_schema_types.count() > 0) {
3276ret = OB_ERR_EXIST_OBJECT;
3277LOG_WARN("Name is already used by an existing object",
3278K(ret), K(table_schema), K(conflict_schema_types));
3279}
3280}
3281if (FAILEDx(schema_guard.check_synonym_exist_with_name(table_schema.get_tenant_id(),
3282table_schema.get_database_id(),
3283table_schema.get_table_name_str(),
3284object_exist,
3285synonym_id))) {
3286LOG_WARN("fail to check synonym exist", K(table_schema), K(ret));
3287} else if (object_exist) {
3288ret = OB_ERR_EXIST_OBJECT;
3289LOG_WARN("Name is already used by an existing object", K(table_schema), K(ret));
3290} else if (OB_FAIL(schema_guard.check_table_exist(table_schema.get_tenant_id(),
3291table_schema.get_database_id(),
3292table_schema.get_table_name_str(),
3293false, /*is index*/
3294check_type,
3295table_exist))) {
3296LOG_WARN("check table exist failed", K(ret), K(table_schema));
3297} else if (table_exist) {
3298if (table_schema.is_view_table() && arg.if_not_exist_) {
3299//create or replace view ...
3300//create user table will drop the old view and recreate it in trans
3301const ObSimpleTableSchemaV2 *simple_table_schema = nullptr;
3302if (OB_FAIL(schema_guard.get_simple_table_schema(
3303table_schema.get_tenant_id(),
3304table_schema.get_database_id(),
3305table_schema.get_table_name_str(),
3306false, /*is index*/
3307simple_table_schema))) {
3308LOG_WARN("failed to get table schema", K(ret));
3309} else if (OB_ISNULL(simple_table_schema)) {
3310ret = OB_ERR_UNEXPECTED;
3311LOG_WARN("simple_table_schema is null", K(ret));
3312} else if (simple_table_schema->get_table_type() == SYSTEM_VIEW
3313|| simple_table_schema->get_table_type() == USER_VIEW
3314|| simple_table_schema->get_table_type() == MATERIALIZED_VIEW) {
3315ret = OB_SUCCESS;
3316} else {
3317if (is_oracle_mode) {
3318ret = OB_ERR_EXIST_OBJECT;
3319LOG_WARN("name is already used by an existing object",
3320K(ret), K(table_schema.get_table_name_str()));
3321} else { // mysql mode
3322const ObDatabaseSchema *db_schema = nullptr;
3323if (OB_FAIL(schema_guard.get_database_schema(
3324table_schema.get_tenant_id(),
3325table_schema.get_database_id(),
3326db_schema))) {
3327LOG_WARN("get db schema failed", K(ret), K(table_schema.get_database_id()));
3328} else if (OB_ISNULL(db_schema)) {
3329ret = OB_ERR_UNEXPECTED;
3330LOG_WARN("db schema is null", K(ret));
3331} else {
3332ret = OB_ERR_WRONG_OBJECT;
3333LOG_USER_ERROR(OB_ERR_WRONG_OBJECT,
3334to_cstring(db_schema->get_database_name_str()),
3335to_cstring(table_schema.get_table_name_str()), "VIEW");
3336LOG_WARN("table exist", K(ret), K(table_schema));
3337}
3338}
3339}
3340} else {
3341ret = OB_ERR_TABLE_EXIST;
3342LOG_WARN("table exist", K(ret), K(table_schema), K(arg.if_not_exist_));
3343}
3344} else if (!table_exist && table_schema.is_view_table() && arg.is_alter_view_) {
3345// the origin view must exist while alter view
3346const ObSimpleDatabaseSchema *simple_db_schema = nullptr;
3347if (OB_FAIL(schema_guard.get_database_schema(
3348table_schema.get_tenant_id(),
3349table_schema.get_database_id(),
3350simple_db_schema))) {
3351LOG_WARN("get db schema failed", K(ret), K(table_schema.get_database_id()));
3352} else if (OB_ISNULL(simple_db_schema)) {
3353ret = OB_ERR_UNEXPECTED;
3354LOG_WARN("db schema is null", K(ret));
3355} else {
3356ret = OB_TABLE_NOT_EXIST;
3357LOG_USER_ERROR(OB_TABLE_NOT_EXIST,
3358to_cstring(simple_db_schema->get_database_name_str()),
3359to_cstring(table_schema.get_table_name_str()));
3360LOG_WARN("table not exist", K(ret), K(table_schema));
3361}
3362}
3363}
3364RS_TRACE(generate_schema_start);
3365//bool can_hold_new_table = false;
3366common::hash::ObHashMap<ObString, uint64_t> mock_fk_parent_table_map; // name, count
3367ObArray<ObMockFKParentTableSchema> tmp_mock_fk_parent_table_schema_array;
3368ObArray<ObMockFKParentTableSchema> mock_fk_parent_table_schema_array;
3369if (OB_FAIL(ret)) {
3370//do nothing
3371} else if (OB_FAIL(mock_fk_parent_table_map.create(16, "MockFKParentTbl"))) {
3372LOG_WARN("fail to create mock_fk_parent_table_map", K(ret));
3373} else if (OB_FAIL(ddl_service_.generate_schema(arg, table_schema))) {
3374LOG_WARN("generate_schema for table failed", K(ret));
3375//} else if (OB_FAIL(check_rs_capacity(table_schema, can_hold_new_table))) {
3376// LOG_WARN("fail to check rs capacity", K(ret), K(table_schema));
3377//} else if (!can_hold_new_table) {
3378// ret = OB_PARTITION_CNT_REACH_ROOTSERVER_LIMIT;
3379// LOG_WARN("reach rs's limits, rootserver can only hold limited replicas");
3380} else if (OB_FAIL(table_schemas.push_back(table_schema))) {
3381LOG_WARN("push_back failed", K(ret));
3382} else if (OB_FAIL(gen_container_table_schema_(arg, schema_guard, table_schema, table_schemas))) {
3383LOG_WARN("fail to gen container table schema", KR(ret));
3384}
3385
3386if (OB_SUCC(ret)) {
3387RS_TRACE(generate_schema_index);
3388res.table_id_ = table_schema.get_table_id();
3389// generate index schemas
3390ObIndexBuilder index_builder(ddl_service_);
3391ObTableSchema index_schema;
3392for (int64_t i = 0; OB_SUCC(ret) && i < arg.index_arg_list_.size(); ++i) {
3393index_schema.reset();
3394ObCreateIndexArg &index_arg = const_cast<ObCreateIndexArg&>(arg.index_arg_list_.at(i));
3395//if we pass the table_schema argument, the create_index_arg can not set database_name
3396//and table_name, which will used from get data table schema in generate_schema
3397if (!index_arg.index_schema_.is_partitioned_table()
3398&& !table_schema.is_partitioned_table()) {
3399if (INDEX_TYPE_NORMAL_GLOBAL == index_arg.index_type_) {
3400index_arg.index_type_ = INDEX_TYPE_NORMAL_GLOBAL_LOCAL_STORAGE;
3401} else if (INDEX_TYPE_UNIQUE_GLOBAL == index_arg.index_type_) {
3402index_arg.index_type_ = INDEX_TYPE_UNIQUE_GLOBAL_LOCAL_STORAGE;
3403} else if (INDEX_TYPE_SPATIAL_GLOBAL == index_arg.index_type_) {
3404index_arg.index_type_ = INDEX_TYPE_SPATIAL_GLOBAL_LOCAL_STORAGE;
3405}
3406}
3407// the global index has generated column schema during resolve, RS no need to generate index schema,
3408// just assign column schema
3409if (INDEX_TYPE_NORMAL_GLOBAL == index_arg.index_type_
3410|| INDEX_TYPE_UNIQUE_GLOBAL == index_arg.index_type_
3411|| INDEX_TYPE_SPATIAL_GLOBAL == index_arg.index_type_) {
3412if (OB_FAIL(index_schema.assign(index_arg.index_schema_))) {
3413LOG_WARN("fail to assign schema", K(ret));
3414}
3415}
3416const bool global_index_without_column_info = false;
3417ObSEArray<ObColumnSchemaV2 *, 1> gen_columns;
3418ObIAllocator *allocator = index_arg.index_schema_.get_allocator();
3419if (OB_FAIL(ret)) {
3420} else if (OB_ISNULL(allocator)) {
3421ret = OB_ERR_UNEXPECTED;
3422LOG_WARN("invalid allocator", K(ret));
3423} else if (OB_FAIL(ObIndexBuilderUtil::adjust_expr_index_args(index_arg, table_schema, *allocator, gen_columns))) {
3424LOG_WARN("fail to adjust expr index args", K(ret));
3425} else if (OB_FAIL(index_builder.generate_schema(index_arg,
3426table_schema,
3427global_index_without_column_info,
3428true, /*generate_id*/
3429index_schema))) {
3430LOG_WARN("generate_schema for index failed", K(index_arg), K(table_schema), K(ret));
3431}
3432if (OB_SUCC(ret)) {
3433uint64_t new_table_id = OB_INVALID_ID;
3434if (OB_FAIL(schema_service->fetch_new_table_id(table_schema.get_tenant_id(), new_table_id))) {
3435LOG_WARN("failed to fetch_new_table_id", "tenant_id", table_schema.get_tenant_id(), K(ret));
3436} else {
3437index_schema.set_table_id(new_table_id);
3438//index_schema.set_data_table_id(table_id);
3439if (OB_FAIL(table_schemas.push_back(index_schema))) {
3440LOG_WARN("push_back failed", K(ret));
3441}
3442}
3443}
3444}
3445RS_TRACE(generate_schema_lob);
3446if (OB_FAIL(ret) || table_schema.is_view_table() || table_schema.is_external_table()) {
3447// do nothing
3448} else if (OB_FAIL(ddl_service_.build_aux_lob_table_schema_if_need(table_schema, table_schemas))) {
3449LOG_WARN("fail to build_aux_lob_table_schema_if_need", K(ret), K(table_schema));
3450}
3451if (OB_SUCC(ret)) {
3452for (int64_t i = 0; OB_SUCC(ret) && i < arg.foreign_key_arg_list_.count(); i++) {
3453const ObCreateForeignKeyArg &foreign_key_arg = arg.foreign_key_arg_list_.at(i);
3454ObForeignKeyInfo foreign_key_info;
3455// check for duplicate constraint names of foregin key
3456if (foreign_key_arg.foreign_key_name_.empty()) {
3457ret = OB_ERR_UNEXPECTED;
3458LOG_WARN("fk name is empty", K(ret));
3459} else {
3460bool is_foreign_key_name_exist = true;
3461if (OB_FAIL(ddl_service_.check_constraint_name_is_exist(
3462schema_guard, table_schema, foreign_key_arg.foreign_key_name_, true, is_foreign_key_name_exist))) {
3463LOG_WARN("fail to check foreign key name is exist or not", K(ret), K(foreign_key_arg.foreign_key_name_));
3464} else if(is_foreign_key_name_exist) {
3465if (is_oracle_mode) {
3466ret = OB_ERR_CONSTRAINT_NAME_DUPLICATE;
3467LOG_WARN("fk name is duplicate", K(ret), K(foreign_key_arg.foreign_key_name_));
3468} else { // mysql mode
3469ret = OB_ERR_DUP_KEY;
3470LOG_USER_ERROR(OB_ERR_DUP_KEY,
3471table_schema.get_table_name_str().length(),
3472table_schema.get_table_name_str().ptr());
3473}
3474}
3475}
3476// end of check for duplicate constraint names of foregin key
3477const ObTableSchema *parent_schema = NULL;
3478if (OB_SUCC(ret)) {
3479// get parent table schema.
3480// TODO: is it necessory to determine whether it is case sensitive by check sys variable
3481// check whether it belongs to self reference, if so, the parent schema is child schema.
3482if (0 == foreign_key_arg.parent_table_.case_compare(table_schema.get_table_name_str())
3483&& 0 == foreign_key_arg.parent_database_.case_compare(arg.db_name_)) {
3484parent_schema = &table_schema;
3485if (CONSTRAINT_TYPE_PRIMARY_KEY == foreign_key_arg.ref_cst_type_) {
3486if (is_oracle_mode) {
3487for (ObTableSchema::const_constraint_iterator iter = parent_schema->constraint_begin(); iter != parent_schema->constraint_end(); ++iter) {
3488if (CONSTRAINT_TYPE_PRIMARY_KEY == (*iter)->get_constraint_type()) {
3489foreign_key_info.ref_cst_type_ = CONSTRAINT_TYPE_PRIMARY_KEY;
3490foreign_key_info.ref_cst_id_ = (*iter)->get_constraint_id();
3491break;
3492}
3493}
3494} else {
3495foreign_key_info.ref_cst_type_ = CONSTRAINT_TYPE_PRIMARY_KEY;
3496foreign_key_info.ref_cst_id_ = common::OB_INVALID_ID;
3497}
3498} else if (CONSTRAINT_TYPE_UNIQUE_KEY == foreign_key_arg.ref_cst_type_) {
3499if (OB_FAIL(ddl_service_.get_uk_cst_id_for_self_ref(table_schemas, foreign_key_arg, foreign_key_info))) {
3500LOG_WARN("failed to get uk cst id for self ref", K(ret), K(foreign_key_arg));
3501}
3502} else {
3503ret = OB_ERR_UNEXPECTED;
3504LOG_WARN("invalid foreign key ref cst type", K(ret), K(foreign_key_arg));
3505}
3506} else if (OB_FAIL(schema_guard.get_table_schema(table_schema.get_tenant_id(),
3507foreign_key_arg.parent_database_,
3508foreign_key_arg.parent_table_,
3509false, parent_schema))) {
3510LOG_WARN("failed to get parent table schema", K(ret), K(foreign_key_arg));
3511} else {
3512foreign_key_info.ref_cst_type_ = foreign_key_arg.ref_cst_type_;
3513foreign_key_info.ref_cst_id_ = foreign_key_arg.ref_cst_id_;
3514}
3515}
3516const ObMockFKParentTableSchema *tmp_mock_fk_parent_table_ptr = NULL;
3517ObMockFKParentTableSchema mock_fk_parent_table_schema;
3518if (OB_SUCC(ret)) {
3519if (foreign_key_arg.is_parent_table_mock_) {
3520uint64_t dup_name_mock_fk_parent_table_count = 0;
3521if (NULL != parent_schema) {
3522ret = OB_ERR_PARALLEL_DDL_CONFLICT;
3523LOG_WARN("the mock parent table is conflict with the real parent table, need retry",
3524K(ret), K(foreign_key_arg), K(parent_schema->get_table_id()));
3525} else if (OB_FAIL(mock_fk_parent_table_map.get_refactored(foreign_key_arg.parent_table_, dup_name_mock_fk_parent_table_count))) {
3526if (OB_HASH_NOT_EXIST == ret) {
3527ret = OB_SUCCESS;
3528if (OB_FAIL(mock_fk_parent_table_map.set_refactored(foreign_key_arg.parent_table_, ++dup_name_mock_fk_parent_table_count))) {
3529LOG_WARN("failed to insert into mock_fk_parent_table_map", K(ret), K(foreign_key_arg), K(dup_name_mock_fk_parent_table_count));
3530}
3531} else {
3532LOG_WARN("get_refactored from mock_fk_parent_table_map failed", K(ret), K(foreign_key_arg));
3533}
3534} else {
3535//already had dup name mock_fk_parent_table in tmp_mock_fk_parent_table_schema_array
3536int64_t count = 0;
3537for (int64_t i = 0; i < tmp_mock_fk_parent_table_schema_array.count(); ++i) {
3538if (0 == tmp_mock_fk_parent_table_schema_array.at(i).get_mock_fk_parent_table_name().case_compare(foreign_key_arg.parent_table_)) {
3539if (++count == dup_name_mock_fk_parent_table_count) {
3540tmp_mock_fk_parent_table_ptr = &tmp_mock_fk_parent_table_schema_array.at(i);
3541break;
3542}
3543}
3544}
3545if (OB_ISNULL(tmp_mock_fk_parent_table_ptr)) {
3546ret = OB_ERR_UNEXPECTED;
3547LOG_WARN("tmp_mock_fk_parent_table_ptr is null", K(ret), K(foreign_key_arg), K(tmp_mock_fk_parent_table_schema_array));
3548} else if (OB_FAIL(mock_fk_parent_table_map.set_refactored(foreign_key_arg.parent_table_, ++dup_name_mock_fk_parent_table_count, true/*overwrite*/))) {
3549LOG_WARN("failed to insert into mock_fk_parent_table_map", K(ret), K(foreign_key_arg), K(dup_name_mock_fk_parent_table_count));
3550}
3551}
3552if (OB_FAIL(ret)) {
3553} else if (OB_FAIL(ddl_service_.gen_mock_fk_parent_table_for_create_fk(
3554schema_guard, table_schema.get_tenant_id(), foreign_key_arg, tmp_mock_fk_parent_table_ptr, foreign_key_info, mock_fk_parent_table_schema))) {
3555LOG_WARN("failed to generate_mock_fk_parent_table_schema", K(ret), K(table_schema.get_tenant_id()), K(foreign_key_arg));
3556}
3557} else if (OB_ISNULL(parent_schema)) {
3558ret = OB_TABLE_NOT_EXIST;
3559LOG_WARN("parent table is not exist", K(ret), K(foreign_key_arg));
3560} else if (false == parent_schema->is_tmp_table()
3561&& 0 != parent_schema->get_session_id()
3562&& OB_INVALID_ID != schema_guard.get_session_id()) {
3563ret = OB_TABLE_NOT_EXIST;
3564LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(foreign_key_arg.parent_database_), to_cstring(foreign_key_arg.parent_table_));
3565} else if (!arg.is_inner_ && parent_schema->is_in_recyclebin()) {
3566ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
3567LOG_WARN("parent table is in recyclebin", K(ret), K(foreign_key_arg));
3568} else if (parent_schema->get_table_id() != table_schema.get_table_id()) {
3569// no need to update sync_versin_for_cascade_table while the refrence table is itself
3570if (OB_FAIL(table_schema.add_depend_table_id(parent_schema->get_table_id()))) {
3571LOG_WARN("failed to add depend table id", K(ret), K(foreign_key_arg));
3572}
3573}
3574}
3575// get child column schema.
3576if (OB_SUCC(ret)) {
3577foreign_key_info.child_table_id_ = res.table_id_;
3578foreign_key_info.parent_table_id_ = foreign_key_arg.is_parent_table_mock_ ? mock_fk_parent_table_schema.get_mock_fk_parent_table_id() : parent_schema->get_table_id();
3579for (int64_t j = 0; OB_SUCC(ret) && j < foreign_key_arg.child_columns_.count(); j++) {
3580const ObString &column_name = foreign_key_arg.child_columns_.at(j);
3581const ObColumnSchemaV2 *column_schema = table_schema.get_column_schema(column_name);
3582if (OB_ISNULL(column_schema)) {
3583ret = OB_ERR_COLUMN_NOT_FOUND;
3584LOG_WARN("child column is not exist", K(ret), K(column_name));
3585} else if (OB_FAIL(foreign_key_info.child_column_ids_.push_back(column_schema->get_column_id()))) {
3586LOG_WARN("failed to push child column id", K(ret), K(column_name));
3587}
3588}
3589}
3590// get parent column schema.
3591if (OB_SUCC(ret) && !foreign_key_arg.is_parent_table_mock_) {
3592for (int64_t j = 0; OB_SUCC(ret) && j < foreign_key_arg.parent_columns_.count(); j++) {
3593const ObString &column_name = foreign_key_arg.parent_columns_.at(j);
3594const ObColumnSchemaV2 *column_schema = parent_schema->get_column_schema(column_name);
3595if (OB_ISNULL(column_schema)) {
3596ret = OB_ERR_COLUMN_NOT_FOUND;
3597LOG_WARN("parent column is not exist", K(ret), K(column_name));
3598} else if (OB_FAIL(foreign_key_info.parent_column_ids_.push_back(column_schema->get_column_id()))) {
3599LOG_WARN("failed to push parent column id", K(ret), K(column_name));
3600}
3601}
3602}
3603// get reference option and foreign key name.
3604if (OB_SUCC(ret)) {
3605foreign_key_info.update_action_ = foreign_key_arg.update_action_;
3606foreign_key_info.delete_action_ = foreign_key_arg.delete_action_;
3607foreign_key_info.foreign_key_name_ = foreign_key_arg.foreign_key_name_;
3608foreign_key_info.enable_flag_ = foreign_key_arg.enable_flag_;
3609foreign_key_info.validate_flag_ = foreign_key_arg.validate_flag_;
3610foreign_key_info.rely_flag_ = foreign_key_arg.rely_flag_;
3611foreign_key_info.is_parent_table_mock_ = foreign_key_arg.is_parent_table_mock_;
3612foreign_key_info.name_generated_type_ = foreign_key_arg.name_generated_type_;
3613}
3614// add foreign key info.
3615if (OB_SUCC(ret)) {
3616if (OB_FAIL(schema_service->fetch_new_constraint_id(table_schema.get_tenant_id(),
3617foreign_key_info.foreign_key_id_))) {
3618LOG_WARN("failed to fetch new foreign key id", K(ret), K(foreign_key_arg));
3619} else if (OB_FAIL(table_schema.add_foreign_key_info(foreign_key_info))) {
3620LOG_WARN("failed to push foreign key info", K(ret), K(foreign_key_info));
3621} else if (foreign_key_info.is_parent_table_mock_
3622&& MOCK_FK_PARENT_TABLE_OP_INVALID != mock_fk_parent_table_schema.get_operation_type()) {
3623if (OB_FAIL(mock_fk_parent_table_schema.add_foreign_key_info(foreign_key_info))) {
3624LOG_WARN("failed to push foreign key info", K(ret), K(foreign_key_info));
3625} else if (ObMockFKParentTableOperationType::MOCK_FK_PARENT_TABLE_OP_CREATE_TABLE_BY_ADD_FK_IN_CHILD_TBALE == mock_fk_parent_table_schema.get_operation_type()) {
3626if (OB_FAIL(tmp_mock_fk_parent_table_schema_array.push_back(mock_fk_parent_table_schema))) {
3627LOG_WARN("failed to push mock_fk_parent_table_schema to tmp_mock_fk_parent_table_schema_array", K(ret), K(mock_fk_parent_table_schema));
3628}
3629} else { // ObMockFKParentTableOperationType::MOCK_FK_PARENT_TABLE_OP_CREATE_TABLE_BY_ADD_FK_IN_CHILD_TBALE != mock_fk_parent_table_schema.get_operation_type()
3630if (OB_FAIL(mock_fk_parent_table_schema_array.push_back(mock_fk_parent_table_schema))) {
3631LOG_WARN("failed to push mock_fk_parent_table_schema to mock_fk_parent_table_schema_array", K(ret), K(mock_fk_parent_table_schema));
3632} else if (OB_FAIL(mock_fk_parent_table_map.erase_refactored(mock_fk_parent_table_schema.get_mock_fk_parent_table_name()))) {
3633LOG_WARN("failed to delete from mock_fk_parent_table_map", K(ret), K(mock_fk_parent_table_schema.get_mock_fk_parent_table_name()));
3634}
3635}
3636}
3637}
3638} // for
3639if (OB_SUCC(ret)) {
3640// push back to mock_fk_parent_table_schema_array with the last one of all dup name mock_fk_parent_table_schema
3641if (!tmp_mock_fk_parent_table_schema_array.empty()) {
3642for (int64_t i = 0; OB_SUCC(ret) && i < tmp_mock_fk_parent_table_schema_array.count(); ++i) {
3643uint64_t dup_name_mock_fk_parent_table_count = 0;
3644ObString mock_fk_parent_table_name;
3645if (OB_FAIL(mock_fk_parent_table_map.get_refactored(tmp_mock_fk_parent_table_schema_array.at(i).get_mock_fk_parent_table_name(), dup_name_mock_fk_parent_table_count))) {
3646if (OB_HASH_NOT_EXIST == ret) {
3647ret = OB_SUCCESS;
3648continue;
3649} else {
3650LOG_WARN("get_refactored from mock_fk_parent_table_map failed", K(ret), K(tmp_mock_fk_parent_table_schema_array.at(i)));
3651}
3652} else {
3653mock_fk_parent_table_name = tmp_mock_fk_parent_table_schema_array.at(i).get_mock_fk_parent_table_name();
3654int64_t j = i;
3655uint64_t count = 0;
3656for (; count < dup_name_mock_fk_parent_table_count && j < tmp_mock_fk_parent_table_schema_array.count(); ++j) {
3657if (0 == mock_fk_parent_table_name.case_compare(tmp_mock_fk_parent_table_schema_array.at(j).get_mock_fk_parent_table_name())) {
3658++count;
3659}
3660}
3661if (--j >= tmp_mock_fk_parent_table_schema_array.count()) {
3662ret = OB_ERR_UNEXPECTED;
3663LOG_WARN("j >= tmp_mock_fk_parent_table_schema_array.count()", K(ret), K(j), K(tmp_mock_fk_parent_table_schema_array.count()));
3664} else {
3665for (int64_t k = 0; OB_SUCC(ret) && k < tmp_mock_fk_parent_table_schema_array.at(j).get_foreign_key_infos().count(); ++k) {
3666tmp_mock_fk_parent_table_schema_array.at(j).get_foreign_key_infos().at(k).parent_table_id_ = tmp_mock_fk_parent_table_schema_array.at(j).get_mock_fk_parent_table_id();
3667}
3668}
3669if (OB_FAIL(ret)) {
3670} else if (OB_FAIL(mock_fk_parent_table_schema_array.push_back(tmp_mock_fk_parent_table_schema_array.at(j)))) {
3671LOG_WARN("fail to push back to mock_fk_parent_table_schema_array", K(ret), K(tmp_mock_fk_parent_table_schema_array.at(j)));
3672} else if (OB_FAIL(mock_fk_parent_table_map.erase_refactored(mock_fk_parent_table_name))) {
3673LOG_WARN("failed to delete from mock_fk_parent_table_map", K(mock_fk_parent_table_name), K(ret));
3674}
3675}
3676}
3677}
3678}
3679if (OB_SUCC(ret)) {
3680// deal with new table name which is the same to mock_fk_parent_table_name, replace mock_parent_table with this new table
3681const ObMockFKParentTableSchema *ori_mock_parent_table_schema_ptr = NULL;
3682if (OB_FAIL(schema_guard.get_mock_fk_parent_table_schema_with_name(
3683table_schema.get_tenant_id(),
3684table_schema.get_database_id(),
3685table_schema.get_table_name_str(),
3686ori_mock_parent_table_schema_ptr))) {
3687LOG_WARN("failed to check_mock_fk_parent_table_exist_with_name");
3688} else if (OB_NOT_NULL(ori_mock_parent_table_schema_ptr)) {
3689ObMockFKParentTableSchema mock_fk_parent_table_schema;
3690ObArray<const share::schema::ObTableSchema*> index_schemas;
3691for (int64_t i = 1; OB_SUCC(ret) && i < table_schemas.count(); ++i) {
3692if (table_schemas.at(i).is_unique_index()
3693&& OB_FAIL(index_schemas.push_back(&table_schemas.at(i)))) {
3694LOG_WARN("failed to push back index_schemas", K(ret));
3695}
3696}
3697if (FAILEDx(ddl_service_.gen_mock_fk_parent_table_for_replacing_mock_fk_parent_table(
3698schema_guard, ori_mock_parent_table_schema_ptr->get_mock_fk_parent_table_id(), table_schema, index_schemas,
3699mock_fk_parent_table_schema))) {
3700LOG_WARN("failed to gen_mock_fk_parent_table_for_replacing_mock_fk_parent_table", K(ret));
3701} else if (OB_FAIL(mock_fk_parent_table_schema_array.push_back(mock_fk_parent_table_schema))) {
3702LOG_WARN("failed to push mock_fk_parent_table_schema", K(ret), K(mock_fk_parent_table_schema));
3703}
3704}
3705}
3706} // check foreign key info end.
3707}
3708RS_TRACE(generate_schema_finish);
3709if (OB_SUCC(ret)) {
3710//table schema may be updated during analyse index schema, so reset table_schema
3711const bool is_standby = PRIMARY_CLUSTER != ObClusterInfoGetter::get_cluster_role_v2();
3712if (OB_FAIL(table_schemas.at(0).assign(table_schema))) {
3713LOG_WARN("fail to assign schema", K(ret));
3714} else if (OB_FAIL(ddl_service_.create_user_tables(
3715arg.if_not_exist_,
3716arg.ddl_stmt_str_,
3717arg.error_info_,
3718table_schemas,
3719schema_guard,
3720arg.sequence_ddl_arg_,
3721arg.last_replay_log_id_,
3722&arg.dep_infos_,
3723mock_fk_parent_table_schema_array,
3724ddl_task_id))) {
3725LOG_WARN("create_user_tables failed", "if_not_exist", arg.if_not_exist_,
3726"ddl_stmt_str", arg.ddl_stmt_str_, K(ret));
3727}
3728}
3729if (OB_ERR_TABLE_EXIST == ret) {
3730//create table xx if not exist (...)
3731//create or replace view xx as ...
3732if (arg.if_not_exist_) {
3733ret = OB_SUCCESS;
3734LOG_INFO("table is exist, no need to create again, ",
3735"tenant_id", table_schema.get_tenant_id(),
3736"database_id", table_schema.get_database_id(),
3737"table_name", table_schema.get_table_name());
3738} else {
3739ret = OB_ERR_TABLE_EXIST;
3740LOG_USER_ERROR(OB_ERR_TABLE_EXIST, table_schema.get_table_name_str().length(),
3741table_schema.get_table_name_str().ptr());
3742LOG_WARN("table is exist, cannot create it twice,",
3743"tenant_id", table_schema.get_tenant_id(),
3744"database_id", table_schema.get_database_id(),
3745"table_name", table_schema.get_table_name(), K(ret));
3746}
3747}
3748// check vertical partition
3749// is_primary_vp_table()
3750// get_aux_vp_tid_array()
3751// is_aux_vp_table()
3752// get_vp_store_column_ids
3753// get_vp_column_ids_without_rowkey
3754if (OB_SUCC(ret)) {
3755ObSchemaGetterGuard new_schema_guard;
3756const ObTableSchema *new_table_schema = NULL;
3757const uint64_t arg_vp_cnt = arg.vertical_partition_arg_list_.count();
3758
3759if (arg_vp_cnt == 0) {
3760LOG_INFO("avg_vp_cnt is 0");
3761// do-nothing
3762} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
3763table_schema.get_tenant_id(), new_schema_guard))) {
3764LOG_WARN("fail to get schema guard with version in inner table",
3765K(ret), K(table_schema.get_tenant_id()));
3766} else if (OB_FAIL(new_schema_guard.get_table_schema(table_schema.get_tenant_id(),
3767table_schema.get_table_id(),
3768new_table_schema))) {
3769LOG_WARN("fail to get table schema", K(ret), K(table_schema));
3770} else if (NULL == new_table_schema) {
3771ret = OB_ERR_UNEXPECTED;
3772LOG_WARN("NULL ptr", K(ret));
3773} else if (!new_table_schema->is_primary_vp_table()) {
3774ret = OB_ERR_UNEXPECTED;
3775LOG_WARN("is_primary_vp_table is invalid", K(ret), K(arg_vp_cnt), K(new_table_schema->is_primary_vp_table()));
3776} else {
3777ObSEArray<uint64_t, 16> aux_vp_tid_array;
3778if (OB_FAIL(new_table_schema->get_aux_vp_tid_array(aux_vp_tid_array))) {
3779LOG_WARN("failed to get_aux_vp_tid_array", K(*new_table_schema));
3780} else if (!((arg_vp_cnt == (aux_vp_tid_array.count()+ 1)
3781|| (arg_vp_cnt == aux_vp_tid_array.count())))) {
3782ret = OB_ERR_UNEXPECTED;
3783LOG_WARN("arg_vp_cnt is not equal to aux_vp_cnt_ or (aux_vp_cnt_+1)",
3784K(ret), K(arg_vp_cnt), K(aux_vp_tid_array.count()));
3785} else {
3786// check primary partition table include get_vp_store_column_ids and vertical partition column information
3787ObArray<share::schema::ObColDesc> columns;
3788const ObColumnSchemaV2 *column_schema = NULL;
3789const ObCreateVertialPartitionArg primary_vp_arg = arg.vertical_partition_arg_list_.at(0);
3790int64_t arg_pri_vp_col_cnt = primary_vp_arg.vertical_partition_columns_.count();
3791if (OB_FAIL(new_table_schema->get_vp_store_column_ids(columns))) {
3792LOG_WARN("get_vp_store_column_ids failed", K(ret));
3793}
3794for (int64_t i = 0; OB_SUCC(ret) && i < columns.count(); ++i) {
3795LOG_INFO("column info", K(columns.at(i).col_id_), K(columns.at(i).col_type_));
3796if (NULL == (column_schema = new_table_schema->get_column_schema(columns.at(i).col_id_))) {
3797ret = OB_ERR_BAD_FIELD_ERROR;
3798LOG_WARN("get_column_schema failed", K(columns.at(i)), K(ret));
3799} else {
3800ObString column_name = column_schema->get_column_name();
3801LOG_INFO("column info", K(column_name),
3802K(column_schema->get_column_id()), K(column_schema->get_table_id()));
3803if (column_schema->is_primary_vp_column()) {
3804for (int64_t j = 0; OB_SUCC(ret) && j < primary_vp_arg.vertical_partition_columns_.count(); ++j) {
3805ObString pri_vp_col = primary_vp_arg.vertical_partition_columns_.at(j);
3806if (0 == column_name.case_compare(pri_vp_col)) {
3807arg_pri_vp_col_cnt--;
3808LOG_INFO("primary vp", K(column_name));
3809break;
3810}
3811}
3812} else {
3813LOG_INFO("non-primary vp", K(column_name));
3814}
3815}
3816}
3817if (OB_SUCC(ret) && (0 != arg_pri_vp_col_cnt)) {
3818ret = OB_ERR_UNEXPECTED;
3819LOG_WARN("mismatch primary vp column", K(ret));
3820for (int64_t j = 0; j < arg_pri_vp_col_cnt; ++j) {
3821ObString pri_vp_col = primary_vp_arg.vertical_partition_columns_.at(j);
3822LOG_INFO("arg primary vp", K(pri_vp_col));
3823}
3824}
3825
3826// verify secondary partition table
3827if (OB_SUCC(ret)) {
3828int64_t N = aux_vp_tid_array.count();
3829for (int64_t i = 0; OB_SUCC(ret) && i < N; i++) {
3830const ObTableSchema *aux_vp_table_schema = NULL;
3831ObArray<share::schema::ObColDesc> vp_columns;
3832ObArray<share::schema::ObColDesc> store_columns;
3833if (OB_FAIL(new_schema_guard.get_table_schema(table_schema.get_tenant_id(),
3834aux_vp_tid_array.at(i), aux_vp_table_schema))) {
3835LOG_WARN("get_table_schema failed", "table id", aux_vp_tid_array.at(i), K(ret));
3836} else if (NULL == aux_vp_table_schema) {
3837ret = OB_ERR_UNEXPECTED;
3838LOG_WARN("aux vp table is null", K(ret));
3839} else if (!aux_vp_table_schema->is_aux_vp_table()
3840|| AUX_VERTIAL_PARTITION_TABLE != aux_vp_table_schema->get_table_type()) {
3841ret = OB_ERR_UNEXPECTED;
3842LOG_WARN("aux vp table type is incorrect", K(ret), K(aux_vp_table_schema->is_aux_vp_table()));
3843} else if (OB_FAIL(aux_vp_table_schema->get_vp_column_ids(vp_columns))) {
3844ret = OB_ERR_UNEXPECTED;
3845LOG_WARN("failed to get aux vp table columns", K(ret), K(*aux_vp_table_schema));
3846} else if (OB_FAIL(aux_vp_table_schema->get_vp_store_column_ids(store_columns))) {
3847ret = OB_ERR_UNEXPECTED;
3848LOG_WARN("failed to get aux vp table columns", K(ret), K(*aux_vp_table_schema));
3849} else {
3850LOG_INFO("table info", K(aux_vp_table_schema->get_table_name()), K(aux_vp_table_schema->get_table_id()),
3851K(aux_vp_table_schema->get_data_table_id()), K(ret));
3852const ObColumnSchemaV2 *column_schema = NULL;
3853
3854for (int64_t k = 0; OB_SUCC(ret) && k < vp_columns.count(); ++k) {
3855LOG_INFO("column info", K(vp_columns.at(k).col_id_), K(vp_columns.at(k).col_type_));
3856if (NULL == (column_schema = aux_vp_table_schema->get_column_schema(vp_columns.at(k).col_id_))) {
3857ret = OB_ERR_BAD_FIELD_ERROR;
3858LOG_WARN("get_column_schema failed", K(vp_columns.at(k)), K(ret));
3859} else {
3860LOG_INFO("column info", K(column_schema->get_column_name()), K(column_schema->get_column_id()),
3861K(column_schema->get_table_id()), K(ret));
3862}
3863}
3864// verify get_vp_store_column_ids return all vertical partition columns,
3865// include vertical partition columns of primary key.
3866for (int64_t k = 0; OB_SUCC(ret) && k < store_columns.count(); ++k) {
3867LOG_INFO("column info", K(store_columns.at(k).col_id_), K(store_columns.at(k).col_type_));
3868if (NULL == (column_schema = aux_vp_table_schema->get_column_schema(store_columns.at(k).col_id_))) {
3869ret = OB_ERR_BAD_FIELD_ERROR;
3870LOG_WARN("get_column_schema failed", K(store_columns.at(k)), K(ret));
3871} else {
3872LOG_INFO("column info", K(column_schema->get_column_name()), K(column_schema->get_column_id()),
3873K(column_schema->get_table_id()), K(ret));
3874}
3875}
3876}
3877}
3878}
3879}
3880}
3881}
3882if (OB_SUCC(ret)) {
3883uint64_t tenant_id = table_schema.get_tenant_id();
3884if (OB_FAIL(schema_service_->get_tenant_schema_version(tenant_id, res.schema_version_))) {
3885LOG_WARN("failed to get tenant schema version", K(ret));
3886} else {
3887res.task_id_ = ddl_task_id;
3888}
3889}
3890}
3891
3892RS_TRACE(create_table_end);
3893FORCE_PRINT_TRACE(THE_RS_TRACE, "[create table]");
3894int64_t cost = ObTimeUtility::current_time() - begin_time;
3895ROOTSERVICE_EVENT_ADD("ddl scheduler", "create table",
3896"tenant_id", arg.schema_.get_tenant_id(),
3897"ret", ret,
3898"trace_id", *ObCurTraceId::get_trace_id(),
3899"table_id", res.table_id_,
3900"schema_version", res.schema_version_,
3901K(cost));
3902LOG_INFO("finish create table ddl", K(ret), K(cost), "ddl_event_info", ObDDLEventInfo());
3903return ret;
3904}
3905
3906// create sys_table by specify table_id for tenant:
3907// 1. can not create table cross tenant except sys tenant.
3908// 2. part_type of sys table only support non-partition or only level hash_like part type.
3909// 3. sys table's tablegroup and database must be oceanbase
3910int ObRootService::generate_table_schema_in_tenant_space(
3911const ObCreateTableArg &arg,
3912ObTableSchema &table_schema)
3913{
3914int ret = OB_SUCCESS;
3915const uint64_t tenant_id = arg.exec_tenant_id_;
3916const uint64_t table_id = table_schema.get_table_id();
3917const ObPartitionLevel part_level = table_schema.get_part_level();
3918const ObPartitionFuncType part_func_type = table_schema.get_part_option().get_part_func_type();
3919if (!inited_) {
3920ret = OB_NOT_INIT;
3921LOG_WARN("not init", K(ret));
3922} else if (OB_INVALID_ID == table_id || !is_inner_table(table_id)) {
3923// skip
3924} else if (OB_SYS_TENANT_ID != arg.exec_tenant_id_) {
3925//FIXME: this restriction should be removed later.
3926// only enable sys tenant create sys table
3927ret = OB_OP_NOT_ALLOW;
3928LOG_WARN("only sys tenant can create tenant space table", K(ret), K(arg));
3929LOG_USER_ERROR(OB_OP_NOT_ALLOW, "non-sys tenant creating system tables");
3930} else if (table_schema.is_view_table()) {
3931// no need specify tenant_id while specify table_id creating sys table
3932if (OB_SYS_TENANT_ID != tenant_id) {
3933ret = OB_OP_NOT_ALLOW;
3934LOG_WARN("create sys view with ordinary tenant not allowed", K(ret), K(table_schema));
3935}
3936} else if (part_level > ObPartitionLevel::PARTITION_LEVEL_ONE
3937|| !is_hash_like_part(part_func_type)) {
3938// sys tables do not write __all_part table, so sys table only support non-partition or only level hash_like part type.
3939ret = OB_OP_NOT_ALLOW;
3940LOG_WARN("sys table's partition option is invalid", K(ret), K(arg));
3941LOG_USER_ERROR(OB_OP_NOT_ALLOW, "invalid partition option to system table");
3942} else if (0 != table_schema.get_tablegroup_name().case_compare(OB_SYS_TABLEGROUP_NAME)) {
3943// sys tables's tablegroup must be oceanbase
3944ret = OB_OP_NOT_ALLOW;
3945LOG_WARN("sys table's tablegroup should be oceanbase", K(ret), K(arg));
3946LOG_USER_ERROR(OB_OP_NOT_ALLOW, "invalid tablegroup to system table");
3947} else if (0 != arg.db_name_.case_compare(OB_SYS_DATABASE_NAME)) {
3948// sys tables's database must be oceanbase
3949ret = OB_OP_NOT_ALLOW;
3950LOG_WARN("sys table's database should be oceanbase", K(ret), K(arg));
3951LOG_USER_ERROR(OB_OP_NOT_ALLOW, "invalid database to sys table");
3952} else {
3953table_schema.set_tenant_id(tenant_id);
3954table_schema.set_table_id(table_id);
3955table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID);
3956table_schema.set_tablegroup_name(OB_SYS_TABLEGROUP_NAME);
3957table_schema.set_database_id(OB_SYS_DATABASE_ID);
3958}
3959return ret;
3960}
3961
3962int ObRootService::maintain_obj_dependency_info(const obrpc::ObDependencyObjDDLArg &arg)
3963{
3964LOG_DEBUG("receive maintain obj dependency info arg", K(arg));
3965int ret = OB_SUCCESS;
3966if (!inited_) {
3967ret = OB_NOT_INIT;
3968LOG_WARN("not init", K(ret));
3969} else if (!arg.is_valid()) {
3970ret = OB_INVALID_ARGUMENT;
3971LOG_WARN("invalid arg", K(arg), K(ret));
3972} else if (OB_FAIL(ddl_service_.maintain_obj_dependency_info(arg))) {
3973LOG_WARN("failed to maintain obj dependency info", K(ret), K(arg));
3974}
3975return ret;
3976}
3977
3978int ObRootService::mview_complete_refresh(const obrpc::ObMViewCompleteRefreshArg &arg,
3979obrpc::ObMViewCompleteRefreshRes &res)
3980{
3981LOG_DEBUG("receive mview complete refresh arg", K(arg));
3982int ret = OB_SUCCESS;
3983const uint64_t tenant_id = arg.tenant_id_;
3984uint64_t compat_version = 0;
3985if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
3986LOG_WARN("fail to get data version", KR(ret), K(tenant_id));
3987} else if (compat_version < DATA_VERSION_4_3_0_0) {
3988ret = OB_NOT_SUPPORTED;
3989LOG_WARN("version lower than 4.3 does not support this operation", KR(ret));
3990LOG_USER_ERROR(OB_NOT_SUPPORTED, "tenant's data version is below 4.3.0.0, mview complete refresh is ");
3991} else if (!inited_) {
3992ret = OB_NOT_INIT;
3993LOG_WARN("not init", KR(ret));
3994} else if (!arg.is_valid()) {
3995ret = OB_INVALID_ARGUMENT;
3996LOG_WARN("invalid arg", KR(ret), K(arg));
3997} else {
3998ObSchemaGetterGuard schema_guard;
3999if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4000LOG_WARN("get schema guard in inner table failed", KR(ret), K(tenant_id));
4001} else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) {
4002LOG_WARN("check parallel ddl conflict failed", KR(ret), K(arg));
4003} else if (OB_FAIL(ddl_service_.mview_complete_refresh(arg, res, schema_guard))) {
4004LOG_WARN("failed to mview complete refresh", KR(ret), K(arg));
4005}
4006}
4007return ret;
4008}
4009
4010int ObRootService::execute_ddl_task(const obrpc::ObAlterTableArg &arg,
4011common::ObSArray<uint64_t> &obj_ids)
4012{
4013LOG_DEBUG("receive execute ddl task arg", K(arg));
4014int ret = OB_SUCCESS;
4015if (!inited_) {
4016ret = OB_NOT_INIT;
4017LOG_WARN("not init", K(ret));
4018} else if (!arg.is_valid()) {
4019ret = OB_INVALID_ARGUMENT;
4020LOG_WARN("invalid arg", K(arg), K(ret));
4021} else {
4022switch (arg.ddl_task_type_) {
4023case share::REBUILD_INDEX_TASK: {
4024if (OB_FAIL(ddl_service_.rebuild_hidden_table_index_in_trans(
4025const_cast<obrpc::ObAlterTableArg &>(arg), obj_ids))) {
4026LOG_WARN("failed to rebuild hidden table index in trans", K(ret));
4027}
4028break;
4029}
4030case share::REBUILD_CONSTRAINT_TASK: {
4031if (OB_FAIL(ddl_service_.rebuild_hidden_table_constraints_in_trans(
4032const_cast<obrpc::ObAlterTableArg &>(arg), obj_ids))) {
4033LOG_WARN("failed to rebuild hidden table constraints in trans", K(ret));
4034}
4035break;
4036}
4037case share::REBUILD_FOREIGN_KEY_TASK: {
4038if (OB_FAIL(ddl_service_.rebuild_hidden_table_foreign_key_in_trans(
4039const_cast<obrpc::ObAlterTableArg &>(arg), obj_ids))) {
4040LOG_WARN("failed to rebuild hidden table foreign key in trans", K(ret));
4041}
4042break;
4043}
4044case share::MAKE_DDL_TAKE_EFFECT_TASK: {
4045if (OB_FAIL(ddl_service_.swap_orig_and_hidden_table_state(
4046const_cast<obrpc::ObAlterTableArg &>(arg)))) {
4047LOG_WARN("failed to swap orig and hidden table state", K(ret));
4048}
4049break;
4050}
4051case share::CLEANUP_GARBAGE_TASK: {
4052if (OB_FAIL(ddl_service_.cleanup_garbage(
4053const_cast<obrpc::ObAlterTableArg &>(arg)))) {
4054LOG_WARN("failed to cleanup garbage", K(ret));
4055}
4056break;
4057}
4058case share::MODIFY_FOREIGN_KEY_STATE_TASK: {
4059if (OB_FAIL(ddl_service_.modify_hidden_table_fk_state(
4060const_cast<obrpc::ObAlterTableArg &>(arg)))) {
4061LOG_WARN("failed to modify hidden table fk state", K(ret));
4062}
4063break;
4064}
4065case share::DELETE_COLUMN_FROM_SCHEMA: {
4066if (OB_FAIL(ddl_service_.delete_column_from_schema(const_cast<ObAlterTableArg &>(arg)))) {
4067LOG_WARN("fail to set column to no minor status", K(ret), K(arg));
4068}
4069break;
4070}
4071// remap all index tables to hidden table and take effect concurrently.
4072case share::REMAP_INDEXES_AND_TAKE_EFFECT_TASK: {
4073if (OB_FAIL(ddl_service_.remap_index_tablets_and_take_effect(
4074const_cast<obrpc::ObAlterTableArg &>(arg)))) {
4075LOG_WARN("fail to remap index tables to hidden table and take effect", K(ret));
4076}
4077break;
4078}
4079case share::UPDATE_AUTOINC_SCHEMA: {
4080if (OB_FAIL(ddl_service_.update_autoinc_schema(const_cast<ObAlterTableArg &>(arg)))) {
4081LOG_WARN("fail to update autoinc schema", K(ret), K(arg));
4082}
4083break;
4084}
4085case share::MODIFY_NOT_NULL_COLUMN_STATE_TASK: {
4086if (OB_FAIL(ddl_service_.modify_hidden_table_not_null_column_state(arg))) {
4087LOG_WARN("failed to modify hidden table cst state", K(ret));
4088}
4089break;
4090}
4091case share::MAKE_RECOVER_RESTORE_TABLE_TASK_TAKE_EFFECT: {
4092if (OB_FAIL(ddl_service_.make_recover_restore_tables_visible(const_cast<ObAlterTableArg &>(arg)))) {
4093LOG_WARN("make recovert restore task visible failed", K(ret), K(arg));
4094}
4095break;
4096}
4097default:
4098ret = OB_ERR_UNEXPECTED;
4099LOG_WARN("unknown ddl task type", K(ret), K(arg.ddl_task_type_));
4100}
4101}
4102return ret;
4103}
4104
4105int ObRootService::precheck_interval_part(const obrpc::ObAlterTableArg &arg)
4106{
4107int ret = OB_SUCCESS;
4108ObSchemaGetterGuard schema_guard;
4109const ObAlterTableArg::AlterPartitionType op_type = arg.alter_part_type_;
4110const ObSimpleTableSchemaV2 *simple_table_schema = NULL;
4111const AlterTableSchema &alter_table_schema = arg.alter_table_schema_;
4112int64_t tenant_id = alter_table_schema.get_tenant_id();
4113
4114if (!alter_table_schema.is_interval_part()
4115|| obrpc::ObAlterTableArg::ADD_PARTITION != op_type) {
4116} else if (OB_ISNULL(schema_service_)) {
4117ret = OB_ERR_UNEXPECTED;
4118LOG_WARN("error unexpected, schema service must not be NULL", K(ret));
4119} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) {
4120LOG_WARN("fail to get schema guard", K(ret));
4121} else if (OB_FAIL(schema_guard.get_simple_table_schema(tenant_id,
4122alter_table_schema.get_table_id(), simple_table_schema))) {
4123LOG_WARN("get table schema failed", KR(ret), K(tenant_id), K(alter_table_schema));
4124} else if (OB_ISNULL(simple_table_schema)) {
4125ret = OB_TABLE_NOT_EXIST;
4126LOG_WARN("simple_table_schema is null", K(ret), K(alter_table_schema));
4127} else if (simple_table_schema->get_schema_version() < alter_table_schema.get_schema_version()) {
4128} else if (simple_table_schema->get_interval_range() != alter_table_schema.get_interval_range()
4129|| simple_table_schema->get_transition_point() != alter_table_schema.get_transition_point()) {
4130ret = OB_ERR_INTERVAL_PARTITION_ERROR;
4131LOG_WARN("interval_range or transition_point is changed", KR(ret), \
4132KPC(simple_table_schema), K(alter_table_schema));
4133} else {
4134int64_t j = 0;
4135const ObRowkey *rowkey_orig= NULL;
4136bool is_all_exist = true;
4137ObPartition **inc_part_array = alter_table_schema.get_part_array();
4138ObPartition **orig_part_array = simple_table_schema->get_part_array();
4139if (OB_ISNULL(inc_part_array)) {
4140ret = OB_ERR_UNEXPECTED;
4141LOG_WARN("ptr is null", K(ret), K(alter_table_schema), KPC(simple_table_schema));
4142} else if (OB_ISNULL(orig_part_array)) {
4143ret = OB_ERR_UNEXPECTED;
4144LOG_WARN("ptr is null", K(ret), K(alter_table_schema), KPC(simple_table_schema));
4145}
4146for (int64_t i = 0; is_all_exist && OB_SUCC(ret) && i < alter_table_schema.get_part_option().get_part_num(); ++i) {
4147const ObRowkey *rowkey_cur = NULL;
4148if (OB_ISNULL(inc_part_array[i])) {
4149ret = OB_ERR_UNEXPECTED;
4150LOG_WARN("ptr is null", K(ret), K(alter_table_schema), KPC(simple_table_schema));
4151} else if (OB_UNLIKELY(NULL == (rowkey_cur = &inc_part_array[i]->get_high_bound_val()))) {
4152ret = OB_ERR_UNEXPECTED;
4153LOG_WARN("ptr is null", K(ret), K(alter_table_schema), KPC(simple_table_schema));
4154}
4155while (is_all_exist && OB_SUCC(ret) && j < simple_table_schema->get_part_option().get_part_num()) {
4156if (OB_ISNULL(orig_part_array[j])) {
4157ret = OB_ERR_UNEXPECTED;
4158LOG_WARN("ptr is null", K(ret), K(alter_table_schema), KPC(simple_table_schema));
4159} else if (OB_UNLIKELY(NULL == (rowkey_orig = &orig_part_array[j]->get_high_bound_val()))) {
4160ret = OB_ERR_UNEXPECTED;
4161LOG_WARN("ptr is null", K(ret), K(alter_table_schema), KPC(simple_table_schema));
4162} else if (*rowkey_orig < *rowkey_cur) {
4163j++;
4164} else {
4165break;
4166}
4167}
4168if (OB_FAIL(ret)) {
4169} else if (*rowkey_orig != *rowkey_cur) {
4170is_all_exist = false;
4171}
4172}
4173if (OB_FAIL(ret)) {
4174} else if (is_all_exist) {
4175LOG_INFO("all interval part for add is exist", K(alter_table_schema), KPC(simple_table_schema));
4176ret = OB_ERR_INTERVAL_PARTITION_EXIST;
4177}
4178}
4179return ret;
4180}
4181
4182int ObRootService::create_hidden_table(const obrpc::ObCreateHiddenTableArg &arg,
4183obrpc::ObCreateHiddenTableRes &res)
4184{
4185LOG_DEBUG("receive create hidden table arg", K(arg));
4186int ret = OB_SUCCESS;
4187const uint64_t tenant_id = arg.tenant_id_;
4188uint64_t compat_version = 0;
4189if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
4190LOG_WARN("fail to get data version", K(ret), K(tenant_id));
4191} else if (compat_version < DATA_VERSION_4_1_0_0) {
4192ret = OB_NOT_SUPPORTED;
4193LOG_WARN("version 4.0 does not support this operation", K(ret));
4194} else if (OB_UNLIKELY(!inited_)) {
4195ret = OB_NOT_INIT;
4196LOG_WARN("not init", K(ret));
4197} else if (OB_UNLIKELY(!arg.is_valid())) {
4198ret = OB_INVALID_ARGUMENT;
4199LOG_WARN("invalid arg", K(ret), K(arg));
4200} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, CREATE_HIDDEN_TABLE_RPC_FAILED))) {
4201LOG_WARN("ddl sim failure", K(ret), K(arg));
4202} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, CREATE_HIDDEN_TABLE_RPC_SLOW))) {
4203LOG_WARN("ddl sim failure", K(ret), K(arg));
4204} else if (OB_FAIL(ddl_service_.create_hidden_table(arg, res))) {
4205LOG_WARN("do create hidden table in trans failed", K(ret), K(arg));
4206}
4207char tenant_id_buffer[128];
4208snprintf(tenant_id_buffer, sizeof(tenant_id_buffer), "orig_tenant_id:%ld, target_tenant_id:%ld",
4209arg.tenant_id_, arg.dest_tenant_id_);
4210ROOTSERVICE_EVENT_ADD("ddl scheduler", "create hidden table",
4211"tenant_id", tenant_id_buffer,
4212"ret", ret,
4213"trace_id", *ObCurTraceId::get_trace_id(),
4214"task_id", res.task_id_,
4215"table_id", arg.table_id_,
4216"schema_version", res.schema_version_);
4217LOG_INFO("finish create hidden table ddl", K(ret), K(arg), K(res), "ddl_event_info", ObDDLEventInfo());
4218return ret;
4219}
4220
4221int ObRootService::update_ddl_task_active_time(const obrpc::ObUpdateDDLTaskActiveTimeArg &arg)
4222{
4223LOG_DEBUG("receive recv ddl task status arg", K(arg));
4224int ret = OB_SUCCESS;
4225const int64_t task_id = arg.task_id_;
4226const uint64_t tenant_id = arg.tenant_id_;
4227uint64_t compat_version = 0;
4228if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
4229LOG_WARN("fail to get data version", K(ret), K(tenant_id));
4230} else if (compat_version < DATA_VERSION_4_1_0_0) {
4231ret = OB_NOT_SUPPORTED;
4232LOG_WARN("version 4.0 does not support this operation", K(ret));
4233} else if (OB_UNLIKELY(!inited_)) {
4234ret = OB_NOT_INIT;
4235LOG_WARN("not init", K(ret));
4236} else if (OB_UNLIKELY(!arg.is_valid())) {
4237ret = OB_INVALID_ARGUMENT;
4238LOG_WARN("invalid arg", K(ret), K(arg));
4239} else if (OB_FAIL(ddl_scheduler_.update_ddl_task_active_time(ObDDLTaskID(tenant_id, task_id)))) {
4240LOG_WARN("fail to set RegTaskTime map", K(ret), K(tenant_id), K(task_id));
4241}
4242return ret;
4243}
4244
4245int ObRootService::abort_redef_table(const obrpc::ObAbortRedefTableArg &arg)
4246{
4247LOG_DEBUG("receive abort redef table arg", K(arg));
4248int ret = OB_SUCCESS;
4249const int64_t task_id = arg.task_id_;
4250const uint64_t tenant_id = arg.tenant_id_;
4251uint64_t compat_version = 0;
4252if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
4253LOG_WARN("fail to get data version", K(ret), K(tenant_id));
4254} else if (compat_version < DATA_VERSION_4_1_0_0) {
4255ret = OB_NOT_SUPPORTED;
4256LOG_WARN("version 4.0 does not support this operation", K(ret));
4257} else if (OB_UNLIKELY(!inited_)) {
4258ret = OB_NOT_INIT;
4259LOG_WARN("not init", K(ret));
4260} else if (OB_UNLIKELY(!arg.is_valid())) {
4261ret = OB_INVALID_ARGUMENT;
4262LOG_WARN("invalid arg", K(ret), K(arg));
4263} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, ABORT_REDEF_TABLE_RPC_FAILED))) {
4264LOG_WARN("ddl sim failure", K(ret), K(arg));
4265} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, ABORT_REDEF_TABLE_RPC_SLOW))) {
4266LOG_WARN("ddl sim failure", K(ret), K(arg));
4267} else if (OB_FAIL(ddl_scheduler_.abort_redef_table(ObDDLTaskID(tenant_id, task_id)))) {
4268LOG_WARN("cancel task failed", K(ret), K(tenant_id), K(task_id));
4269}
4270ROOTSERVICE_EVENT_ADD("ddl scheduler", "abort redef table",
4271"tenant_id", arg.tenant_id_,
4272"ret", ret,
4273"trace_id", *ObCurTraceId::get_trace_id(),
4274"task_id", arg.task_id_);
4275LOG_INFO("finish abort redef table ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
4276return ret;
4277}
4278
4279int ObRootService::finish_redef_table(const obrpc::ObFinishRedefTableArg &arg)
4280{
4281LOG_DEBUG("receive finish redef table arg", K(arg));
4282int ret = OB_SUCCESS;
4283const int64_t task_id = arg.task_id_;
4284const uint64_t tenant_id = arg.tenant_id_;
4285uint64_t compat_version = 0;
4286if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
4287LOG_WARN("fail to get data version", K(ret), K(tenant_id));
4288} else if (compat_version < DATA_VERSION_4_1_0_0) {
4289ret = OB_NOT_SUPPORTED;
4290LOG_WARN("version 4.0 does not support this operation", K(ret));
4291} else if (OB_UNLIKELY(!inited_)) {
4292ret = OB_NOT_INIT;
4293LOG_WARN("not init", K(ret));
4294} else if (OB_UNLIKELY(!arg.is_valid())) {
4295ret = OB_INVALID_ARGUMENT;
4296LOG_WARN("invalid arg", K(ret), K(arg));
4297} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, FINISH_REDEF_TABLE_RPC_FAILED))) {
4298LOG_WARN("ddl sim failure", K(ret), K(arg));
4299} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, FINISH_REDEF_TABLE_RPC_SLOW))) {
4300LOG_WARN("ddl sim failure", K(ret), K(arg));
4301} else if (OB_FAIL(ddl_scheduler_.finish_redef_table(ObDDLTaskID(tenant_id, task_id)))) {
4302LOG_WARN("failed to finish redef table", K(ret), K(task_id), K(tenant_id));
4303}
4304ROOTSERVICE_EVENT_ADD("ddl scheduler", "finish redef table",
4305"tenant_id", arg.tenant_id_,
4306"ret", ret,
4307"trace_id", *ObCurTraceId::get_trace_id(),
4308"task_id", arg.task_id_);
4309LOG_INFO("finish abort redef table ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
4310return ret;
4311}
4312
4313int ObRootService::copy_table_dependents(const obrpc::ObCopyTableDependentsArg &arg)
4314{
4315LOG_INFO("receive copy table dependents arg", K(arg));
4316int ret = OB_SUCCESS;
4317const int64_t task_id = arg.task_id_;
4318const uint64_t tenant_id = arg.tenant_id_;
4319const bool is_copy_indexes = arg.copy_indexes_;
4320const bool is_copy_triggers = arg.copy_triggers_;
4321const bool is_copy_constraints = arg.copy_constraints_;
4322const bool is_copy_foreign_keys = arg.copy_foreign_keys_;
4323const bool is_ignore_errors = arg.ignore_errors_;
4324uint64_t compat_version = 0;
4325if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
4326LOG_WARN("fail to get data version", K(ret), K(tenant_id));
4327} else if (compat_version < DATA_VERSION_4_1_0_0) {
4328ret = OB_NOT_SUPPORTED;
4329LOG_WARN("version 4.0 does not support this operation", K(ret));
4330} else if (OB_UNLIKELY(!inited_)) {
4331ret = OB_NOT_INIT;
4332LOG_WARN("not init", K(ret));
4333} else if (OB_UNLIKELY(!arg.is_valid())) {
4334ret = OB_INVALID_ARGUMENT;
4335LOG_WARN("invalid arg", K(ret), K(arg));
4336} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, COPY_TABLE_DEPENDENTS_RPC_FAILED))) {
4337LOG_WARN("ddl sim failure", K(ret), K(arg));
4338} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, COPY_TABLE_DEPENDENTS_RPC_SLOW))) {
4339LOG_WARN("ddl sim failure", K(ret), K(arg));
4340} else if (OB_FAIL(ddl_scheduler_.copy_table_dependents(ObDDLTaskID(tenant_id, task_id),
4341is_copy_constraints,
4342is_copy_indexes,
4343is_copy_triggers,
4344is_copy_foreign_keys,
4345is_ignore_errors))) {
4346LOG_WARN("failed to copy table dependents", K(ret), K(arg));
4347}
4348ROOTSERVICE_EVENT_ADD("ddl scheduler", "copy table dependents",
4349"tenant_id", tenant_id,
4350"ret", ret,
4351"trace_id", *ObCurTraceId::get_trace_id(),
4352"task_id", task_id);
4353LOG_INFO("finish copy table dependents ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
4354return ret;
4355}
4356
4357int ObRootService::start_redef_table(const obrpc::ObStartRedefTableArg &arg, obrpc::ObStartRedefTableRes &res)
4358{
4359LOG_DEBUG("receive start redef table arg", K(arg));
4360int ret = OB_SUCCESS;
4361const uint64_t tenant_id = arg.orig_tenant_id_;
4362uint64_t compat_version = 0;
4363if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
4364LOG_WARN("fail to get data version", K(ret), K(tenant_id));
4365} else if (compat_version < DATA_VERSION_4_1_0_0) {
4366ret = OB_NOT_SUPPORTED;
4367LOG_WARN("version 4.0 does not support this operation", K(ret));
4368} else if (OB_UNLIKELY(!inited_)) {
4369ret = OB_NOT_INIT;
4370LOG_WARN("not init", K(ret));
4371} else if (OB_UNLIKELY(!arg.is_valid())) {
4372ret = OB_INVALID_ARGUMENT;
4373LOG_WARN("invalid arg", K(ret), K(arg));
4374} else if (OB_FAIL(ddl_scheduler_.start_redef_table(arg, res))) {
4375LOG_WARN("start redef table failed", K(ret));
4376}
4377char tenant_id_buffer[128];
4378snprintf(tenant_id_buffer, sizeof(tenant_id_buffer), "orig_tenant_id:%ld, target_tenant_id:%ld",
4379arg.orig_tenant_id_, arg.target_tenant_id_);
4380char table_id_buffer[128];
4381snprintf(table_id_buffer, sizeof(table_id_buffer), "orig_table_id:%ld, target_table_id:%ld",
4382arg.orig_table_id_, arg.target_table_id_);
4383ROOTSERVICE_EVENT_ADD("ddl scheduler", "redef table",
4384"tenant_id", tenant_id_buffer,
4385"ret", ret,
4386"trace_id", *ObCurTraceId::get_trace_id(),
4387"task_id", res.task_id_,
4388"table_id", table_id_buffer,
4389"schema_version", res.schema_version_);
4390LOG_INFO("finish redef table ddl", K(arg), K(ret), K(res), "ddl_event_info", ObDDLEventInfo());
4391return ret;
4392}
4393
4394int ObRootService::recover_restore_table_ddl(const obrpc::ObRecoverRestoreTableDDLArg &arg)
4395{
4396int ret = OB_SUCCESS;
4397uint64_t compat_version = 0;
4398if (OB_FAIL(GET_MIN_DATA_VERSION(arg.src_tenant_id_, compat_version))) {
4399LOG_WARN("fail to get data version", K(ret), K(arg));
4400} else if (compat_version < DATA_VERSION_4_2_1_0) {
4401ret = OB_NOT_SUPPORTED;
4402LOG_WARN("version 4.0 does not support this operation", K(ret));
4403} else if (OB_UNLIKELY(!inited_)) {
4404ret = OB_NOT_INIT;
4405LOG_WARN("not init", K(ret));
4406} else if (OB_UNLIKELY(!arg.is_valid())) {
4407ret = OB_INVALID_ARGUMENT;
4408LOG_WARN("invalid arg", K(ret), K(arg));
4409} else if (OB_FAIL(ddl_service_.recover_restore_table_ddl_task(arg))) {
4410LOG_WARN("recover restore table ddl task failed", K(ret), K(arg));
4411}
4412LOG_INFO("recover restore table ddl finish", K(ret), K(arg));
4413return ret;
4414}
4415
4416int ObRootService::alter_table(const obrpc::ObAlterTableArg &arg, obrpc::ObAlterTableRes &res)
4417{
4418LOG_DEBUG("receive alter table arg", K(arg));
4419int ret = OB_SUCCESS;
4420bool is_oracle_mode = false;
4421ObSchemaGetterGuard schema_guard;
4422const uint64_t tenant_id = arg.alter_table_schema_.get_tenant_id();
4423ObAlterTableArg &nonconst_arg = const_cast<ObAlterTableArg &>(arg);
4424if (!inited_) {
4425ret = OB_NOT_INIT;
4426LOG_WARN("not init", K(ret));
4427} else if (!arg.is_valid()) {
4428ret = OB_INVALID_ARGUMENT;
4429LOG_WARN("invalid arg", K(arg), K(ret));
4430} else if (OB_FAIL(precheck_interval_part(arg))) {
4431if (ret != OB_ERR_INTERVAL_PARTITION_EXIST) {
4432LOG_WARN("fail to precheck_interval_part", K(arg), KR(ret));
4433}
4434} else {
4435if (OB_FAIL(ret)) {
4436} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4437LOG_WARN("get schema guard in inner table failed", K(ret));
4438} else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) {
4439LOG_WARN("check parallel ddl conflict failed", K(ret));
4440} else if (OB_FAIL(table_allow_ddl_operation(arg))) {
4441LOG_WARN("table can't do ddl now", K(ret));
4442} else if (nonconst_arg.is_add_to_scheduler_) {
4443ObDDLTaskRecord task_record;
4444ObArenaAllocator allocator(lib::ObLabel("DdlTaskTmp"));
4445ObDDLType ddl_type = ObDDLType::DDL_INVALID;
4446const ObTableSchema *orig_table_schema = nullptr;
4447schema_guard.set_session_id(arg.session_id_);
4448if (obrpc::ObAlterTableArg::DROP_PARTITION == nonconst_arg.alter_part_type_) {
4449ddl_type = ObDDLType::DDL_DROP_PARTITION;
4450} else if (obrpc::ObAlterTableArg::DROP_SUB_PARTITION == nonconst_arg.alter_part_type_) {
4451ddl_type = ObDDLType::DDL_DROP_SUB_PARTITION;
4452} else if (obrpc::ObAlterTableArg::TRUNCATE_PARTITION == nonconst_arg.alter_part_type_) {
4453ddl_type = ObDDLType::DDL_TRUNCATE_PARTITION;
4454} else if (obrpc::ObAlterTableArg::TRUNCATE_SUB_PARTITION == nonconst_arg.alter_part_type_) {
4455ddl_type = ObDDLType::DDL_TRUNCATE_SUB_PARTITION;
4456} else if (obrpc::ObAlterTableArg::RENAME_PARTITION == nonconst_arg.alter_part_type_) {
4457ddl_type = ObDDLType::DDL_RENAME_PARTITION;
4458} else if (obrpc::ObAlterTableArg::RENAME_SUB_PARTITION == nonconst_arg.alter_part_type_) {
4459ddl_type = ObDDLType::DDL_RENAME_SUB_PARTITION;
4460} else {
4461ret = OB_ERR_UNEXPECTED;
4462LOG_WARN("unexpected ddl type", K(ret), K(nonconst_arg.alter_part_type_), K(nonconst_arg));
4463}
4464if (OB_FAIL(ret)) {
4465} else if (OB_FAIL(schema_guard.get_table_schema(tenant_id,
4466nonconst_arg.alter_table_schema_.get_database_name(),
4467nonconst_arg.alter_table_schema_.get_origin_table_name(),
4468false /* is_index*/,
4469orig_table_schema))) {
4470LOG_WARN("fail to get and check table schema", K(ret));
4471} else if (OB_ISNULL(orig_table_schema)) {
4472ret = OB_TABLE_NOT_EXIST;
4473LOG_WARN("table not exist", K(ret), K(tenant_id), K(nonconst_arg.alter_table_schema_));
4474} else {
4475ObCreateDDLTaskParam param(tenant_id,
4476ddl_type,
4477nullptr,
4478nullptr,
4479orig_table_schema->get_table_id(),
4480orig_table_schema->get_schema_version(),
4481arg.parallelism_,
4482arg.consumer_group_id_,
4483&allocator,
4484&arg,
44850 /*parent task id*/);
4486if (OB_FAIL(ddl_scheduler_.create_ddl_task(param, sql_proxy_, task_record))) {
4487LOG_WARN("submit ddl task failed", K(ret), K(arg));
4488} else if (OB_FAIL(ddl_scheduler_.schedule_ddl_task(task_record))) {
4489LOG_WARN("fail to schedule ddl task", K(ret), K(task_record));
4490} else {
4491res.ddl_type_ = ddl_type;
4492res.task_id_ = task_record.task_id_;
4493}
4494}
4495} else if (OB_FAIL(ddl_service_.alter_table(nonconst_arg, res))) {
4496LOG_WARN("alter_user_table failed", K(arg), K(ret));
4497} else {
4498const ObSimpleTableSchemaV2 *simple_table_schema = NULL;
4499// there are multiple DDL except alter table, ctas, comment on, eg.
4500// but only alter_table specify table_id, so if no table_id, it indicates DDL is not alter table, skip.
4501if (OB_INVALID_ID == arg.alter_table_schema_.get_table_id()) {
4502// skip
4503} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4504LOG_WARN("get schema guard in inner table failed", K(ret));
4505} else if (OB_FAIL(schema_guard.get_simple_table_schema(tenant_id, arg.alter_table_schema_.get_table_id(), simple_table_schema))) {
4506LOG_WARN("fail to get table schema", K(ret), K(arg.alter_table_schema_.get_table_id()));
4507} else if (OB_ISNULL(simple_table_schema)) {
4508ret = OB_ERR_UNEXPECTED;
4509LOG_WARN("simple_table_schema is NULL ptr", K(ret), K(simple_table_schema), K(ret));
4510} else {
4511res.schema_version_ = simple_table_schema->get_schema_version();
4512}
4513}
4514}
4515char table_id_buffer[256];
4516snprintf(table_id_buffer, sizeof(table_id_buffer), "table_id:%ld, hidden_table_id:%ld",
4517arg.table_id_, arg.hidden_table_id_);
4518ROOTSERVICE_EVENT_ADD("ddl scheduler", "alter table",
4519K(tenant_id),
4520"ret", ret,
4521"trace_id", *ObCurTraceId::get_trace_id(),
4522"task_id", res.task_id_,
4523"table_id", table_id_buffer,
4524"schema_version", res.schema_version_);
4525LOG_INFO("finish alter table ddl", K(ret), K(arg), K(res), "ddl_event_info", ObDDLEventInfo());
4526return ret;
4527}
4528
4529int ObRootService::create_index(const ObCreateIndexArg &arg, obrpc::ObAlterTableRes &res)
4530{
4531int ret = OB_SUCCESS;
4532ObSchemaGetterGuard schema_guard;
4533LOG_DEBUG("receive create index arg", K(arg));
4534if (!inited_) {
4535ret = OB_NOT_INIT;
4536LOG_WARN("not init", K(ret));
4537} else if (!arg.is_valid()) {
4538ret = OB_INVALID_ARGUMENT;
4539LOG_WARN("invalid arg", K(arg), K(ret));
4540} else {
4541ObIndexBuilder index_builder(ddl_service_);
4542if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(arg.tenant_id_, schema_guard))) {
4543LOG_WARN("get schema guard in inner table failed", K(ret));
4544} else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) {
4545LOG_WARN("check parallel ddl conflict failed", K(ret));
4546} else if (OB_FAIL(index_builder.create_index(arg, res))) {
4547LOG_WARN("create_index failed", K(arg), K(ret));
4548}
4549}
4550char table_id_buffer[256];
4551snprintf(table_id_buffer, sizeof(table_id_buffer), "data_table_id:%ld, index_table_id:%ld",
4552arg.data_table_id_, arg.index_table_id_);
4553ROOTSERVICE_EVENT_ADD("ddl scheduler", "create index",
4554"tenant_id", arg.tenant_id_,
4555"ret", ret,
4556"trace_id", *ObCurTraceId::get_trace_id(),
4557"task_id", res.task_id_,
4558"table_id", table_id_buffer,
4559"schema_version", res.schema_version_);
4560LOG_INFO("finish create index ddl", K(ret), K(arg), K(res), "ddl_event_info", ObDDLEventInfo());
4561return ret;
4562}
4563
4564int ObRootService::create_mlog(const obrpc::ObCreateMLogArg &arg, obrpc::ObCreateMLogRes &res)
4565{
4566int ret = OB_SUCCESS;
4567if (!inited_) {
4568ret = OB_NOT_INIT;
4569LOG_WARN("not init", KR(ret));
4570} else if (!arg.is_valid()) {
4571ret = OB_INVALID_ARGUMENT;
4572LOG_WARN("invalid arg", KR(ret), K(arg));
4573} else {
4574ObSchemaGetterGuard schema_guard;
4575ObMLogBuilder mlog_builder(ddl_service_);
4576if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
4577arg.tenant_id_, schema_guard))) {
4578LOG_WARN("get schema guard in inner table failed", K(ret));
4579} else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) {
4580LOG_WARN("check parallel ddl conflict failed", K(ret));
4581} else if (OB_FAIL(mlog_builder.init())) {
4582LOG_WARN("failed to init mlog builder", KR(ret));
4583} else if (OB_FAIL(mlog_builder.create_mlog(schema_guard, arg, res))) {
4584LOG_WARN("failed to create mlog", KR(ret), K(arg));
4585}
4586}
4587return ret;
4588}
4589
4590int ObRootService::drop_table(const obrpc::ObDropTableArg &arg, obrpc::ObDDLRes &res)
4591{
4592int ret = OB_SUCCESS;
4593uint64_t target_object_id = OB_INVALID_ID;
4594int64_t schema_version = OB_INVALID_SCHEMA_VERSION;
4595bool need_add_to_ddl_scheduler = arg.is_add_to_scheduler_;
4596const uint64_t tenant_id = arg.tenant_id_;
4597ObSchemaGetterGuard schema_guard;
4598if (!inited_) {
4599ret = OB_NOT_INIT;
4600LOG_WARN("not init", K(ret));
4601} else if (!arg.is_valid()) {
4602ret = OB_INVALID_ARGUMENT;
4603LOG_WARN("invalid arg", K(arg), K(ret));
4604} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4605LOG_WARN("fail to get schema guard with version in inner table", K(ret), K(arg));
4606} else if (need_add_to_ddl_scheduler) {
4607// to decide wherther to add to ddl scheduler.
4608// 1. do not add to scheduler if all tables do not exist.
4609// 2. do not add to scheduler if all existed tables are temporary tables.
4610need_add_to_ddl_scheduler = arg.tables_.count() == 0 ? false : true;
4611for (int64_t i = 0; OB_SUCC(ret) && need_add_to_ddl_scheduler && i < arg.tables_.count(); ++i) {
4612int tmp_ret = OB_SUCCESS;
4613const ObTableItem &table_item = arg.tables_.at(i);
4614const ObTableSchema *table_schema = nullptr;
4615if (OB_SUCCESS != (tmp_ret = ddl_service_.check_table_exists(tenant_id,
4616table_item,
4617arg.table_type_,
4618schema_guard,
4619&table_schema))) {
4620LOG_INFO("check table exist failed, generate error msg in ddl service later", K(ret), K(tmp_ret));
4621}
4622if (OB_FAIL(ret)) {
4623} else if (nullptr != table_schema) {
4624if (table_schema->is_tmp_table()) {
4625// do nothing.
4626} else if (OB_INVALID_ID == target_object_id || OB_INVALID_SCHEMA_VERSION == schema_version) {
4627// regard table_id, schema_version of the the first table as the tag to submit ddl task.
4628target_object_id = table_schema->get_table_id();
4629schema_version = table_schema->get_schema_version();
4630}
4631}
4632}
4633// all tables do not exist, or all existed tables are temporary tables.
4634if (OB_INVALID_ID == target_object_id || OB_INVALID_SCHEMA_VERSION == schema_version) {
4635need_add_to_ddl_scheduler = false;
4636}
4637}
4638
4639if (OB_FAIL(ret)) {
4640} else if (need_add_to_ddl_scheduler) {
4641ObDDLTaskRecord task_record;
4642ObArenaAllocator allocator(lib::ObLabel("DdlTaskTmp"));
4643ObCreateDDLTaskParam param(tenant_id,
4644ObDDLType::DDL_DROP_TABLE,
4645nullptr,
4646nullptr,
4647target_object_id,
4648schema_version,
4649arg.parallelism_,
4650arg.consumer_group_id_,
4651&allocator,
4652&arg,
46530 /* parent task id*/);
4654if (OB_UNLIKELY(OB_INVALID_ID == target_object_id || OB_INVALID_SCHEMA_VERSION == schema_version)) {
4655ret = OB_ERR_UNEXPECTED;
4656LOG_WARN("error unexpected", K(ret), K(arg), K(target_object_id), K(schema_version));
4657} else if (OB_FAIL(ddl_scheduler_.create_ddl_task(param, sql_proxy_, task_record))) {
4658LOG_WARN("submit ddl task failed", K(ret), K(arg));
4659} else if (OB_FAIL(ddl_scheduler_.schedule_ddl_task(task_record))) {
4660LOG_WARN("fail to schedule ddl task", K(ret), K(task_record));
4661} else {
4662res.tenant_id_ = tenant_id;
4663res.schema_id_ = target_object_id;
4664res.task_id_ = task_record.task_id_;
4665}
4666} else if (OB_FAIL(ddl_service_.drop_table(arg, res))) {
4667LOG_WARN("ddl service failed to drop table", K(ret), K(arg), K(res));
4668}
4669ROOTSERVICE_EVENT_ADD("ddl scheduler", "drop table",
4670"tenant_id", arg.tenant_id_,
4671"ret", ret,
4672"trace_id", *ObCurTraceId::get_trace_id(),
4673"task_id", res.task_id_,
4674"session_id", arg.session_id_,
4675"schema_version", res.schema_id_);
4676LOG_INFO("finish drop table ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
4677return ret;
4678}
4679
4680int ObRootService::drop_database(const obrpc::ObDropDatabaseArg &arg, ObDropDatabaseRes &drop_database_res)
4681{
4682int ret = OB_SUCCESS;
4683uint64_t database_id = 0;
4684int64_t schema_version = 0;
4685bool need_add_to_scheduler = arg.is_add_to_scheduler_;
4686const uint64_t tenant_id = arg.tenant_id_;
4687if (!inited_) {
4688ret = OB_NOT_INIT;
4689LOG_WARN("not init", K(ret));
4690} else if (!arg.is_valid()) {
4691ret = OB_INVALID_ARGUMENT;
4692LOG_WARN("invalid arg", K(arg), K(ret));
4693} else if (need_add_to_scheduler) {
4694ObSchemaGetterGuard schema_guard;
4695if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4696LOG_WARN("get schema guard in inner table failed", K(ret), K(tenant_id));
4697} else if (OB_FAIL(schema_guard.get_schema_version(tenant_id, schema_version))) {
4698LOG_WARN("fail to get schema version", K(ret), K(arg));
4699} else if (OB_FAIL(schema_guard.get_database_id(tenant_id, arg.database_name_, database_id))) {
4700LOG_WARN("fail to get database id");
4701} else if (OB_INVALID_ID == database_id) {
4702// drop database if exists xxx.
4703need_add_to_scheduler = false;
4704}
4705}
4706
4707if (OB_FAIL(ret)) {
4708} else if (need_add_to_scheduler) {
4709ObDDLTaskRecord task_record;
4710ObArenaAllocator allocator(lib::ObLabel("DdlTaskTmp"));
4711ObCreateDDLTaskParam param(tenant_id,
4712ObDDLType::DDL_DROP_DATABASE,
4713nullptr,
4714nullptr,
4715database_id,
4716schema_version,
4717arg.parallelism_,
4718arg.consumer_group_id_,
4719&allocator,
4720&arg,
47210 /* parent task id*/);
4722if (OB_FAIL(ddl_scheduler_.create_ddl_task(param, sql_proxy_, task_record))) {
4723LOG_WARN("submit ddl task failed", K(ret), K(arg));
4724} else if (OB_FAIL(ddl_scheduler_.schedule_ddl_task(task_record))) {
4725LOG_WARN("fail to schedule ddl task", K(ret), K(task_record));
4726} else {
4727drop_database_res.ddl_res_.tenant_id_ = tenant_id;
4728drop_database_res.ddl_res_.schema_id_ = database_id;
4729drop_database_res.ddl_res_.task_id_ = task_record.task_id_;
4730}
4731} else if (OB_FAIL(ddl_service_.drop_database(arg, drop_database_res))) {
4732LOG_WARN("ddl_service_ drop_database failed", K(arg), K(ret));
4733}
4734return ret;
4735}
4736
4737
4738int ObRootService::drop_tablegroup(const obrpc::ObDropTablegroupArg &arg)
4739{
4740int ret = OB_SUCCESS;
4741if (!inited_) {
4742ret = OB_NOT_INIT;
4743LOG_WARN("not init", K(ret));
4744} else if (!arg.is_valid()) {
4745ret = OB_INVALID_ARGUMENT;
4746LOG_WARN("invalid arg", K(arg), K(ret));
4747} else if (OB_FAIL(ddl_service_.drop_tablegroup(arg))) {
4748LOG_WARN("ddl_service_ drop_tablegroup failed", K(arg), K(ret));
4749}
4750return ret;
4751}
4752
4753int ObRootService::alter_tablegroup(const obrpc::ObAlterTablegroupArg &arg)
4754{
4755LOG_DEBUG("receive alter tablegroup arg", K(arg));
4756const ObTablegroupSchema *tablegroup_schema = NULL;
4757ObSchemaGetterGuard schema_guard;
4758uint64_t tablegroup_id = OB_INVALID_ID;
4759const uint64_t tenant_id = arg.tenant_id_;
4760int ret = OB_SUCCESS;
4761if (!inited_) {
4762ret = OB_NOT_INIT;
4763LOG_WARN("not init", K(ret));
4764} else if (!arg.is_valid()) {
4765ret = OB_INVALID_ARGUMENT;
4766LOG_WARN("invalid arg", K(arg), K(ret));
4767} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4768LOG_WARN("get schema guard in inner table failed", K(ret));
4769} else if (OB_FAIL(schema_guard.get_tablegroup_id(tenant_id,
4770arg.tablegroup_name_,
4771tablegroup_id))) {
4772LOG_WARN("fail to get tablegroup id", K(ret));
4773} else if (OB_INVALID_ID == tablegroup_id) {
4774ret = OB_TABLEGROUP_NOT_EXIST;
4775LOG_WARN("get invalid tablegroup schema", KR(ret), K(arg));
4776} else if (OB_FAIL(schema_guard.get_tablegroup_schema(tenant_id, tablegroup_id, tablegroup_schema))) {
4777LOG_WARN("fail to get tablegroup schema", K(ret), K(tenant_id), K(ret));
4778} else if (OB_ISNULL(tablegroup_schema)) {
4779ret = OB_TABLEGROUP_NOT_EXIST;
4780LOG_WARN("get invalid tablegroup schema", K(ret));
4781} else if (tablegroup_schema->is_in_splitting()) {
4782ret = OB_OP_NOT_ALLOW;
4783LOG_WARN("tablegroup is splitting, refuse to alter now", K(ret), K(tablegroup_id));
4784LOG_USER_ERROR(OB_OP_NOT_ALLOW, "tablegroup is splitting, alter tablegroup");
4785}
4786if (OB_FAIL(ret)) {
4787} else if (OB_FAIL(ddl_service_.alter_tablegroup(arg))) {
4788LOG_WARN("ddl_service_ alter tablegroup failed", K(arg), K(ret));
4789} else {
4790}
4791return ret;
4792}
4793
4794int ObRootService::drop_index(const obrpc::ObDropIndexArg &arg, obrpc::ObDropIndexRes &res)
4795{
4796int ret = OB_SUCCESS;
4797if (!inited_) {
4798ret = OB_NOT_INIT;
4799LOG_WARN("not init", K(ret));
4800} else if (!arg.is_valid()) {
4801ret = OB_INVALID_ARGUMENT;
4802LOG_WARN("invalid arg", K(arg), K(ret));
4803} else {
4804ObIndexBuilder index_builder(ddl_service_);
4805if (OB_FAIL(index_builder.drop_index(arg, res))) {
4806LOG_WARN("index_builder drop_index failed", K(arg), K(ret));
4807}
4808}
4809ROOTSERVICE_EVENT_ADD("ddl scheduler", "drop index",
4810"tenant_id", res.tenant_id_,
4811"ret", ret,
4812"trace_id", *ObCurTraceId::get_trace_id(),
4813"task_id", res.task_id_,
4814"table_id", arg.index_table_id_,
4815"schema_version", res.schema_version_);
4816LOG_INFO("finish drop index ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
4817return ret;
4818}
4819
4820int ObRootService::rebuild_index(const obrpc::ObRebuildIndexArg &arg, obrpc::ObAlterTableRes &res)
4821{
4822int ret = OB_SUCCESS;
4823if (!inited_) {
4824ret = OB_NOT_INIT;
4825LOG_WARN("not init", K(ret));
4826} else if (!arg.is_valid()) {
4827ret = OB_INVALID_ARGUMENT;
4828LOG_WARN("invalid arg", K(arg), K(ret));
4829} else if (OB_FAIL(ddl_service_.rebuild_index(arg, res))) {
4830LOG_WARN("ddl_service rebuild index failed", K(arg), K(ret));
4831}
4832ROOTSERVICE_EVENT_ADD("ddl scheduler", "rebuild index",
4833"tenant_id", arg.tenant_id_,
4834"ret", ret,
4835"trace_id", *ObCurTraceId::get_trace_id(),
4836"task_id", res.task_id_,
4837"table_id", arg.index_table_id_,
4838"schema_version", res.schema_version_);
4839LOG_INFO("finish rebuild index ddl", K(ret), K(arg), K(res), "ddl_event_info", ObDDLEventInfo());
4840return ret;
4841}
4842
4843int ObRootService::flashback_index(const ObFlashBackIndexArg &arg) {
4844int ret = OB_SUCCESS;
4845if (!inited_) {
4846ret = OB_NOT_INIT;
4847LOG_WARN("not init", K(ret));
4848} else if (!arg.is_valid()) {
4849ret = OB_INVALID_ARGUMENT;
4850LOG_WARN("invalid argument", K(arg), K(ret));
4851} else if (OB_FAIL(ddl_service_.flashback_index(arg))) {
4852LOG_WARN("failed to flashback index", K(ret));
4853}
4854
4855return ret;
4856}
4857
4858int ObRootService::purge_index(const ObPurgeIndexArg &arg)
4859{
4860int ret = OB_SUCCESS;
4861if (!inited_) {
4862ret = OB_NOT_INIT;
4863LOG_WARN("not init", K(ret));
4864} else if (!arg.is_valid()) {
4865ret = OB_INVALID_ARGUMENT;
4866LOG_WARN("invalid argument", K(arg), K(ret));
4867} else if (OB_FAIL(ddl_service_.purge_index(arg))) {
4868LOG_WARN("failed to purge index", K(ret));
4869}
4870
4871return ret;
4872}
4873
4874int ObRootService::rename_table(const obrpc::ObRenameTableArg &arg)
4875{
4876int ret = OB_SUCCESS;
4877if (!inited_) {
4878ret = OB_NOT_INIT;
4879LOG_WARN("not init", K(ret));
4880} else if (!arg.is_valid()) {
4881ret = OB_INVALID_ARGUMENT;
4882LOG_WARN("invalid arg", K(arg), K(ret));
4883} else if (OB_FAIL(ddl_service_.rename_table(arg))){
4884LOG_WARN("rename table failed", K(ret));
4885}
4886return ret;
4887}
4888
4889int ObRootService::truncate_table(const obrpc::ObTruncateTableArg &arg, obrpc::ObDDLRes &res)
4890{
4891int ret = OB_SUCCESS;
4892if (!inited_) {
4893ret = OB_NOT_INIT;
4894LOG_WARN("not init", K(ret));
4895} else if (!arg.is_valid()) {
4896ret = OB_INVALID_ARGUMENT;
4897LOG_WARN("invalid arg", K(arg), K(ret));
4898} else {
4899SCN frozen_scn;
4900if (OB_FAIL(ObMajorFreezeHelper::get_frozen_scn(arg.tenant_id_, frozen_scn))) {
4901LOG_WARN("get_frozen_scn failed", K(ret));
4902} else if (arg.is_add_to_scheduler_) {
4903ObDDLTaskRecord task_record;
4904ObArenaAllocator allocator(lib::ObLabel("DdlTaskTmp"));
4905ObSchemaGetterGuard schema_guard;
4906const ObTableSchema *table_schema = nullptr;
4907const uint64_t tenant_id = arg.tenant_id_;
4908if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
4909LOG_WARN("get schema guard in inner table failed", K(ret));
4910} else if (OB_FAIL(schema_guard.get_table_schema(tenant_id, arg.database_name_,
4911arg.table_name_, false /* is_index */,
4912table_schema))) {
4913LOG_WARN("fail to get table schema", K(ret));
4914} else if (OB_ISNULL(table_schema)) {
4915ret = OB_TABLE_NOT_EXIST;
4916LOG_WARN("table not exist", K(ret), K(arg));
4917} else {
4918ObCreateDDLTaskParam param(tenant_id,
4919ObDDLType::DDL_TRUNCATE_TABLE,
4920nullptr,
4921nullptr,
4922table_schema->get_table_id(),
4923table_schema->get_schema_version(),
4924arg.parallelism_,
4925arg.consumer_group_id_,
4926&allocator,
4927&arg,
49280 /* parent task id*/);
4929if (OB_FAIL(GCTX.root_service_->get_ddl_scheduler().create_ddl_task(param, sql_proxy_, task_record))) {
4930LOG_WARN("submit ddl task failed", K(ret), K(arg));
4931} else if (OB_FAIL(ddl_scheduler_.schedule_ddl_task(task_record))) {
4932LOG_WARN("fail to schedule ddl task", K(ret), K(task_record));
4933} else {
4934res.tenant_id_ = tenant_id;
4935res.schema_id_ = table_schema->get_table_id();
4936res.task_id_ = task_record.task_id_;
4937}
4938}
4939} else if (OB_FAIL(ddl_service_.truncate_table(arg, res, frozen_scn))) {
4940LOG_WARN("ddl service failed to truncate table", K(arg), K(ret), K(frozen_scn));
4941}
4942}
4943ROOTSERVICE_EVENT_ADD("ddl scheduler", "truncate table",
4944"tenant_id", arg.tenant_id_,
4945"ret", ret,
4946"trace_id", *ObCurTraceId::get_trace_id(),
4947"task_id", res.task_id_,
4948"table_id", arg.table_name_,
4949"schema_version", res.schema_id_);
4950LOG_INFO("finish truncate table ddl", K(ret), K(arg), K(res), "ddl_event_info", ObDDLEventInfo());
4951return ret;
4952}
4953
4954/*
4955* new parallel truncate table
4956*/
4957int ObRootService::truncate_table_v2(const obrpc::ObTruncateTableArg &arg, obrpc::ObDDLRes &res)
4958{
4959int ret = OB_SUCCESS;
4960if (!inited_) {
4961ret = OB_NOT_INIT;
4962LOG_WARN("not init", K(ret));
4963} else if (!arg.is_valid()) {
4964ret = OB_INVALID_ARGUMENT;
4965LOG_WARN("invalid arg", K(arg), K(ret));
4966} else {
4967SCN frozen_scn;
4968if (OB_FAIL(ObMajorFreezeHelper::get_frozen_scn(arg.tenant_id_, frozen_scn))) {
4969LOG_WARN("get_frozen_scn failed", K(ret));
4970} else if (OB_FAIL(ddl_service_.new_truncate_table(arg, res, frozen_scn))) {
4971LOG_WARN("ddl service failed to truncate table", K(arg), K(ret));
4972}
4973ROOTSERVICE_EVENT_ADD("ddl scheduler", "truncate table new",
4974"tenant_id", arg.tenant_id_,
4975"ret", ret,
4976"trace_id", *ObCurTraceId::get_trace_id(),
4977"task_id", res.task_id_,
4978"table_name", arg.table_name_,
4979"schema_version", res.schema_id_,
4980frozen_scn);
4981LOG_INFO("finish new truncate table ddl", K(ret), K(arg), K(res), "ddl_event_info", ObDDLEventInfo());
4982}
4983return ret;
4984}
4985
4986int ObRootService::create_table_like(const ObCreateTableLikeArg &arg)
4987{
4988int ret = OB_SUCCESS;
4989if (!inited_) {
4990ret = OB_NOT_INIT;
4991LOG_WARN("not init", K(ret));
4992} else if (!arg.is_valid()) {
4993ret = OB_INVALID_ARGUMENT;
4994LOG_WARN("invalid arg", K(arg), K(ret));
4995} else {
4996if (OB_FAIL(ddl_service_.create_table_like(arg))) {
4997if (OB_ERR_TABLE_EXIST == ret) {
4998//create table xx if not exist like
4999if (arg.if_not_exist_) {
5000LOG_USER_NOTE(OB_ERR_TABLE_EXIST,
5001arg.new_table_name_.length(), arg.new_table_name_.ptr());
5002LOG_WARN("table is exist, no need to create again", K(arg), K(ret));
5003ret = OB_SUCCESS;
5004} else {
5005ret = OB_ERR_TABLE_EXIST;
5006LOG_USER_ERROR(OB_ERR_TABLE_EXIST, arg.new_table_name_.length(), arg.new_table_name_.ptr());
5007LOG_WARN("table is exist, cannot create it twice", K(arg), K(ret));
5008}
5009}
5010}
5011}
5012return ret;
5013}
5014
5015/**
5016* recyclebin related
5017*/
5018int ObRootService::flashback_table_from_recyclebin(const ObFlashBackTableFromRecyclebinArg &arg)
5019{
5020int ret = OB_SUCCESS;
5021if (!inited_) {
5022ret = OB_NOT_INIT;
5023LOG_WARN("not init", K(ret));
5024} else if (!arg.is_valid()) {
5025ret = OB_INVALID_ARGUMENT;
5026LOG_WARN("invalid argument", K(arg), K(ret));
5027} else if (OB_FAIL(ddl_service_.flashback_table_from_recyclebin(arg))) {
5028LOG_WARN("failed to flash back table", K(ret));
5029}
5030return ret;
5031}
5032
5033int ObRootService::flashback_table_to_time_point(const obrpc::ObFlashBackTableToScnArg &arg)
5034{
5035int ret = OB_SUCCESS;
5036LOG_INFO("receive flashback table arg", K(arg));
5037
5038if (!inited_) {
5039ret = OB_NOT_INIT;
5040LOG_WARN("not init", K(ret));
5041} else if (!arg.is_valid()) {
5042ret = OB_INVALID_ARGUMENT;
5043LOG_WARN("invalid argument", K(ret), K(arg));
5044} else if (OB_FAIL(ddl_service_.flashback_table_to_time_point(arg))) {
5045LOG_WARN("failed to flash back table", K(ret));
5046}
5047return ret;
5048}
5049
5050int ObRootService::purge_table(const ObPurgeTableArg &arg)
5051{
5052int ret = OB_SUCCESS;
5053if (!inited_) {
5054ret = OB_NOT_INIT;
5055LOG_WARN("not init", K(ret));
5056} else if (!arg.is_valid()) {
5057ret = OB_INVALID_ARGUMENT;
5058LOG_WARN("invalid argument", K(arg), K(ret));
5059} else if (OB_FAIL(ddl_service_.purge_table(arg))) {
5060LOG_WARN("failed to purge table", K(ret));
5061}
5062return ret;
5063}
5064
5065int ObRootService::flashback_database(const ObFlashBackDatabaseArg &arg)
5066{
5067int ret = OB_SUCCESS;
5068if (!inited_) {
5069ret = OB_NOT_INIT;
5070LOG_WARN("not init", K(ret));
5071} else if (!arg.is_valid()) {
5072ret = OB_INVALID_ARGUMENT;
5073LOG_WARN("invalid argument", K(arg), K(ret));
5074} else if (OB_FAIL(ddl_service_.flashback_database(arg))) {
5075LOG_WARN("failed to flash back database", K(ret));
5076}
5077return ret;
5078}
5079
5080int ObRootService::purge_database(const ObPurgeDatabaseArg &arg)
5081{
5082int ret = OB_SUCCESS;
5083if (!inited_) {
5084ret = OB_NOT_INIT;
5085LOG_WARN("not init", K(ret));
5086} else if (!arg.is_valid()) {
5087ret = OB_INVALID_ARGUMENT;
5088LOG_WARN("invalid argument", K(arg), K(ret));
5089} else if (OB_FAIL(ddl_service_.purge_database(arg))) {
5090LOG_WARN("failed to purge database", K(ret));
5091}
5092return ret;
5093}
5094
5095int ObRootService::purge_expire_recycle_objects(const ObPurgeRecycleBinArg &arg, Int64 &affected_rows)
5096{
5097int ret = OB_SUCCESS;
5098int64_t purged_objects = 0;
5099if (!inited_) {
5100ret = OB_NOT_INIT;
5101LOG_WARN("not init", K(ret));
5102} else if (OB_FAIL(ddl_service_.purge_tenant_expire_recycle_objects(arg, purged_objects))) {
5103LOG_WARN("failed to purge expire recyclebin objects", K(ret), K(arg));
5104} else {
5105affected_rows = purged_objects;
5106}
5107return ret;
5108}
5109
5110int ObRootService::optimize_table(const ObOptimizeTableArg &arg)
5111{
5112int ret = OB_SUCCESS;
5113ObSchemaGetterGuard schema_guard;
5114LOG_INFO("receive optimize table request", K(arg));
5115lib::Worker::CompatMode mode;
5116if (!arg.is_valid()) {
5117ret = OB_INVALID_ARGUMENT;
5118LOG_WARN("invalid arguments", K(ret), K(arg));
5119} else if (OB_ISNULL(schema_service_)) {
5120ret = OB_ERR_UNEXPECTED;
5121LOG_WARN("error unexpected, schema service must not be NULL", K(ret));
5122} else if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(arg.tenant_id_, mode))) {
5123LOG_WARN("fail to get tenant mode", K(ret));
5124} else {
5125const int64_t all_core_table_id = OB_ALL_CORE_TABLE_TID;
5126for (int64_t i = 0; OB_SUCC(ret) && i < arg.tables_.count(); ++i) {
5127SMART_VAR(obrpc::ObAlterTableArg, alter_table_arg) {
5128ObSqlString sql;
5129const obrpc::ObTableItem &table_item = arg.tables_.at(i);
5130const ObTableSchema *table_schema = nullptr;
5131alter_table_arg.is_alter_options_ = true;
5132alter_table_arg.alter_table_schema_.set_origin_database_name(table_item.database_name_);
5133alter_table_arg.alter_table_schema_.set_origin_table_name(table_item.table_name_);
5134alter_table_arg.alter_table_schema_.set_tenant_id(arg.tenant_id_);
5135alter_table_arg.skip_sys_table_check_ = true;
5136//exec_tenant_id_ is used in standby cluster
5137alter_table_arg.exec_tenant_id_ = arg.exec_tenant_id_;
5138if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(arg.tenant_id_, schema_guard))) {
5139LOG_WARN("fail to get tenant schema guard", K(ret));
5140} else if (OB_FAIL(schema_guard.get_table_schema(arg.tenant_id_, table_item.database_name_, table_item.table_name_, false/*is index*/, table_schema))) {
5141LOG_WARN("fail to get table schema", K(ret));
5142} else if (nullptr == table_schema) {
5143// skip deleted table
5144} else if (all_core_table_id == table_schema->get_table_id()) {
5145// do nothing
5146} else {
5147if (lib::Worker::CompatMode::MYSQL == mode) {
5148if (OB_FAIL(sql.append_fmt("OPTIMIZE TABLE `%.*s`",
5149table_item.table_name_.length(), table_item.table_name_.ptr()))) {
5150LOG_WARN("fail to assign sql stmt", K(ret));
5151}
5152} else if (lib::Worker::CompatMode::ORACLE == mode) {
5153if (OB_FAIL(sql.append_fmt("ALTER TABLE \"%.*s\" SHRINK SPACE",
5154table_item.table_name_.length(), table_item.table_name_.ptr()))) {
5155LOG_WARN("fail to append fmt", K(ret));
5156}
5157} else {
5158ret = OB_ERR_UNEXPECTED;
5159LOG_WARN("error unexpected, unknown mode", K(ret), K(mode));
5160}
5161if (OB_SUCC(ret)) {
5162alter_table_arg.ddl_stmt_str_ = sql.string();
5163obrpc::ObAlterTableRes res;
5164if (OB_FAIL(alter_table_arg.alter_table_schema_.alter_option_bitset_.add_member(ObAlterTableArg::PROGRESSIVE_MERGE_ROUND))) {
5165LOG_WARN("fail to add member", K(ret));
5166} else if (OB_FAIL(alter_table(alter_table_arg, res))) {
5167LOG_WARN("fail to alter table", K(ret), K(alter_table_arg));
5168}
5169}
5170}
5171}
5172}
5173}
5174return ret;
5175}
5176
5177int ObRootService::calc_column_checksum_repsonse(const obrpc::ObCalcColumnChecksumResponseArg &arg)
5178{
5179int ret = OB_SUCCESS;
5180if (OB_UNLIKELY(!inited_)) {
5181ret = OB_NOT_INIT;
5182LOG_WARN("not inited", K(ret));
5183} else if (OB_UNLIKELY(!arg.is_valid())) {
5184ret = OB_INVALID_ARGUMENT;
5185LOG_WARN("invalid arguments", K(ret), K(arg));
5186} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, PROCESS_COLUMN_CHECKSUM_RESPONSE_SLOW))) {
5187LOG_WARN("ddl sim failure: procesc column checksum response slow", K(ret));
5188} else if (OB_FAIL(ddl_scheduler_.on_column_checksum_calc_reply(
5189arg.tablet_id_, ObDDLTaskKey(arg.tenant_id_, arg.target_table_id_, arg.schema_version_), arg.ret_code_))) {
5190LOG_WARN("handle column checksum calc response failed", K(ret), K(arg));
5191}
5192return ret;
5193}
5194
5195int ObRootService::refresh_config()
5196{
5197int ret = OB_SUCCESS;
5198int64_t local_config_version = 0;
5199if (!inited_) {
5200ret = OB_NOT_INIT;
5201LOG_WARN("not init", K(ret));
5202} else if (OB_FAIL(zone_manager_.get_config_version(local_config_version))) {
5203LOG_WARN("get_config_version failed", K(ret));
5204} else {
5205LOG_INFO("receive refresh config");
5206const int64_t now = ObTimeUtility::current_time();
5207const int64_t new_config_version = max(local_config_version + 1, now);
5208if (OB_FAIL(zone_manager_.update_config_version(new_config_version))) {
5209LOG_WARN("update_config_version failed", K(new_config_version), K(ret));
5210} else if (OB_FAIL(config_mgr_->got_version(new_config_version))) {
5211LOG_WARN("got_version failed", K(new_config_version), K(ret));
5212} else {
5213LOG_INFO("root service refresh_config succeed", K(new_config_version));
5214}
5215}
5216ROOTSERVICE_EVENT_ADD("root_service", "refresh_config", K(ret));
5217return ret;
5218}
5219
5220int ObRootService::root_minor_freeze(const ObRootMinorFreezeArg &arg)
5221{
5222int ret = OB_SUCCESS;
5223LOG_INFO("receive minor freeze request", K(arg));
5224
5225if (!inited_) {
5226ret = OB_NOT_INIT;
5227LOG_WARN("not init", K(ret));
5228} else if (!arg.is_valid()) {
5229ret = OB_INVALID_ARGUMENT;
5230LOG_WARN("invalid arg", K(arg), K(ret));
5231} else if (OB_FAIL(root_minor_freeze_.try_minor_freeze(arg))) {
5232LOG_WARN("minor freeze failed", K(ret), K(arg));
5233}
5234ROOTSERVICE_EVENT_ADD("root_service", "root_minor_freeze", K(ret), K(arg));
5235return ret;
5236}
5237
5238int ObRootService::update_index_status(const obrpc::ObUpdateIndexStatusArg &arg)
5239{
5240int ret = OB_SUCCESS;
5241if (!inited_) {
5242ret = OB_NOT_INIT;
5243LOG_WARN("not init", K(ret));
5244} else if (!arg.is_valid()) {
5245ret = OB_INVALID_ARGUMENT;
5246LOG_WARN("invalid arg", K(arg), K(ret));
5247} else if (OB_FAIL(ddl_service_.update_index_status(arg))) {
5248LOG_WARN("update index table status failed", K(ret), K(arg));
5249}
5250return ret;
5251}
5252
5253int ObRootService::update_mview_status(const obrpc::ObUpdateMViewStatusArg &arg)
5254{
5255int ret = OB_SUCCESS;
5256const uint64_t tenant_id = arg.exec_tenant_id_;
5257uint64_t compat_version = 0;
5258if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
5259LOG_WARN("fail to get data version", KR(ret), K(tenant_id));
5260} else if (compat_version < DATA_VERSION_4_3_0_0) {
5261ret = OB_NOT_SUPPORTED;
5262LOG_WARN("version lower than 4.3 does not support this operation", KR(ret));
5263LOG_USER_ERROR(OB_NOT_SUPPORTED, "tenant's data version is below 4.3.0.0, update mview status is ");
5264} else if (!inited_) {
5265ret = OB_NOT_INIT;
5266LOG_WARN("not init", K(ret));
5267} else if (!arg.is_valid()) {
5268ret = OB_INVALID_ARGUMENT;
5269LOG_WARN("invalid arg", KR(ret), K(arg));
5270} else if (OB_FAIL(ddl_service_.update_mview_status(arg))) {
5271LOG_WARN("update mview table status failed", KR(ret), K(arg));
5272}
5273return ret;
5274}
5275
5276int ObRootService::clone_tenant(const obrpc::ObCloneTenantArg &arg,
5277obrpc::ObCloneTenantRes &res)
5278{
5279int ret = OB_SUCCESS;
5280res.reset();
5281int64_t refreshed_schema_version = OB_INVALID_VERSION;
5282const ObString &clone_tenant_name = arg.get_new_tenant_name();
5283const ObString &source_tenant_name = arg.get_source_tenant_name();
5284const ObString &tenant_snapshot_name = arg.get_tenant_snapshot_name();
5285const bool is_fork_tenant = tenant_snapshot_name.empty();
5286uint64_t source_tenant_id = OB_INVALID_TENANT_ID;
5287int64_t job_id = OB_INVALID_ID;
5288ObTenantSnapItem tenant_snapshot_item;
5289bool is_unit_config_exist = false;
5290bool is_resource_pool_exist = false;
5291
5292if (!inited_) {
5293ret = OB_NOT_INIT;
5294LOG_WARN("not init", KR(ret));
5295} else if (!arg.is_valid()) {
5296ret = OB_INVALID_ARGUMENT;
5297LOG_WARN("invalid arg", KR(ret), K(arg));
5298} else if (OB_ISNULL(schema_service_)) {
5299ret = OB_ERR_UNEXPECTED;
5300LOG_WARN("unexpected schema_service_", KR(ret), KP(schema_service_));
5301} else if (GCTX.is_standby_cluster() || GCONF.in_upgrade_mode()) {
5302ret = OB_OP_NOT_ALLOW;
5303LOG_WARN("clone tenant while in standby cluster or in upgrade mode is not allowed", KR(ret));
5304LOG_USER_ERROR(OB_OP_NOT_ALLOW, "clone tenant while in standby cluster or in upgrade mode");
5305} else if (OB_FAIL(ObResolverUtils::check_not_supported_tenant_name(clone_tenant_name))) {
5306LOG_WARN("unsupported clone tenant name", KR(ret), K(clone_tenant_name));
5307} else {
5308ObSchemaGetterGuard schema_guard;
5309const ObTenantSchema *clone_tenant_schema = NULL;
5310const ObTenantSchema *source_tenant_schema = NULL;
5311if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
5312OB_SYS_TENANT_ID, schema_guard))) {
5313LOG_WARN("fail to get sys tenant's schema guard", KR(ret));
5314} else if (OB_FAIL(schema_guard.get_schema_version(OB_SYS_TENANT_ID, refreshed_schema_version))) {
5315LOG_WARN("fail to get sys schema version", KR(ret));
5316} else if (OB_FAIL(schema_guard.get_tenant_info(clone_tenant_name, clone_tenant_schema))) {
5317LOG_WARN("fail to get clone tenant schema", KR(ret), K(clone_tenant_name));
5318} else if (OB_NOT_NULL(clone_tenant_schema)) {
5319ret = OB_TENANT_EXIST;
5320LOG_WARN("clone tenant already exists", KR(ret), K(clone_tenant_name));
5321LOG_USER_ERROR(OB_TENANT_EXIST, to_cstring(clone_tenant_name));
5322} else if (OB_FAIL(schema_guard.get_tenant_info(source_tenant_name, source_tenant_schema))) {
5323LOG_WARN("fail to get source tenant info", KR(ret), K(source_tenant_name));
5324} else if (OB_ISNULL(source_tenant_schema)) {
5325ret = OB_TENANT_NOT_EXIST;
5326LOG_WARN("source tenant not exists", KR(ret), K(source_tenant_name));
5327LOG_USER_ERROR(OB_TENANT_NOT_EXIST, source_tenant_name.length(), source_tenant_name.ptr());
5328} else {
5329source_tenant_id = source_tenant_schema->get_tenant_id();
5330}
5331}
5332
5333if (FAILEDx(ObTenantSnapshotUtil::check_source_tenant_info(source_tenant_id,
5334ObTenantSnapshotUtil::RESTORE_OP))) {
5335LOG_WARN("source tenant can not do cloning", KR(ret), K(source_tenant_id));
5336} else if (OB_FAIL(unit_manager_.check_unit_config_exist(arg.get_unit_config_name(), is_unit_config_exist))) {
5337LOG_WARN("fail to check unit config exist", KR(ret), K(arg));
5338} else if (!is_unit_config_exist) {
5339ret = OB_RESOURCE_UNIT_NOT_EXIST;
5340LOG_USER_ERROR(OB_RESOURCE_UNIT_NOT_EXIST, to_cstring(arg.get_unit_config_name()));
5341LOG_WARN("config not exist", KR(ret), K(arg));
5342} else if (OB_FAIL(unit_manager_.check_resource_pool_exist(arg.get_resource_pool_name(), is_resource_pool_exist))) {
5343LOG_WARN("fail to check resource pool exist", KR(ret), K(arg));
5344} else if (is_resource_pool_exist) {
5345ret = OB_RESOURCE_POOL_EXIST;
5346LOG_USER_ERROR(OB_RESOURCE_POOL_EXIST, to_cstring(arg.get_resource_pool_name()));
5347LOG_WARN("resource_pool already exist", "name", arg.get_resource_pool_name(), K(ret));
5348} else if (is_fork_tenant) { // fork tenant (clone tenant without snapshot)
5349// precheck
5350if (OB_FAIL(ObTenantSnapshotUtil::check_log_archive_ready(source_tenant_id, source_tenant_name))) {
5351LOG_WARN("check log archive ready failed", KR(ret), K(source_tenant_id), K(source_tenant_name));
5352}
5353} else { // !is_fork_tenant (clone tenant with snapshot)
5354if (OB_FAIL(ObTenantSnapshotUtil::get_tenant_snapshot_info(sql_proxy_, source_tenant_id,
5355tenant_snapshot_name, tenant_snapshot_item))) {
5356LOG_WARN("get tenant snapshot info failed", KR(ret), K(source_tenant_id), K(tenant_snapshot_name));
5357if (OB_TENANT_SNAPSHOT_NOT_EXIST == ret) {
5358ret = OB_OP_NOT_ALLOW;
5359LOG_USER_ERROR(OB_OP_NOT_ALLOW, "tenant snapshot not exist in source tenant, clone tenant");
5360}
5361}
5362}
5363
5364if (OB_SUCC(ret)) {
5365ObCloneJob clone_job;
5366bool has_job = false;
5367SCN gts_scn;
5368ObDDLSQLTransaction trans(schema_service_, false /*end_signal*/);
5369if (OB_FAIL(trans.start(&sql_proxy_, OB_SYS_TENANT_ID, refreshed_schema_version))) {
5370LOG_WARN("failed to start trans", KR(ret));
5371} else if (OB_FAIL(OB_TS_MGR.get_ts_sync(OB_SYS_TENANT_ID, GCONF.rpc_timeout, gts_scn))) {
5372LOG_WARN("fail to get ts sync", KR(ret));
5373} else if (FALSE_IT(job_id = gts_scn.get_val_for_tx())) {
5374} else if (OB_FAIL(ObTenantCloneUtil::fill_clone_job(job_id, arg, source_tenant_id, source_tenant_name,
5375tenant_snapshot_item, clone_job))) {
5376LOG_WARN("fail to fill clone job", KR(ret), K(job_id), K(arg), K(source_tenant_id), K(tenant_snapshot_item));
5377} else if (OB_FAIL(ObTenantCloneUtil::record_clone_job(trans, clone_job))) {
5378LOG_WARN("fail to record clone job", KR(ret), K(clone_job));
5379} else {
5380res.set_job_id(job_id);
5381}
5382
5383if (trans.is_started()) {
5384int tmp_ret = OB_SUCCESS;
5385if (OB_TMP_FAIL(trans.end(OB_SUCC(ret)))) {
5386LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, KR(tmp_ret), KR(ret));
5387ret = (OB_SUCC(ret)) ? tmp_ret : ret;
5388}
5389}
5390}
5391
5392if (OB_SUCC(ret)) {
5393int tmp_ret = OB_SUCCESS;
5394if (OB_TMP_FAIL(ObTenantCloneUtil::notify_clone_scheduler(OB_SYS_TENANT_ID))) {
5395LOG_WARN("notify clone scheduler failed", KR(tmp_ret));
5396}
5397}
5398
5399LOG_INFO("[RESTORE] clone tenant start", KR(ret), K(arg));
5400ROOTSERVICE_EVENT_ADD("clone", "clone_start",
5401"job_id", job_id,
5402K(ret),
5403"clone_tenant_name", clone_tenant_name,
5404"source_tenant_name", source_tenant_name);
5405
5406if (OB_SUCC(ret)) {
5407const char *status_str = ObTenantCloneStatus::get_clone_status_str(
5408ObTenantCloneStatus::Status::CLONE_SYS_LOCK);
5409ROOTSERVICE_EVENT_ADD("clone", "change_clone_status",
5410"job_id", job_id,
5411K(ret),
5412"prev_clone_status", "NULL",
5413"cur_clone_status", status_str);
5414}
5415return ret;
5416}
5417
5418int ObRootService::init_debug_database()
5419{
5420const schema_create_func *creator_ptr_array[] = {
5421core_table_schema_creators,
5422sys_table_schema_creators,
5423NULL};
5424
5425int ret = OB_SUCCESS;
5426HEAP_VAR(char[OB_MAX_SQL_LENGTH], sql) {
5427if (!inited_) {
5428ret = OB_NOT_INIT;
5429LOG_WARN("not init", K(ret));
5430}
5431
5432ObTableSchema table_schema;
5433ObSqlString create_func_sql;
5434ObSqlString del_sql;
5435for (const schema_create_func **creator_ptr_ptr = creator_ptr_array;
5436OB_SUCCESS == ret && NULL != *creator_ptr_ptr; ++creator_ptr_ptr) {
5437for (const schema_create_func *creator_ptr = *creator_ptr_ptr;
5438OB_SUCCESS == ret && NULL != *creator_ptr; ++creator_ptr) {
5439table_schema.reset();
5440create_func_sql.reset();
5441del_sql.reset();
5442if (OB_FAIL((*creator_ptr)(table_schema))) {
5443LOG_WARN("create table schema failed", K(ret));
5444ret = OB_SCHEMA_ERROR;
5445} else {
5446int64_t affected_rows = 0;
5447// ignore create function result
5448int temp_ret = OB_SUCCESS;
5449if (OB_SUCCESS != (temp_ret = create_func_sql.assign(
5450"create function time_to_usec(t timestamp) "
5451"returns bigint(20) deterministic begin return unix_timestamp(t); end;"))) {
5452LOG_WARN("create_func_sql assign failed", K(temp_ret));
5453} else if (OB_SUCCESS != (temp_ret = sql_proxy_.write(
5454create_func_sql.ptr(), affected_rows))) {
5455LOG_WARN("execute sql failed", K(create_func_sql), K(temp_ret));
5456} else if (OB_SUCCESS != (temp_ret = create_func_sql.assign(
5457"create function usec_to_time(u bigint(20)) "
5458"returns timestamp deterministic begin return from_unixtime(u); end;"))) {
5459LOG_WARN("create_func_sql assign failed", K(temp_ret));
5460} else if (OB_SUCCESS != (temp_ret = sql_proxy_.write(
5461create_func_sql.ptr(), affected_rows))) {
5462LOG_WARN("execute sql failed", K(create_func_sql), K(temp_ret));
5463}
5464
5465memset(sql, 0, sizeof(sql));
5466if (OB_FAIL(del_sql.assign_fmt(
5467"DROP table IF EXISTS %s", table_schema.get_table_name()))) {
5468LOG_WARN("assign sql failed", K(ret));
5469} else if (OB_FAIL(sql_proxy_.write(del_sql.ptr(), affected_rows))) {
5470LOG_WARN("execute sql failed", K(ret));
5471} else if (OB_FAIL(ObSchema2DDLSql::convert(
5472table_schema, sql, sizeof(sql)))) {
5473LOG_WARN("convert table schema to create table sql failed", K(ret));
5474} else if (OB_FAIL(sql_proxy_.write(sql, affected_rows))) {
5475LOG_WARN("execute sql failed", K(ret), K(sql));
5476}
5477}
5478}
5479}
5480
5481LOG_INFO("init debug database finish.", K(ret));
5482}
5483return ret;
5484}
5485
5486int ObRootService::do_restart()
5487{
5488int ret = OB_SUCCESS;
5489
5490const int64_t tenant_id = OB_SYS_TENANT_ID;
5491SpinWLockGuard rs_list_guard(broadcast_rs_list_lock_);
5492
5493// NOTE: following log print after lock
5494FLOG_INFO("[ROOTSERVICE_NOTICE] start do_restart");
5495
5496if (!inited_) {
5497ret = OB_NOT_INIT;
5498FLOG_WARN("not init", KR(ret));
5499} else if (!ObRootServiceRoleChecker::is_rootserver()) {
5500ret = OB_NOT_MASTER;
5501FLOG_WARN("not master", KR(ret));
5502}
5503
5504// renew master rootservice, ignore error
5505if (OB_SUCC(ret)) {
5506int tmp_ret = rs_mgr_->renew_master_rootserver();
5507if (OB_SUCCESS != tmp_ret) {
5508FLOG_WARN("renew master rootservice failed", KR(tmp_ret));
5509}
5510}
5511
5512//fetch root partition info
5513if (FAILEDx(fetch_sys_tenant_ls_info())) {
5514FLOG_WARN("fetch root partition info failed", KR(ret));
5515} else {
5516FLOG_INFO("fetch root partition info succeed", KR(ret));
5517}
5518
5519// broadcast root server address, ignore error
5520// not full service, can not update rs_list success
5521//if (OB_SUCC(ret)) {
5522// int tmp_ret = update_rslist();
5523// if (OB_SUCCESS != tmp_ret) {
5524// FLOG_WARN("failed to update rslist but ignored", KR(tmp_ret));
5525// }
5526//}
5527if (FAILEDx(submit_update_rslist_task(true))) {
5528FLOG_WARN("submit_update_rslist_task failed", KR(ret));
5529} else {
5530FLOG_INFO("submit_update_rslist_task succeed");
5531}
5532
5533if (OB_SUCC(ret)) {
5534//standby cluster trigger load_refresh_schema_status by heartbeat.
5535//due to switchover, primary cluster need to load schema_status too.
5536ObSchemaStatusProxy *schema_status_proxy = GCTX.schema_status_proxy_;
5537if (OB_ISNULL(schema_status_proxy)) {
5538ret = OB_ERR_UNEXPECTED;
5539FLOG_WARN("schema_status_proxy is null", KR(ret));
5540} else if (OB_FAIL(schema_status_proxy->load_refresh_schema_status())) {
5541FLOG_WARN("fail to load refresh schema status", KR(ret));
5542} else {
5543FLOG_INFO("load schema status success");
5544}
5545}
5546
5547bool load_frozen_status = true;
5548const bool refresh_server_need_retry = false; // no need retry
5549// try fast recover
5550if (OB_SUCC(ret)) {
5551int tmp_ret = refresh_server(load_frozen_status, refresh_server_need_retry);
5552if (OB_SUCCESS != tmp_ret) {
5553FLOG_WARN("refresh server failed", KR(tmp_ret), K(load_frozen_status));
5554}
5555tmp_ret = refresh_schema(load_frozen_status);
5556if (OB_SUCCESS != tmp_ret) {
5557FLOG_WARN("refresh schema failed", KR(tmp_ret), K(load_frozen_status));
5558}
5559}
5560load_frozen_status = false;
5561// refresh schema
5562if (FAILEDx(refresh_schema(load_frozen_status))) {
5563FLOG_WARN("refresh schema failed", KR(ret), K(load_frozen_status));
5564} else {
5565FLOG_INFO("success to refresh schema", K(load_frozen_status));
5566}
5567
5568// refresh server manager
5569if (FAILEDx(refresh_server(load_frozen_status, refresh_server_need_retry))) {
5570FLOG_WARN("refresh server failed", KR(ret), K(load_frozen_status));
5571} else {
5572FLOG_INFO("success to refresh server", K(load_frozen_status));
5573}
5574
5575// add other reload logic here
5576if (FAILEDx(zone_manager_.reload())) {
5577FLOG_WARN("zone_manager_ reload failed", KR(ret));
5578} else {
5579FLOG_INFO("success to reload zone_manager_");
5580}
5581
5582// start timer tasks
5583if (FAILEDx(start_timer_tasks())) {
5584FLOG_WARN("start timer tasks failed", KR(ret));
5585} else {
5586FLOG_INFO("success to start timer tasks");
5587}
5588
5589DEBUG_SYNC(BEFORE_UNIT_MANAGER_LOAD);
5590if (FAILEDx(unit_manager_.load())) {
5591FLOG_WARN("unit_manager_ load failed", KR(ret));
5592} else {
5593FLOG_INFO("load unit_manager success");
5594}
5595
5596/*
5597* FIXME: wanhong.wwh: need re-implement
5598if (OB_SUCC(ret)) {
5599if (OB_FAIL(set_core_table_unit_id())) {
5600LOG_WARN("START_SERVICE: set core table partition unit failed", K(ret));
5601} else {
5602ObTaskController::get().allow_next_syslog();
5603LOG_INFO("START_SERVICE: set core table unit id success");
5604}
5605}
5606*/
5607
5608if (FAILEDx(schema_history_recycler_.start())) {
5609FLOG_WARN("schema_history_recycler start failed", KR(ret));
5610} else {
5611FLOG_INFO("success to start schema_history_recycler");
5612}
5613
5614if (FAILEDx(root_balancer_.start())) {
5615FLOG_WARN("root balancer start failed", KR(ret));
5616} else {
5617FLOG_INFO("success to start root balancer");
5618}
5619
5620if (FAILEDx(thread_checker_.start())) {
5621FLOG_WARN("rs_monitor_check: start thread checker failed", KR(ret));
5622} else {
5623FLOG_INFO("success to start thread checker");
5624}
5625
5626if (FAILEDx(empty_server_checker_.start())) {
5627FLOG_WARN("start empty server checker failed", KR(ret));
5628} else {
5629FLOG_INFO("success to start empty server checker");
5630}
5631
5632if (FAILEDx(lost_replica_checker_.start())) {
5633FLOG_WARN("start lost replica checker failed", KR(ret));
5634} else {
5635FLOG_INFO("start lost replica checker success");
5636}
5637
5638// broadcast root server address again, this task must be in the end part of do_restart,
5639// because system may work properly without it.
5640//if (FAILEDx(update_rslist())) {
5641// FLOG_WARN("broadcast root address failed but ignored", KR(ret));
5642// it's ok ret be overwritten, update_rslist_task will retry until succeed
5643if (FAILEDx(submit_update_rslist_task(true))) {
5644FLOG_WARN("submit_update_rslist_task failed", KR(ret));
5645} else {
5646FLOG_INFO("submit_update_rslist_task succeed");
5647}
5648//} else {
5649// FLOG_INFO("broadcast root address succeed");
5650//}
5651
5652if (FAILEDx(report_single_replica(tenant_id, SYS_LS))) {
5653FLOG_WARN("report all_core_table replica failed, but ignore",
5654KR(ret), K(tenant_id), K(SYS_LS));
5655// it's ok ret be overwritten, report single all_core will retry until succeed
5656if (OB_FAIL(submit_report_core_table_replica_task())) {
5657FLOG_WARN("submit all core table replica task failed", KR(ret));
5658} else {
5659FLOG_INFO("submit all core table replica task succeed");
5660}
5661} else {
5662FLOG_INFO("report all_core_table replica finish");
5663}
5664
5665if (FAILEDx(ddl_scheduler_.start())) {
5666FLOG_WARN("fail to start ddl task scheduler", KR(ret));
5667} else {
5668FLOG_INFO("success to start ddl task scheduler");
5669}
5670
5671if (FAILEDx(dbms_job::ObDBMSJobMaster::get_instance().start())) {
5672FLOG_WARN("failed to start dbms job master", KR(ret));
5673} else {
5674FLOG_INFO("success to start dbms job master");
5675}
5676
5677if (FAILEDx(dbms_scheduler::ObDBMSSchedJobMaster::get_instance().start())) {
5678FLOG_WARN("failed to start dbms sched job master", KR(ret));
5679} else {
5680FLOG_INFO("success to start dbms sched job mstart");
5681}
5682
5683if (OB_SUCC(ret)) {
5684upgrade_executor_.start();
5685FLOG_INFO("success to start upgrade_executor_", KR(ret));
5686upgrade_storage_format_executor_.start();
5687FLOG_INFO("success to start upgrade_storage_format_executor_", KR(ret));
5688create_inner_schema_executor_.start();
5689FLOG_INFO("success to start create_inner_schema_executor_", KR(ret));
5690}
5691
5692// to avoid increase rootservice_epoch while fail to restart RS,
5693// put it and the end of restart RS.
5694if (FAILEDx(init_sequence_id())) {
5695FLOG_WARN("fail to init sequence id", KR(ret));
5696} else {
5697FLOG_INFO("success to init sequenxe id");
5698}
5699
5700
5701#ifdef OB_BUILD_TDE_SECURITY
5702if (FAILEDx(master_key_mgr_.start())) {
5703FLOG_WARN("fail to start master key manager", KR(ret));
5704} else {
5705FLOG_INFO("success to start master key manager");
5706}
5707#endif
5708
5709if (FAILEDx(disaster_recovery_task_mgr_.start())) {
5710FLOG_WARN("disaster recovery task manager start failed", KR(ret));
5711} else {
5712FLOG_INFO("success to start disaster recovery task manager");
5713}
5714
5715if (FAILEDx(rs_status_.set_rs_status(status::FULL_SERVICE))) {
5716FLOG_WARN("fail to set rs status", KR(ret));
5717} else {
5718FLOG_INFO("full_service !!! start to work!!");
5719ROOTSERVICE_EVENT_ADD("root_service", "full_rootservice",
5720"result", ret, K_(self_addr));
5721root_balancer_.set_active();
5722root_minor_freeze_.start();
5723FLOG_INFO("root_minor_freeze_ started");
5724root_inspection_.start();
5725FLOG_INFO("root_inspection_ started");
5726int64_t now = ObTimeUtility::current_time();
5727core_meta_table_version_ = now;
5728EVENT_SET(RS_START_SERVICE_TIME, now);
5729// reset fail count for self checker and print log.
5730reset_fail_count();
5731}
5732
5733if (OB_FAIL(ret)) {
5734update_fail_count(ret);
5735}
5736
5737FLOG_INFO("[ROOTSERVICE_NOTICE] finish do_restart", KR(ret));
5738return ret;
5739}
5740
5741bool ObRootService::in_service() const
5742{
5743return rs_status_.in_service();
5744}
5745
5746bool ObRootService::is_full_service() const
5747{
5748return rs_status_.is_full_service();
5749}
5750
5751bool ObRootService::is_start() const
5752{
5753return rs_status_.is_start();
5754}
5755
5756bool ObRootService::is_stopping() const
5757{
5758return rs_status_.is_stopping();
5759}
5760
5761bool ObRootService::is_need_stop() const
5762{
5763return rs_status_.is_need_stop();
5764}
5765
5766bool ObRootService::can_start_service() const
5767{
5768return rs_status_.can_start_service();
5769}
5770
5771int ObRootService::set_rs_status(const status::ObRootServiceStatus status)
5772{
5773return rs_status_.set_rs_status(status);
5774}
5775
5776bool ObRootService::need_do_restart() const
5777{
5778return rs_status_.need_do_restart();
5779}
5780
5781int ObRootService::revoke_rs()
5782{
5783return rs_status_.revoke_rs();
5784}
5785int ObRootService::check_parallel_ddl_conflict(
5786share::schema::ObSchemaGetterGuard &schema_guard,
5787const obrpc::ObDDLArg &arg)
5788{
5789int ret = OB_SUCCESS;
5790int64_t schema_version = OB_INVALID_VERSION;
5791
5792if (arg.is_need_check_based_schema_objects()) {
5793for (int64_t i = 0; OB_SUCC(ret) && (i < arg.based_schema_object_infos_.count()); ++i) {
5794const ObBasedSchemaObjectInfo &info = arg.based_schema_object_infos_.at(i);
5795if (OB_FAIL(schema_guard.get_schema_version(
5796info.schema_type_,
5797info.schema_tenant_id_ == OB_INVALID_TENANT_ID ? arg.exec_tenant_id_: info.schema_tenant_id_,
5798info.schema_id_,
5799schema_version))) {
5800LOG_WARN("failed to get_schema_version", K(ret), K(arg.exec_tenant_id_), K(info));
5801} else if (OB_INVALID_VERSION == schema_version) {
5802ret = OB_ERR_PARALLEL_DDL_CONFLICT;
5803LOG_WARN("schema_version is OB_INVALID_VERSION", K(ret), K(info));
5804} else if (schema_version != info.schema_version_) {
5805ret = OB_ERR_PARALLEL_DDL_CONFLICT;
5806LOG_WARN("schema_version is not equal to info.schema_version_", K(ret), K(schema_version), K(info));
5807}
5808}
5809}
5810
5811return ret;
5812}
5813
5814int ObRootService::init_sequence_id()
5815{
5816int ret = OB_SUCCESS;
5817ObMySQLTransaction trans;
5818if (OB_UNLIKELY(!inited_)) {
5819ret = OB_NOT_INIT;
5820LOG_WARN("not init", K(ret));
5821} else if (OB_ISNULL(schema_service_)) {
5822ret = OB_ERR_UNEXPECTED;
5823LOG_WARN("schema_service is null", K(ret), K(schema_service_));
5824} else if (OB_FAIL(trans.start(&sql_proxy_, OB_SYS_TENANT_ID))) {
5825LOG_WARN("trans start failed", K(ret));
5826} else {
5827ObGlobalStatProxy proxy(trans, OB_SYS_TENANT_ID);
5828ObSchemaService *schema_service = schema_service_->get_schema_service();
5829int64_t rootservice_epoch = 0;
5830int64_t schema_version = OB_INVALID_VERSION;
5831ObRefreshSchemaInfo schema_info;
5832//increase sequence_id can trigger every observer refresh schema while restart RS
5833if (OB_FAIL(proxy.inc_rootservice_epoch())) {
5834LOG_WARN("fail to increase rootservice_epoch", K(ret));
5835} else if (OB_FAIL(proxy.get_rootservice_epoch(rootservice_epoch))) {
5836LOG_WARN("fail to get rootservice start times", K(ret), K(rootservice_epoch));
5837} else if (rootservice_epoch <= 0) {
5838ret = OB_ERR_UNEXPECTED;
5839LOG_WARN("invalid rootservice_epoch", K(ret), K(rootservice_epoch));
5840} else if (OB_FAIL(schema_service->init_sequence_id(rootservice_epoch))) {
5841LOG_WARN("init sequence id failed", K(ret), K(rootservice_epoch));
5842} else if (OB_FAIL(schema_service_->get_tenant_refreshed_schema_version(OB_SYS_TENANT_ID, schema_version))) {
5843LOG_WARN("fail to get sys tenant refreshed schema version", K(ret));
5844} else if (schema_version <= OB_CORE_SCHEMA_VERSION + 1) {
5845// in bootstrap and new schema mode, to avoid write failure while schema_version change,
5846// only actively refresh schema at the end of bootstrap, and make heartbeat'srefresh_schema_info effective.
5847} else if (OB_FAIL(schema_service->set_refresh_schema_info(schema_info))) {
5848LOG_WARN("fail to set refresh schema info", K(ret), K(schema_info));
5849}
5850
5851int temp_ret = OB_SUCCESS;
5852if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCCESS == ret))) {
5853LOG_WARN("trans end failed", "commit", OB_SUCCESS == ret, K(temp_ret));
5854ret = (OB_SUCCESS == ret) ? temp_ret : ret;
5855}
5856}
5857return ret;
5858}
5859
5860int ObRootService::load_server_manager()
5861{
5862int ret = OB_SUCCESS;
5863if (OB_UNLIKELY(!inited_)) {
5864ret = OB_NOT_INIT;
5865LOG_WARN("not init", K(ret));
5866} else if (OB_FAIL(server_manager_.load_server_manager())) {
5867LOG_WARN("fail to load server manager", K(ret));
5868} else {} // no more to do
5869return ret;
5870}
5871
5872ERRSIM_POINT_DEF(ERROR_EVENT_TABLE_CLEAR_INTERVAL);
5873int ObRootService::start_timer_tasks()
5874{
5875int ret = OB_SUCCESS;
5876if (!inited_) {
5877ret = OB_NOT_INIT;
5878LOG_WARN("not init", K(ret));
5879}
5880
5881if (OB_SUCCESS == ret && !task_queue_.exist_timer_task(event_table_clear_task_)) {
5882const int64_t delay = ERROR_EVENT_TABLE_CLEAR_INTERVAL ? 10 * 1000 * 1000 :
5883ObEventHistoryTableOperator::EVENT_TABLE_CLEAR_INTERVAL;
5884if (OB_FAIL(task_queue_.add_repeat_timer_task_schedule_immediately(event_table_clear_task_, delay))) {
5885LOG_WARN("start event table clear task failed", K(delay), K(ret));
5886} else {
5887LOG_INFO("added event_table_clear_task", K(delay));
5888}
5889}
5890
5891if (OB_SUCC(ret) && !task_queue_.exist_timer_task(update_rs_list_timer_task_)) {
5892if (OB_FAIL(schedule_update_rs_list_task())) {
5893LOG_WARN("failed to schedule update rs list task", K(ret));
5894} else {
5895LOG_INFO("add update rs list timer task");
5896}
5897}
5898
5899if (OB_SUCC(ret) && !task_queue_.exist_timer_task(update_all_server_config_task_)) {
5900if (OB_FAIL(schedule_update_all_server_config_task())) {
5901LOG_WARN("fail to schedule update_all_server_config_task", KR(ret));
5902} else {
5903LOG_INFO("add update_all_server_config_task");
5904}
5905}
5906
5907if (OB_SUCC(ret)) {
5908if (OB_FAIL(schedule_inspector_task())) {
5909LOG_WARN("start inspector fail", K(ret));
5910} else {
5911LOG_INFO("start inspector success");
5912}
5913}
5914
5915if (OB_SUCC(ret) && !task_queue_.exist_timer_task(check_server_task_)) {
5916if (OB_FAIL(schedule_check_server_timer_task())) {
5917LOG_WARN("start all server checker fail", K(ret));
5918} else {
5919LOG_INFO("start all server checker success");
5920}
5921}
5922
5923if (OB_SUCC(ret)) {
5924if (OB_FAIL(schedule_load_ddl_task())) {
5925LOG_WARN("schedule load ddl task failed", K(ret));
5926}
5927}
5928
5929if (OB_SUCC(ret)) {
5930if (OB_FAIL(schedule_refresh_io_calibration_task())) {
5931LOG_WARN("schedule refresh io calibration task failed", K(ret));
5932}
5933}
5934
5935LOG_INFO("start all timer tasks finish", K(ret));
5936return ret;
5937}
5938
5939int ObRootService::stop_timer_tasks()
5940{
5941int ret = OB_SUCCESS;
5942if (!inited_) {
5943ret = OB_NOT_INIT;
5944LOG_WARN("not init", K(ret));
5945} else {
5946task_queue_.cancel_timer_task(restart_task_);
5947task_queue_.cancel_timer_task(check_server_task_);
5948task_queue_.cancel_timer_task(event_table_clear_task_);
5949task_queue_.cancel_timer_task(self_check_task_);
5950task_queue_.cancel_timer_task(update_rs_list_timer_task_);
5951task_queue_.cancel_timer_task(update_all_server_config_task_);
5952inspect_task_queue_.cancel_timer_task(inspector_task_);
5953inspect_task_queue_.cancel_timer_task(purge_recyclebin_task_);
5954}
5955
5956//stop other timer tasks here
5957LOG_INFO("stop all timer tasks finish", K(ret));
5958return ret;
5959}
5960
5961int ObRootService::fetch_sys_tenant_ls_info()
5962{
5963int ret = OB_SUCCESS;
5964ObLSReplica replica;
5965ObRole role = FOLLOWER;
5966bool inner_table_only = false;
5967ObMemberList member_list;
5968// TODO: automatically decide to use rpc or inmemory
5969ObLSTable* inmemory_ls;
5970if (OB_UNLIKELY(!inited_)) {
5971ret = OB_NOT_INIT;
5972LOG_WARN("not init", KR(ret));
5973} else if (OB_ISNULL(GCTX.ob_service_) || OB_ISNULL(GCTX.lst_operator_)) {
5974ret = OB_ERR_UNEXPECTED;
5975LOG_WARN("ob_service is null", KR(ret));
5976} else {
5977inmemory_ls = GCTX.lst_operator_->get_inmemory_ls();
5978if (OB_ISNULL(inmemory_ls)) {
5979ret = OB_ERR_UNEXPECTED;
5980LOG_WARN("inmemory ls_table is null", KR(ret), KP(inmemory_ls));
5981} else if (OB_FAIL(inmemory_ls->get_role(
5982OB_SYS_TENANT_ID,
5983SYS_LS,
5984role))) {
5985LOG_WARN("get role from ObLS failed", KR(ret));
5986} else if (OB_FAIL(inmemory_ls->get_member_list(
5987OB_SYS_TENANT_ID,
5988SYS_LS,
5989member_list))) {
5990LOG_WARN("get sys_tenant ls member list failed", KR(ret));
5991} else if (!is_strong_leader(role)) {
5992ret = OB_ENTRY_NOT_EXIST;
5993LOG_WARN("local role should be leader now", KR(ret), K(role));
5994} else if (OB_FAIL(GCTX.ob_service_->fill_ls_replica(
5995OB_SYS_TENANT_ID,
5996SYS_LS,
5997replica))) {
5998LOG_WARN("fail to fill log stream replica", KR(ret), K(replica));
5999} else if (OB_FAIL(inmemory_ls->update(replica, inner_table_only))) {
6000LOG_WARN("fail to update ls replica", KR(ret), K(replica));
6001}
6002}
6003
6004for (int64_t i = 0; OB_SUCC(ret) && i < member_list.get_member_number(); i++) {
6005ObAddr addr;
6006if (OB_FAIL(member_list.get_server_by_index(i, addr))) {
6007LOG_WARN("fail to get server", KR(ret), K(i), K(member_list));
6008} else if (self_addr_ == addr){
6009continue;
6010} else {
6011replica.reset();
6012int temp_ret = OB_SUCCESS;
6013if (OB_SUCCESS != (temp_ret = rpc_proxy_.to(addr).timeout(config_->rpc_timeout)
6014.by(OB_SYS_TENANT_ID).fetch_sys_ls(replica))) {
6015LOG_WARN("fetch sys_ls failed", K(temp_ret), "server", addr);
6016} else if (replica.is_strong_leader()) {
6017ret = OB_ENTRY_EXIST;
6018LOG_WARN("role should be follower", KR(ret), K(replica));
6019} else if (OB_FAIL(inmemory_ls->update(replica, inner_table_only))) {
6020LOG_WARN("update sys_ls info failed", KR(ret), K(replica));
6021} else {
6022LOG_INFO("update sys_tenant ls replica succeed", K(replica), "server", addr);
6023}
6024}
6025}
6026return ret;
6027}
6028
6029int ObRootService::not_implement()
6030{
6031int ret = OB_NOT_IMPLEMENT;
6032bt("not implement");
6033LOG_WARN("rpc not implemented", K(ret));
6034return ret;
6035}
6036
6037ObRootService::ObRestartTask::ObRestartTask(ObRootService &root_service)
6038:ObAsyncTimerTask(root_service.task_queue_),
6039root_service_(root_service)
6040{
6041set_retry_times(0); // don't retry when failed
6042}
6043
6044ObRootService::ObRestartTask::~ObRestartTask()
6045{
6046}
6047
6048int ObRootService::ObRestartTask::process()
6049{
6050int ret = OB_SUCCESS;
6051FLOG_INFO("after_restart task begin to process");
6052if (OB_FAIL(root_service_.after_restart())) {
6053LOG_WARN("root service after restart failed", K(ret));
6054}
6055FLOG_INFO("after_restart task process finish", KR(ret));
6056return ret;
6057}
6058
6059ObAsyncTask *ObRootService::ObRestartTask::deep_copy(char *buf, const int64_t buf_size) const
6060{
6061ObRestartTask *task = NULL;
6062if (NULL == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
6063LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buffer not large enough", K(buf_size));
6064} else {
6065task = new(buf) ObRestartTask(root_service_);
6066}
6067return task;
6068}
6069
6070ObRootService::ObRefreshServerTask::ObRefreshServerTask(ObRootService &root_service)
6071:ObAsyncTimerTask(root_service.task_queue_),
6072root_service_(root_service)
6073{
6074set_retry_times(0); // don't retry when process failed
6075}
6076
6077int ObRootService::ObRefreshServerTask::process()
6078{
6079int ret = OB_SUCCESS;
6080const bool load_frozen_status = true;
6081const bool need_retry = true;
6082FLOG_INFO("refresh server task process");
6083ObLatchRGuard guard(root_service_.bootstrap_lock_, ObLatchIds::RS_BOOTSTRAP_LOCK);
6084if (OB_FAIL(root_service_.refresh_server(load_frozen_status, need_retry))) {
6085FLOG_WARN("refresh server failed", K(ret), K(load_frozen_status));
6086} else {}
6087return ret;
6088}
6089
6090ObAsyncTask *ObRootService::ObRefreshServerTask::deep_copy(char *buf, const int64_t buf_size) const
6091{
6092ObRefreshServerTask *task = NULL;
6093if (NULL == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
6094LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buffer not large enough", K(buf_size));
6095} else {
6096task = new(buf) ObRefreshServerTask(root_service_);
6097}
6098return task;
6099}
6100
6101//-----Functions for managing privileges------
6102int ObRootService::create_user(obrpc::ObCreateUserArg &arg,
6103common::ObSArray<int64_t> &failed_index)
6104{
6105int ret = OB_SUCCESS;
6106failed_index.reset();
6107if (!inited_) {
6108ret = OB_NOT_INIT;
6109LOG_WARN("not init", K(ret));
6110} else if (!arg.is_valid()) {
6111ret = OB_INVALID_ARGUMENT;
6112LOG_WARN("invalid arg", K(arg), K(ret));
6113} else if (OB_FAIL(ddl_service_.create_user(arg, failed_index))){
6114LOG_WARN("create user failed", K(ret), K(arg));
6115}
6116return ret;
6117}
6118
6119int ObRootService::drop_user(const ObDropUserArg &arg,
6120common::ObSArray<int64_t> &failed_index)
6121{
6122int ret = OB_SUCCESS;
6123failed_index.reset();
6124if (!inited_) {
6125ret = OB_NOT_INIT;
6126LOG_WARN("not init", K(ret));
6127} else if (!arg.is_valid()) {
6128ret = OB_INVALID_ARGUMENT;
6129LOG_WARN("invalid arg", K(arg), K(ret));
6130} else if (OB_FAIL(ddl_service_.drop_user(arg, failed_index))) {
6131LOG_WARN("drop user failed", K(ret), K(arg));
6132}
6133return ret;
6134}
6135
6136int ObRootService::rename_user(const obrpc::ObRenameUserArg &arg,
6137common::ObSArray<int64_t> &failed_index)
6138{
6139int ret = OB_SUCCESS;
6140failed_index.reset();
6141if (!inited_) {
6142ret = OB_NOT_INIT;
6143LOG_WARN("not init", K(ret));
6144} else if (!arg.is_valid()) {
6145ret = OB_INVALID_ARGUMENT;
6146LOG_WARN("invalid arg", K(arg), K(ret));
6147} else if (OB_FAIL(ddl_service_.rename_user(arg, failed_index))){
6148LOG_WARN("rename user failed", K(arg), K(ret));
6149}
6150return ret;
6151}
6152
6153int ObRootService::alter_role(const obrpc::ObAlterRoleArg &arg)
6154{
6155int ret = OB_SUCCESS;
6156if (!inited_) {
6157ret = OB_NOT_INIT;
6158LOG_WARN("not init", K(ret));
6159} else if(!arg.is_valid()) {
6160ret = OB_INVALID_ARGUMENT;
6161LOG_WARN("invalid arg", K(arg), K(ret));
6162} else if (OB_FAIL(ddl_service_.alter_role(arg))) {
6163LOG_WARN("alter role failed", K(arg), K(ret));
6164}
6165return ret;
6166}
6167
6168int ObRootService::set_passwd(const obrpc::ObSetPasswdArg &arg)
6169{
6170int ret = OB_SUCCESS;
6171if (!inited_) {
6172ret = OB_NOT_INIT;
6173LOG_WARN("not init", K(ret));
6174} else if (!arg.is_valid()) {
6175ret = OB_INVALID_ARGUMENT;
6176LOG_WARN("invalid arg", K(arg), K(ret));
6177} else if (OB_FAIL(ddl_service_.set_passwd(arg))){
6178LOG_WARN("set passwd failed", K(arg), K(ret));
6179}
6180return ret;
6181}
6182
6183int ObRootService::grant(const ObGrantArg &arg)
6184{
6185int ret = OB_SUCCESS;
6186if (!inited_) {
6187ret = OB_NOT_INIT;
6188LOG_WARN("not init", K(ret));
6189} else if (!arg.is_valid()) {
6190ret = OB_INVALID_ARGUMENT;
6191LOG_WARN("invalid arg", K(arg), K(ret));
6192} else {
6193if (OB_FAIL(ddl_service_.grant(arg))) {
6194LOG_WARN("Grant user failed", K(arg), K(ret));
6195}
6196}
6197return ret;
6198}
6199
6200int ObRootService::revoke_user(const ObRevokeUserArg &arg)
6201{
6202int ret = OB_SUCCESS;
6203if (!inited_) {
6204ret = OB_NOT_INIT;
6205LOG_WARN("not init", K(ret));
6206} else if (!arg.is_valid()) {
6207ret = OB_INVALID_ARGUMENT;
6208LOG_WARN("invalid arg", K(arg), K(ret));
6209} else if (OB_FAIL(ddl_service_.revoke(arg))) {
6210LOG_WARN("revoke privilege failed", K(ret), K(arg));
6211}
6212return ret;
6213}
6214
6215int ObRootService::lock_user(const ObLockUserArg &arg, ObSArray<int64_t> &failed_index)
6216{
6217int ret = OB_SUCCESS;
6218failed_index.reset();
6219if (!inited_) {
6220ret = OB_NOT_INIT;
6221LOG_WARN("not init", K(ret));
6222} else if (!arg.is_valid()) {
6223ret = OB_INVALID_ARGUMENT;
6224LOG_WARN("invalid arg", K(arg), K(ret));
6225} else if (OB_FAIL(ddl_service_.lock_user(arg, failed_index))){
6226LOG_WARN("lock user failed", K(arg), K(ret));
6227}
6228return ret;
6229}
6230
6231int ObRootService::alter_user_profile(const ObAlterUserProfileArg &arg)
6232{
6233int ret = OB_SUCCESS;
6234if (!inited_) {
6235ret = OB_NOT_INIT;
6236LOG_WARN("not init", K(ret));
6237} else if (!arg.is_valid()) {
6238ret = OB_INVALID_ARGUMENT;
6239LOG_WARN("invalid arg", K(arg), K(ret));
6240} else if (OB_FAIL(ddl_service_.alter_user_profile(arg))){
6241LOG_WARN("lock user failed", K(arg), K(ret));
6242}
6243return ret;
6244}
6245
6246int ObRootService::create_directory(const obrpc::ObCreateDirectoryArg &arg)
6247{
6248int ret = OB_SUCCESS;
6249if (!inited_) {
6250ret = OB_NOT_INIT;
6251LOG_WARN("not init", K(ret));
6252} else if (OB_FAIL(ddl_service_.create_directory(arg, &arg.ddl_stmt_str_))) {
6253LOG_WARN("create directory failed", K(arg.schema_), K(ret));
6254}
6255return ret;
6256}
6257
6258int ObRootService::drop_directory(const obrpc::ObDropDirectoryArg &arg)
6259{
6260int ret = OB_SUCCESS;
6261if (!inited_) {
6262ret = OB_NOT_INIT;
6263LOG_WARN("not init", K(ret));
6264} else if (OB_FAIL(ddl_service_.drop_directory(arg, &arg.ddl_stmt_str_))) {
6265LOG_WARN("drop directory failed", K(arg.directory_name_), K(ret));
6266}
6267return ret;
6268}
6269
6270////////////////////////////////////////////////////////////////
6271// row level security
6272////////////////////////////////////////////////////////////////
6273
6274int ObRootService::handle_rls_policy_ddl(const obrpc::ObRlsPolicyDDLArg &arg)
6275{
6276int ret = OB_SUCCESS;
6277uint64_t data_version = 0;
6278if (!inited_) {
6279ret = OB_NOT_INIT;
6280LOG_WARN("not init", K(ret));
6281} else if (OB_FAIL(GET_MIN_DATA_VERSION(arg.exec_tenant_id_, data_version))) {
6282LOG_WARN("failed to get min data version", K(ret));
6283} else if (data_version < DATA_VERSION_4_1_0_0) {
6284ret = OB_NOT_SUPPORTED;
6285LOG_USER_ERROR(OB_NOT_SUPPORTED, "dbms_rls");
6286} else if (OB_FAIL(ddl_service_.handle_rls_policy_ddl(arg))) {
6287LOG_WARN("do rls policy ddl failed", K(arg), K(ret));
6288}
6289return ret;
6290}
6291
6292int ObRootService::handle_rls_group_ddl(const obrpc::ObRlsGroupDDLArg &arg)
6293{
6294int ret = OB_SUCCESS;
6295uint64_t data_version = 0;
6296if (!inited_) {
6297ret = OB_NOT_INIT;
6298LOG_WARN("not init", K(ret));
6299} else if (OB_FAIL(GET_MIN_DATA_VERSION(arg.exec_tenant_id_, data_version))) {
6300LOG_WARN("failed to get min data version", K(ret));
6301} else if (data_version < DATA_VERSION_4_1_0_0) {
6302ret = OB_NOT_SUPPORTED;
6303LOG_USER_ERROR(OB_NOT_SUPPORTED, "dbms_rls");
6304} else if (OB_FAIL(ddl_service_.handle_rls_group_ddl(arg))) {
6305LOG_WARN("do rls group ddl failed", K(arg), K(ret));
6306}
6307return ret;
6308}
6309
6310int ObRootService::handle_rls_context_ddl(const obrpc::ObRlsContextDDLArg &arg)
6311{
6312int ret = OB_SUCCESS;
6313uint64_t data_version = 0;
6314if (!inited_) {
6315ret = OB_NOT_INIT;
6316LOG_WARN("not init", K(ret));
6317} else if (OB_FAIL(GET_MIN_DATA_VERSION(arg.exec_tenant_id_, data_version))) {
6318LOG_WARN("failed to get min data version", K(ret));
6319} else if (data_version < DATA_VERSION_4_1_0_0) {
6320ret = OB_NOT_SUPPORTED;
6321LOG_USER_ERROR(OB_NOT_SUPPORTED, "dbms_rls");
6322} else if (OB_FAIL(ddl_service_.handle_rls_context_ddl(arg))) {
6323LOG_WARN("do rls context ddl failed", K(arg), K(ret));
6324}
6325return ret;
6326}
6327
6328int ObRootService::revoke_database(const ObRevokeDBArg &arg)
6329{
6330int ret = OB_SUCCESS;
6331if (!inited_) {
6332ret = OB_NOT_INIT;
6333LOG_WARN("not init", K(ret));
6334} else if (!arg.is_valid()) {
6335ret = OB_INVALID_ARGUMENT;
6336LOG_WARN("invalid arg", K(arg), K(ret));
6337} else {
6338ObOriginalDBKey db_key(arg.tenant_id_, arg.user_id_, arg.db_);
6339if (OB_FAIL(ddl_service_.revoke_database(db_key, arg.priv_set_))) {
6340LOG_WARN("Revoke db failed", K(arg), K(ret));
6341}
6342}
6343return ret;
6344}
6345
6346int ObRootService::revoke_table(const ObRevokeTableArg &arg)
6347{
6348int ret = OB_SUCCESS;
6349if (!inited_) {
6350ret = OB_NOT_INIT;
6351LOG_WARN("not init", K(ret));
6352} else if (!arg.is_valid()) {
6353ret = OB_INVALID_ARGUMENT;
6354LOG_WARN("invalid arg", K(arg), K(ret));
6355} else {
6356ObTablePrivSortKey table_priv_key(arg.tenant_id_, arg.user_id_, arg.db_, arg.table_);
6357ObObjPrivSortKey obj_priv_key(arg.tenant_id_,
6358arg.obj_id_,
6359arg.obj_type_,
6360OBJ_LEVEL_FOR_TAB_PRIV,
6361arg.grantor_id_,
6362arg.user_id_);
6363OZ (ddl_service_.revoke_table(table_priv_key,
6364arg.priv_set_,
6365obj_priv_key,
6366arg.obj_priv_array_,
6367arg.revoke_all_ora_));
6368}
6369return ret;
6370}
6371
6372int ObRootService::revoke_syspriv(const ObRevokeSysPrivArg &arg)
6373{
6374int ret = OB_SUCCESS;
6375if (!inited_) {
6376ret = OB_NOT_INIT;
6377LOG_WARN("not init", K(ret));
6378} else if (!arg.is_valid()) {
6379ret = OB_INVALID_ARGUMENT;
6380LOG_WARN("invalid arg", K(arg), K(ret));
6381} else if (OB_FAIL(ddl_service_.revoke_syspriv(arg.tenant_id_,
6382arg.grantee_id_,
6383arg.sys_priv_array_,
6384arg.role_ids_,
6385&arg.ddl_stmt_str_))) {
6386LOG_WARN("revoke privilege failed", K(ret), K(arg));
6387}
6388return ret;
6389}
6390
6391//-----End of functions for managing privileges-----
6392
6393//-----Functions for managing outlines-----
6394int ObRootService::create_outline(const ObCreateOutlineArg &arg)
6395{
6396int ret = OB_SUCCESS;
6397if (!inited_) {
6398ret = OB_NOT_INIT;
6399LOG_WARN("not init", K(ret));
6400} else if (!arg.is_valid()) {
6401ret = OB_INVALID_ARGUMENT;
6402LOG_WARN("invalid arg", K(arg), K(ret));
6403} else {
6404ObOutlineInfo outline_info = arg.outline_info_;
6405const bool is_or_replace = arg.or_replace_;
6406uint64_t tenant_id = outline_info.get_tenant_id();
6407ObString database_name = arg.db_name_;
6408ObSchemaGetterGuard schema_guard;
6409const ObDatabaseSchema *db_schema = NULL;
6410if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
6411LOG_WARN("get schema guard in inner table failed", K(ret));
6412} else if (database_name == OB_MOCK_DEFAULT_DATABASE_NAME) {
6413// if not specify database, set default database name and database id;
6414outline_info.set_database_id(OB_MOCK_DEFAULT_DATABASE_ID);
6415} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, database_name, db_schema))) {
6416LOG_WARN("get database schema failed", K(ret));
6417} else if (NULL == db_schema) {
6418ret = OB_ERR_BAD_DATABASE;
6419LOG_USER_ERROR(OB_ERR_BAD_DATABASE, database_name.length(), database_name.ptr());
6420} else if (db_schema->is_in_recyclebin()) {
6421ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
6422LOG_WARN("Can't not create outline of db in recyclebin", K(ret), K(arg), K(*db_schema));
6423} else if (OB_INVALID_ID == db_schema->get_database_id()) {
6424ret = OB_ERR_BAD_DATABASE;
6425LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
6426} else {
6427outline_info.set_database_id(db_schema->get_database_id());
6428}
6429
6430bool is_update = false;
6431if (OB_SUCC(ret)) {
6432if (OB_FAIL(ddl_service_.check_outline_exist(outline_info, is_or_replace, is_update))) {
6433LOG_WARN("failed to check_outline_exist", K(outline_info), K(ret));
6434}
6435}
6436
6437if (OB_SUCC(ret)) {
6438if (OB_FAIL(ddl_service_.create_outline(outline_info, is_update, &arg.ddl_stmt_str_, schema_guard))) {
6439LOG_WARN("create_outline failed", K(outline_info), K(is_update), K(ret));
6440}
6441}
6442}
6443return ret;
6444}
6445
6446int ObRootService::create_user_defined_function(const obrpc::ObCreateUserDefinedFunctionArg &arg)
6447{
6448int ret = OB_SUCCESS;
6449bool exist = false;
6450uint64_t udf_id = OB_INVALID_ID;
6451ObUDF udf_info_ = arg.udf_;
6452if (!inited_) {
6453ret = OB_NOT_INIT;
6454LOG_WARN("not init", K(ret));
6455} else if (!arg.is_valid()) {
6456ret = OB_INVALID_ARGUMENT;
6457LOG_WARN("invalid arg", K(arg), K(ret));
6458} else if (OB_FAIL(ddl_service_.check_udf_exist(arg.udf_.get_tenant_id(), arg.udf_.get_name_str(), exist, udf_id))) {
6459LOG_WARN("failed to check_udf_exist", K(arg.udf_.get_tenant_id()), K(arg.udf_.get_name_str()), K(exist), K(ret));
6460} else if (exist) {
6461ret = OB_UDF_EXISTS;
6462LOG_USER_ERROR(OB_UDF_EXISTS, arg.udf_.get_name_str().length(), arg.udf_.get_name_str().ptr());
6463} else if (OB_FAIL(ddl_service_.create_user_defined_function(udf_info_, arg.ddl_stmt_str_))) {
6464LOG_WARN("failed to create udf", K(arg), K(ret));
6465} else {/*do nothing*/}
6466return ret;
6467}
6468
6469int ObRootService::drop_user_defined_function(const obrpc::ObDropUserDefinedFunctionArg &arg)
6470{
6471int ret = OB_SUCCESS;
6472if (!inited_) {
6473ret = OB_NOT_INIT;
6474LOG_WARN("not init", K(ret));
6475} else if (!arg.is_valid()) {
6476ret = OB_INVALID_ARGUMENT;
6477LOG_WARN("invalid arg", K(arg), K(ret));
6478} else if (OB_FAIL(ddl_service_.drop_user_defined_function(arg))) {
6479LOG_WARN("failed to alter udf", K(arg), K(ret));
6480} else {/*do nothing*/}
6481
6482return ret;
6483}
6484
6485bool ObRootService::is_sys_tenant(const ObString &tenant_name)
6486{
6487return (0 == tenant_name.case_compare(OB_SYS_TENANT_NAME)
6488|| 0 == tenant_name.case_compare(OB_DIAG_TENANT_NAME)
6489|| 0 == tenant_name.case_compare(OB_GTS_TENANT_NAME));
6490}
6491
6492int ObRootService::alter_outline(const ObAlterOutlineArg &arg)
6493{
6494int ret = OB_SUCCESS;
6495if (!inited_) {
6496ret = OB_NOT_INIT;
6497LOG_WARN("not init", K(ret));
6498} else if (!arg.is_valid()) {
6499ret = OB_INVALID_ARGUMENT;
6500LOG_WARN("invalid arg", K(arg), K(ret));
6501} else if (OB_FAIL(ddl_service_.alter_outline(arg))) {
6502LOG_WARN("failed to alter outline", K(arg), K(ret));
6503} else {/*do nothing*/}
6504return ret;
6505}
6506
6507int ObRootService::drop_outline(const obrpc::ObDropOutlineArg &arg)
6508{
6509int ret = OB_SUCCESS;
6510if (!inited_) {
6511ret = OB_NOT_INIT;
6512LOG_WARN("not init", K(ret));
6513} else if (!arg.is_valid()) {
6514ret = OB_INVALID_ARGUMENT;
6515LOG_WARN("invalid arg", K(arg), K(ret));
6516} else {
6517if (OB_FAIL(ddl_service_.drop_outline(arg))) {
6518LOG_WARN("ddl service failed to drop outline", K(arg), K(ret));
6519}
6520}
6521return ret;
6522}
6523//-----End of functions for managing outlines-----
6524
6525int ObRootService::create_routine(const ObCreateRoutineArg &arg)
6526{
6527int ret = OB_SUCCESS;
6528if (!inited_) {
6529ret = OB_NOT_INIT;
6530LOG_WARN("not init", K(ret));
6531} else if (!arg.is_valid()) {
6532ret = OB_INVALID_ARGUMENT;
6533LOG_WARN("invalid arg", K(arg), K(ret));
6534} else {
6535ObRoutineInfo routine_info = arg.routine_info_;
6536const ObRoutineInfo* old_routine_info = NULL;
6537uint64_t tenant_id = routine_info.get_tenant_id();
6538ObString database_name = arg.db_name_;
6539bool is_or_replace = false;
6540bool is_inner = false;
6541ObSchemaGetterGuard schema_guard;
6542const ObDatabaseSchema *db_schema = NULL;
6543const ObUserInfo *user_info = NULL;
6544bool is_oracle_mode = false;
6545if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(
6546tenant_id, is_oracle_mode))) {
6547LOG_WARN("fail to check is oracle mode", K(ret));
6548} else {
6549is_or_replace = is_oracle_mode ? arg.is_or_replace_ : arg.is_need_alter_;
6550is_inner = is_oracle_mode ? false : arg.is_or_replace_;
6551}
6552
6553if (OB_FAIL(ret)) {
6554} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
6555LOG_WARN("get schema guard in inner table failed", K(ret));
6556} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, database_name, db_schema))) {
6557LOG_WARN("get database schema failed", K(ret));
6558} else if (NULL == db_schema) {
6559ret = OB_ERR_BAD_DATABASE;
6560LOG_USER_ERROR(OB_ERR_BAD_DATABASE, database_name.length(), database_name.ptr());
6561} else if (!is_inner && db_schema->is_in_recyclebin()) {
6562ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
6563LOG_WARN("Can't not create routine of db in recyclebin", K(ret), K(arg), K(*db_schema));
6564} else if (OB_INVALID_ID == db_schema->get_database_id()) {
6565ret = OB_ERR_BAD_DATABASE;
6566LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
6567} else {
6568routine_info.set_database_id(db_schema->get_database_id());
6569}
6570if (OB_SUCC(ret)
6571&& database_name.case_compare(OB_SYS_DATABASE_NAME) != 0
6572&& is_oracle_mode) {
6573if (OB_FAIL(schema_guard.get_user_info(
6574tenant_id, database_name, ObString(OB_DEFAULT_HOST_NAME), user_info))) {
6575LOG_WARN("failed to get user info", K(ret), K(database_name));
6576} else if (OB_ISNULL(user_info)) {
6577ret = OB_USER_NOT_EXIST;
6578LOG_WARN("user is does not exist", K(ret), K(database_name));
6579} else if (OB_INVALID_ID == user_info->get_user_id()) {
6580ret = OB_USER_NOT_EXIST;
6581LOG_WARN("user id is invalid", K(ret), K(database_name));
6582} else {
6583routine_info.set_owner_id(user_info->get_user_id());
6584}
6585}
6586if (OB_SUCC(ret)) {
6587ObArray<ObSchemaType> conflict_schema_types;
6588if (OB_FAIL(schema_guard.check_oracle_object_exist(tenant_id,
6589db_schema->get_database_id(), routine_info.get_routine_name(), ROUTINE_SCHEMA,
6590routine_info.get_routine_type(), is_or_replace, conflict_schema_types))) {
6591LOG_WARN("fail to check oracle_object exist", K(ret), K(routine_info.get_routine_name()));
6592} else if (conflict_schema_types.count() > 0) {
6593// 这里检查 oracle 模式下新对象的名字是否已经被其他对象占用了
6594ret = OB_ERR_EXIST_OBJECT;
6595LOG_WARN("Name is already used by an existing object in oralce mode",
6596K(ret), K(routine_info.get_routine_name()),
6597K(conflict_schema_types));
6598}
6599}
6600bool exist = false;
6601if (OB_SUCC(ret)) {
6602if (routine_info.get_routine_type() == ROUTINE_PROCEDURE_TYPE) {
6603if (OB_FAIL(schema_guard.check_standalone_procedure_exist(tenant_id, db_schema->get_database_id(),
6604routine_info.get_routine_name(), exist))) {
6605LOG_WARN("failed to check procedure info exist", K(routine_info), K(ret));
6606} else if (exist && !is_or_replace) {
6607ret = OB_ERR_SP_ALREADY_EXISTS;
6608LOG_USER_ERROR(OB_ERR_SP_ALREADY_EXISTS, "PROCEDURE",
6609routine_info.get_routine_name().length(), routine_info.get_routine_name().ptr());
6610} else if (exist && is_or_replace) {
6611if (OB_FAIL(schema_guard.get_standalone_procedure_info(tenant_id, db_schema->get_database_id(),
6612routine_info.get_routine_name(), old_routine_info))) {
6613LOG_WARN("failed to get standalone procedure info", K(routine_info), K(ret));
6614} else if (OB_ISNULL(old_routine_info)) {
6615ret = OB_ERR_UNEXPECTED;
6616LOG_WARN("old routine info is NULL", K(ret));
6617}
6618}
6619} else {
6620if (OB_FAIL(schema_guard.check_standalone_function_exist(tenant_id, db_schema->get_database_id(),
6621routine_info.get_routine_name(), exist))) {
6622LOG_WARN("failed to check function info exist", K(routine_info), K(ret));
6623} else if (exist && !is_or_replace) {
6624ret = OB_ERR_SP_ALREADY_EXISTS;
6625LOG_USER_ERROR(OB_ERR_SP_ALREADY_EXISTS, "FUNCTION",
6626routine_info.get_routine_name().length(), routine_info.get_routine_name().ptr());
6627} else if (exist && is_or_replace) {
6628if (OB_FAIL(schema_guard.get_standalone_function_info(tenant_id, db_schema->get_database_id(),
6629routine_info.get_routine_name(), old_routine_info))) {
6630LOG_WARN("failed to get standalone function info", K(routine_info), K(ret));
6631} else if (OB_ISNULL(old_routine_info)) {
6632ret = OB_ERR_UNEXPECTED;
6633LOG_WARN("old routine info is NULL", K(ret));
6634}
6635}
6636}
6637if (OB_SUCC(ret)) {
6638ObErrorInfo error_info = arg.error_info_;
6639ObSArray<ObDependencyInfo> &dep_infos =
6640const_cast<ObSArray<ObDependencyInfo> &>(arg.dependency_infos_);
6641if (OB_FAIL(ddl_service_.create_routine(routine_info,
6642old_routine_info,
6643(exist && is_or_replace),
6644error_info,
6645dep_infos,
6646&arg.ddl_stmt_str_,
6647schema_guard))) {
6648LOG_WARN("failed to replace routine", K(routine_info), K(ret));
6649}
6650}
6651}
6652}
6653return ret;
6654}
6655
6656int ObRootService::alter_routine(const ObCreateRoutineArg &arg)
6657{
6658int ret = OB_SUCCESS;
6659if (!inited_) {
6660ret = OB_NOT_INIT;
6661LOG_WARN("not init", K(ret));
6662} else if (!arg.is_valid()) {
6663ret = OB_INVALID_ARGUMENT;
6664LOG_WARN("invalid arg", K(arg), K(ret));
6665} else {
6666ObErrorInfo error_info = arg.error_info_;
6667const ObRoutineInfo *routine_info = NULL;
6668ObSchemaGetterGuard schema_guard;
6669bool is_oracle_mode = false;
6670const uint64_t tenant_id = arg.routine_info_.get_tenant_id();
6671if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(
6672tenant_id, is_oracle_mode))) {
6673LOG_WARN("fail to check is oracle mode", K(ret));
6674} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
6675tenant_id, schema_guard))) {
6676LOG_WARN("get schema guard in inner table failed", K(ret), K(tenant_id));
6677} else if (OB_FAIL(schema_guard.get_routine_info(
6678tenant_id, arg.routine_info_.get_routine_id(), routine_info))) {
6679LOG_WARN("failed to get routine info", K(ret), K(tenant_id));
6680} else if (OB_ISNULL(routine_info)) {
6681ret = OB_ERR_SP_DOES_NOT_EXIST;
6682LOG_WARN("routine info is not exist!", K(ret), K(arg.routine_info_));
6683}
6684if (OB_FAIL(ret)) {
6685} else if ((is_oracle_mode && arg.is_or_replace_) ||
6686(!is_oracle_mode && arg.is_need_alter_)) {
6687if (OB_FAIL(create_routine(arg))) {
6688LOG_WARN("failed to alter routine with create", K(ret));
6689}
6690} else {
6691if (OB_FAIL(ddl_service_.alter_routine(*routine_info, error_info, &arg.ddl_stmt_str_,
6692schema_guard))) {
6693LOG_WARN("alter routine failed", K(ret), K(arg.routine_info_), K(error_info));
6694}
6695}
6696}
6697return ret;
6698}
6699
6700int ObRootService::drop_routine(const ObDropRoutineArg &arg)
6701{
6702int ret = OB_SUCCESS;
6703if (!inited_) {
6704ret = OB_NOT_INIT;
6705LOG_WARN("not init", K(ret));
6706} else if (!arg.is_valid()) {
6707ret = OB_INVALID_ARGUMENT;
6708LOG_WARN("invalid arg", K(arg), K(ret));
6709} else {
6710uint64_t tenant_id = arg.tenant_id_;
6711const ObString &db_name = arg.db_name_;
6712const ObString &routine_name = arg.routine_name_;
6713ObRoutineType routine_type = arg.routine_type_;
6714ObSchemaGetterGuard schema_guard;
6715const ObDatabaseSchema *db_schema = NULL;
6716/*!
6717* 兼容mysql行为:
6718* create database test;
6719* use test;
6720* drop database test;
6721* drop function if exists no_such_func; -- warning 1035
6722* drop procedure if exists no_such_proc; -- error 1046
6723* drop function no_such_func; --error 1035
6724* drop procedure no_such_proc; --error 1046
6725*/
6726if (db_name.empty()) {
6727ret = OB_ERR_NO_DB_SELECTED;
6728LOG_WARN("no database selected", K(ret), K(db_name));
6729} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
6730LOG_WARN("get schema guard in inner table failed", K(ret));
6731} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, db_name, db_schema))) {
6732LOG_WARN("get database schema failed", K(ret));
6733} else if (NULL == db_schema) {
6734ret = OB_ERR_BAD_DATABASE;
6735LOG_USER_ERROR(OB_ERR_BAD_DATABASE, db_name.length(), db_name.ptr());
6736} else if (db_schema->is_in_recyclebin()) {
6737ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
6738LOG_WARN("Can't not create procedure of db in recyclebin", K(ret), K(arg), K(*db_schema));
6739} else if (OB_INVALID_ID == db_schema->get_database_id()) {
6740ret = OB_ERR_BAD_DATABASE;
6741LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
6742}
6743
6744if (OB_SUCC(ret)) {
6745bool exist = false;
6746const ObRoutineInfo *routine_info = NULL;
6747if (ROUTINE_PROCEDURE_TYPE == routine_type) {
6748if (OB_FAIL(schema_guard.check_standalone_procedure_exist(tenant_id, db_schema->get_database_id(),
6749routine_name, exist))) {
6750LOG_WARN("failed to check standalone procedure info exist", K(routine_name), K(ret));
6751} else if (exist) {
6752if (OB_FAIL(schema_guard.get_standalone_procedure_info(tenant_id, db_schema->get_database_id(),
6753routine_name, routine_info))) {
6754LOG_WARN("get procedure info failed", K(ret));
6755}
6756} else if (!arg.if_exist_) {
6757ret = OB_ERR_SP_DOES_NOT_EXIST;
6758LOG_USER_ERROR(OB_ERR_SP_DOES_NOT_EXIST, "PROCEDURE", db_name.length(), db_name.ptr(),
6759routine_name.length(), routine_name.ptr());
6760}
6761} else {
6762if (OB_FAIL(schema_guard.check_standalone_function_exist(tenant_id, db_schema->get_database_id(),
6763routine_name, exist))) {
6764LOG_WARN("failed to check standalone function info exist", K(routine_name), K(ret));
6765} else if (exist) {
6766if (OB_FAIL(schema_guard.get_standalone_function_info(tenant_id, db_schema->get_database_id(),
6767routine_name, routine_info))) {
6768LOG_WARN("get function info failed", K(ret));
6769}
6770} else if (!arg.if_exist_) {
6771ret = OB_ERR_SP_DOES_NOT_EXIST;
6772LOG_USER_ERROR(OB_ERR_SP_DOES_NOT_EXIST, "FUNCTION", db_name.length(), db_name.ptr(),
6773routine_name.length(), routine_name.ptr());
6774}
6775}
6776
6777if (OB_SUCC(ret) && !OB_ISNULL(routine_info)) {
6778ObErrorInfo error_info = arg.error_info_;
6779if (OB_FAIL(ddl_service_.drop_routine(*routine_info,
6780error_info,
6781&arg.ddl_stmt_str_,
6782schema_guard))) {
6783LOG_WARN("drop routine failed", K(ret), K(routine_name), K(routine_info));
6784}
6785}
6786}
6787if (OB_ERR_NO_DB_SELECTED == ret && ROUTINE_FUNCTION_TYPE == routine_type) {
6788if (arg.if_exist_) {
6789ret = OB_SUCCESS;
6790LOG_USER_WARN(OB_ERR_SP_DOES_NOT_EXIST, "FUNCTION (UDF)",
6791db_name.length(), db_name.ptr(),
6792routine_name.length(), routine_name.ptr());
6793} else {
6794ret = OB_ERR_SP_DOES_NOT_EXIST;
6795LOG_USER_ERROR(OB_ERR_SP_DOES_NOT_EXIST, "FUNCTION (UDF)",
6796db_name.length(), db_name.ptr(),
6797routine_name.length(), routine_name.ptr());
6798LOG_WARN("FUNCTION (UDF) does not exists", K(ret), K(routine_name), K(db_name));
6799}
6800}
6801}
6802return ret;
6803}
6804
6805int ObRootService::create_udt(const ObCreateUDTArg &arg)
6806{
6807int ret = OB_SUCCESS;
6808if (!inited_) {
6809ret = OB_NOT_INIT;
6810LOG_WARN("not init", K(ret));
6811} else if (!arg.is_valid()) {
6812ret = OB_INVALID_ARGUMENT;
6813LOG_WARN("invalid arg", K(arg), K(ret));
6814} else {
6815ObUDTTypeInfo udt_info = arg.udt_info_;
6816const ObUDTTypeInfo* old_udt_info = NULL;
6817uint64_t tenant_id = udt_info.get_tenant_id();
6818ObString database_name = arg.db_name_;
6819bool is_or_replace = arg.is_or_replace_;
6820ObSchemaGetterGuard schema_guard;
6821const ObDatabaseSchema *db_schema = NULL;
6822if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
6823LOG_WARN("get schema guard in inner table failed", K(ret));
6824} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, database_name, db_schema))) {
6825LOG_WARN("get database schema failed", K(ret));
6826} else if (NULL == db_schema) {
6827ret = OB_ERR_BAD_DATABASE;
6828LOG_USER_ERROR(OB_ERR_BAD_DATABASE, database_name.length(), database_name.ptr());
6829} else if (db_schema->is_in_recyclebin()) {
6830ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
6831LOG_WARN("Can't not create udt of db in recyclebin", K(ret), K(arg), K(*db_schema));
6832} else if (OB_INVALID_ID == db_schema->get_database_id()) {
6833ret = OB_ERR_BAD_DATABASE;
6834LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
6835} else {
6836udt_info.set_database_id(db_schema->get_database_id());
6837}
6838if (OB_SUCC(ret)) {
6839ObArray<ObSchemaType> conflict_schema_types;
6840if (OB_FAIL(schema_guard.check_oracle_object_exist(tenant_id, db_schema->get_database_id(),
6841udt_info.get_type_name(), UDT_SCHEMA, INVALID_ROUTINE_TYPE, is_or_replace,
6842conflict_schema_types))) {
6843LOG_WARN("fail to check oracle_object exist", K(ret), K(udt_info.get_type_name()));
6844} else if (1 == conflict_schema_types.count()
6845&& UDT_SCHEMA == conflict_schema_types.at(0) && udt_info.is_object_type()) {
6846// skip
6847} else if (conflict_schema_types.count() > 0) {
6848ret = OB_ERR_EXIST_OBJECT;
6849LOG_WARN("Name is already used by an existing object", K(ret), K(udt_info.get_type_name()),
6850K(conflict_schema_types));
6851}
6852}
6853bool exist = false;
6854ObUDTTypeCode type_code = udt_info.is_object_body_ddl()
6855? UDT_TYPE_OBJECT_BODY : static_cast<ObUDTTypeCode>(udt_info.get_typecode());
6856if (OB_SUCC(ret)) {
6857if (OB_FAIL(schema_guard.check_udt_exist(tenant_id,
6858db_schema->get_database_id(),
6859OB_INVALID_ID,
6860type_code,
6861udt_info.get_type_name(),
6862exist))) {
6863LOG_WARN("failed to check udt info exist", K(udt_info), K(ret));
6864} else if (exist && !is_or_replace) {
6865if (!udt_info.is_object_type()) {
6866ret = OB_ERR_SP_ALREADY_EXISTS;
6867LOG_USER_ERROR(OB_ERR_SP_ALREADY_EXISTS, "UDT",
6868udt_info.get_type_name().length(), udt_info.get_type_name().ptr());
6869}
6870} else {
6871// do nothing
6872}
6873if (exist && OB_SUCC(ret)) {
6874if (OB_FAIL(schema_guard.get_udt_info(tenant_id,
6875db_schema->get_database_id(),
6876OB_INVALID_ID,
6877udt_info.get_type_name(),
6878type_code,
6879old_udt_info))) {
6880LOG_WARN("failed to get udt info", K(udt_info), K(ret));
6881} else if (OB_ISNULL(old_udt_info)) {
6882ret = OB_ERR_UNEXPECTED;
6883LOG_WARN("old udt info is NULL", K(ret));
6884}
6885}
6886if (OB_SUCC(ret)
6887&& is_inner_pl_udt_id(udt_info.get_type_id())
6888&& type_code != UDT_TYPE_OBJECT_BODY) {
6889if (!exist) {
6890if (OB_FAIL(schema_guard.get_udt_info(tenant_id, udt_info.get_type_id(), old_udt_info))) {
6891LOG_WARN("failed to get udt info", K(ret), K(tenant_id), K(udt_info.get_type_id()));
6892} else if (OB_NOT_NULL(old_udt_info)) {
6893ret = OB_ERR_UNEXPECTED;
6894LOG_WARN("type id already used by other udt", K(ret), KPC(old_udt_info));
6895}
6896} else {
6897CK (OB_NOT_NULL(old_udt_info));
6898OV (old_udt_info->get_type_id() == udt_info.get_type_id(), OB_ERR_UNEXPECTED, KPC(old_udt_info), K(udt_info));
6899}
6900}
6901// 这儿检查object是否能插入,当name相同,且不是replace的时候,只有一种情况可以插入
6902// 新的body不为空,但是老的body为空,这说明需要增加body信息
6903if (OB_SUCC(ret) && exist && !is_or_replace) {
6904ret = OB_ERR_SP_ALREADY_EXISTS;
6905LOG_USER_ERROR(OB_ERR_SP_ALREADY_EXISTS, "UDT",
6906udt_info.get_type_name().length(), udt_info.get_type_name().ptr());
6907}
6908
6909if (OB_SUCC(ret)) {
6910ObErrorInfo error_info = arg.error_info_;
6911ObSArray<ObRoutineInfo> &public_routine_infos =
6912const_cast<ObSArray<ObRoutineInfo> &>(arg.public_routine_infos_);
6913ObSArray<ObDependencyInfo> &dep_infos =
6914const_cast<ObSArray<ObDependencyInfo> &>(arg.dependency_infos_);
6915if (OB_FAIL(ddl_service_.create_udt(udt_info,
6916old_udt_info,
6917(exist && is_or_replace),
6918public_routine_infos,
6919error_info,
6920schema_guard,
6921dep_infos,
6922&arg.ddl_stmt_str_))) {
6923LOG_WARN("failed to create udt", K(udt_info), K(ret));
6924}
6925}
6926}
6927}
6928return ret;
6929}
6930
6931int ObRootService::drop_udt(const ObDropUDTArg &arg)
6932{
6933int ret = OB_SUCCESS;
6934if (!inited_) {
6935ret = OB_NOT_INIT;
6936LOG_WARN("not init", K(ret));
6937} else if (!arg.is_valid()) {
6938ret = OB_INVALID_ARGUMENT;
6939LOG_WARN("invalid arg", K(arg), K(ret));
6940} else {
6941uint64_t tenant_id = arg.tenant_id_;
6942const ObString &db_name = arg.db_name_;
6943const ObString &udt_name = arg.udt_name_;
6944ObSchemaGetterGuard schema_guard;
6945const ObDatabaseSchema *db_schema = NULL;
6946if (db_name.empty()) {
6947ret = OB_ERR_NO_DB_SELECTED;
6948LOG_WARN("no database selected", K(ret), K(db_name));
6949} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
6950LOG_WARN("get schema guard in inner table failed", K(ret));
6951} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, db_name, db_schema))) {
6952LOG_WARN("get database schema failed", K(ret));
6953} else if (NULL == db_schema) {
6954ret = OB_ERR_BAD_DATABASE;
6955LOG_USER_ERROR(OB_ERR_BAD_DATABASE, db_name.length(), db_name.ptr());
6956} else if (db_schema->is_in_recyclebin()) {
6957ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
6958LOG_WARN("Can't not create udt of db in recyclebin", K(ret), K(arg), K(*db_schema));
6959} else if (OB_INVALID_ID == db_schema->get_database_id()) {
6960ret = OB_ERR_BAD_DATABASE;
6961LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
6962}
6963
6964if (OB_SUCC(ret)) {
6965if (!arg.is_type_body_) {
6966bool exist = false;
6967const ObUDTTypeInfo *udt_info = NULL;
6968ObUDTTypeInfo udt;
6969const ObUDTTypeCode type_code = ObUDTTypeCode::UDT_TYPE_OBJECT;
6970if (OB_FAIL(schema_guard.check_udt_exist(tenant_id,
6971db_schema->get_database_id(),
6972OB_INVALID_ID, type_code,
6973udt_name, exist))) {
6974LOG_WARN("failed to check udt info exist", K(udt_name), K(ret));
6975} else if (exist) {
6976if (OB_FAIL(schema_guard.get_udt_info(tenant_id,
6977db_schema->get_database_id(),
6978OB_INVALID_ID,
6979udt_name, type_code, udt_info))) {
6980LOG_WARN("get udt info failed", K(ret));
6981}
6982} else if (!arg.if_exist_) {
6983ret = OB_ERR_SP_DOES_NOT_EXIST;
6984LOG_USER_ERROR(OB_ERR_SP_DOES_NOT_EXIST, "UDT", db_name.length(), db_name.ptr(),
6985udt_name.length(), udt_name.ptr());
6986}
6987
6988if (OB_SUCC(ret) && !OB_ISNULL(udt_info)) {
6989if (OB_FAIL(udt.assign(*udt_info))) {
6990LOG_WARN("assign udt info failed", K(ret), KPC(udt_info));
6991} else if (udt.is_object_type()) {
6992udt.clear_property_flag(ObUDTTypeFlag::UDT_FLAG_OBJECT_TYPE_BODY);
6993udt.set_object_ddl_type(ObUDTTypeFlag::UDT_FLAG_OBJECT_TYPE_SPEC);
6994}
6995if (OB_SUCC(ret)
6996&& OB_FAIL(ddl_service_.drop_udt(udt, schema_guard, &arg.ddl_stmt_str_))) {
6997LOG_WARN("drop udt failed", K(ret), K(udt_name), K(*udt_info));
6998}
6999}
7000} else {
7001bool exist = false;
7002const ObUDTTypeInfo *udt_info = NULL;
7003ObUDTTypeInfo udt;
7004const ObUDTTypeCode type_code = ObUDTTypeCode::UDT_TYPE_OBJECT_BODY;
7005if (OB_FAIL(schema_guard.check_udt_exist(tenant_id,
7006db_schema->get_database_id(),
7007OB_INVALID_ID, type_code,
7008udt_name, exist))) {
7009LOG_WARN("failed to check udt info exist", K(udt_name), K(ret));
7010} else if (exist) {
7011if (OB_FAIL(schema_guard.get_udt_info(tenant_id,
7012db_schema->get_database_id(),
7013OB_INVALID_ID,
7014udt_name, type_code, udt_info))) {
7015LOG_WARN("get udt info failed", K(ret));
7016}
7017} else if (!arg.if_exist_) {
7018ret = OB_ERR_SP_DOES_NOT_EXIST;
7019LOG_USER_ERROR(OB_ERR_SP_DOES_NOT_EXIST, "UDT", db_name.length(), db_name.ptr(),
7020udt_name.length(), udt_name.ptr());
7021}
7022if (OB_SUCC(ret) && exist && !OB_ISNULL(udt_info)) {
7023if (OB_FAIL(udt.assign(*udt_info))) {
7024LOG_WARN("assign udt info failed", K(ret), KPC(udt_info));
7025} else if (udt.is_object_type()) {
7026udt.clear_property_flag(ObUDTTypeFlag::UDT_FLAG_OBJECT_TYPE_SPEC);
7027udt.set_object_ddl_type(ObUDTTypeFlag::UDT_FLAG_OBJECT_TYPE_BODY);
7028}
7029if (OB_SUCC(ret)
7030&& OB_FAIL(ddl_service_.drop_udt(udt, schema_guard, &arg.ddl_stmt_str_))) {
7031LOG_WARN("drop udt failed", K(ret), K(udt_name), K(*udt_info));
7032}
7033}
7034}
7035}
7036}
7037return ret;
7038}
7039
7040//----Functions for managing dblinks----
7041
7042int ObRootService::create_dblink(const obrpc::ObCreateDbLinkArg &arg)
7043{
7044int ret = OB_SUCCESS;
7045if (OB_FAIL(ddl_service_.create_dblink(arg, &arg.ddl_stmt_str_))) {
7046LOG_WARN("create_dblink failed", K(arg.dblink_info_), K(ret));
7047}
7048return ret;
7049}
7050
7051int ObRootService::drop_dblink(const obrpc::ObDropDbLinkArg &arg)
7052{
7053int ret = OB_SUCCESS;
7054if (OB_FAIL(ddl_service_.drop_dblink(arg, &arg.ddl_stmt_str_))) {
7055LOG_WARN("drop_dblink failed", K(arg.tenant_id_), K(arg.dblink_name_), K(ret));
7056}
7057return ret;
7058}
7059
7060
7061//----End of functions for managing dblinks----
7062
7063//-----Functions for managing synonyms-----
7064int ObRootService::create_synonym(const ObCreateSynonymArg &arg)
7065{
7066int ret = OB_SUCCESS;
7067if (!inited_) {
7068ret = OB_NOT_INIT;
7069LOG_WARN("not init", K(ret));
7070} else {
7071ObSynonymInfo synonym_info = arg.synonym_info_;
7072uint64_t tenant_id = synonym_info.get_tenant_id();
7073ObString database_name = arg.db_name_;
7074ObString obj_database_name = arg.obj_db_name_;
7075ObSchemaGetterGuard schema_guard;
7076const ObDatabaseSchema *db_schema = NULL;
7077const ObDatabaseSchema *obj_db_schema = NULL;
7078if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
7079LOG_WARN("get schema guard in inner table failed", K(ret));
7080} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, database_name, db_schema))) {
7081LOG_WARN("get database schema failed", K(database_name), K(ret));
7082} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, obj_database_name, obj_db_schema))) {
7083LOG_WARN("get database schema failed", K(obj_database_name), K(ret));
7084} else if (OB_ISNULL(db_schema)) {
7085ret = OB_ERR_BAD_DATABASE;
7086LOG_USER_ERROR(OB_ERR_BAD_DATABASE, database_name.length(), database_name.ptr());
7087} else if (OB_ISNULL(obj_db_schema)) {
7088ret = OB_ERR_BAD_DATABASE;
7089LOG_USER_ERROR(OB_ERR_BAD_DATABASE, obj_database_name.length(), obj_database_name.ptr());
7090} else if (OB_UNLIKELY(db_schema->is_in_recyclebin())
7091|| OB_UNLIKELY(obj_db_schema->is_in_recyclebin())) {
7092ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
7093LOG_WARN("can't create synonym of db in recyclebin", K(arg), KPC(db_schema), KPC(obj_db_schema), K(ret));
7094} else if (OB_UNLIKELY(OB_INVALID_ID == db_schema->get_database_id())
7095|| OB_UNLIKELY(OB_INVALID_ID == obj_db_schema->get_database_id())) {
7096ret = OB_ERR_BAD_DATABASE;
7097LOG_WARN("database id is invalid", K(tenant_id), KPC(db_schema), KPC(obj_db_schema), K(ret));
7098} else {
7099synonym_info.set_database_id(db_schema->get_database_id());
7100synonym_info.set_object_database_id(obj_db_schema->get_database_id());
7101}
7102bool is_update = false;
7103if (OB_SUCC(ret)) {
7104ObArray<ObSchemaType> conflict_schema_types;
7105if (OB_FAIL(schema_guard.check_oracle_object_exist(tenant_id, synonym_info.get_database_id(),
7106synonym_info.get_synonym_name_str(), SYNONYM_SCHEMA, INVALID_ROUTINE_TYPE,
7107arg.or_replace_, conflict_schema_types))) {
7108LOG_WARN("fail to check oracle_object exist", K(ret), K(synonym_info));
7109} else if (conflict_schema_types.count() > 0) {
7110ret = OB_ERR_EXIST_OBJECT;
7111LOG_WARN("Name is already used by an existing object",
7112K(ret), K(synonym_info), K(conflict_schema_types));
7113}
7114}
7115if (OB_SUCC(ret)) {
7116// can not delete, it will update synonym_info between check_synonym_exist.
7117if (OB_FAIL(ddl_service_.check_synonym_exist(synonym_info, arg.or_replace_, is_update))) {
7118LOG_WARN("failed to check_synonym_exist", K(synonym_info), K(arg.or_replace_), K(is_update), K(ret));
7119}
7120}
7121if (OB_SUCC(ret)) {
7122if (OB_FAIL(ddl_service_.create_synonym(synonym_info, arg.dependency_info_, &arg.ddl_stmt_str_, is_update, schema_guard))) {
7123LOG_WARN("create_synonym failed", K(synonym_info), K(ret));
7124}
7125}
7126}
7127return ret;
7128}
7129
7130int ObRootService::drop_synonym(const obrpc::ObDropSynonymArg &arg)
7131{
7132int ret = OB_SUCCESS;
7133if (!inited_) {
7134ret = OB_NOT_INIT;
7135LOG_WARN("not init", K(ret));
7136} else if (OB_FAIL(ddl_service_.drop_synonym(arg))) {
7137LOG_WARN("ddl service failed to drop synonym", K(arg), K(ret));
7138}
7139return ret;
7140}
7141//-----End of functions for managing synonyms-----
7142
7143#ifdef OB_BUILD_SPM
7144//-----Functions for managing plan_baselines-----
7145int ObRootService::accept_plan_baseline(const ObModifyPlanBaselineArg &arg)
7146{
7147int ret = OB_SUCCESS;
7148ObZone null_zone;
7149ObSEArray<ObAddr, 8> server_list;
7150if (!inited_) {
7151ret = OB_NOT_INIT;
7152LOG_WARN("not init", K(ret));
7153} else if (OB_FAIL(SVR_TRACER.get_alive_servers(null_zone, server_list))) {
7154LOG_WARN("fail to get alive server", K(ret));
7155} else {
7156for (int64_t i = 0; OB_SUCC(ret) && i < server_list.count(); i++) {
7157if (OB_FAIL(rpc_proxy_.to(server_list.at(i))
7158.by(arg.tenant_id_)
7159.as(arg.tenant_id_)
7160.svr_accept_plan_baseline(arg))) {
7161LOG_WARN("fail to accept plan baseline", K(ret), K(server_list.at(i)));
7162ret = OB_SUCCESS;
7163} else { /*do nothing*/}
7164}
7165}
7166return ret;
7167}
7168
7169int ObRootService::cancel_evolve_task(const ObModifyPlanBaselineArg &arg)
7170{
7171int ret = OB_SUCCESS;
7172ObZone null_zone;
7173ObSEArray<ObAddr, 8> server_list;
7174if (!inited_) {
7175ret = OB_NOT_INIT;
7176LOG_WARN("not init", K(ret));
7177} else if (OB_FAIL(SVR_TRACER.get_alive_servers(null_zone, server_list))) {
7178LOG_WARN("fail to get alive server", K(ret));
7179} else {
7180for (int64_t i = 0; OB_SUCC(ret) && i < server_list.count(); i++) {
7181if (OB_FAIL(rpc_proxy_.to(server_list.at(i))
7182.by(arg.tenant_id_)
7183.as(arg.tenant_id_)
7184.svr_cancel_evolve_task(arg))) {
7185LOG_WARN("fail to accept plan baseline", K(ret), K(server_list.at(i)));
7186ret = OB_SUCCESS;
7187} else { /*do nothing*/}
7188}
7189}
7190return ret;
7191}
7192
7193int ObRootService::admin_load_baseline(const obrpc::ObLoadPlanBaselineArg &arg)
7194{
7195int ret = OB_SUCCESS;
7196if (!inited_) {
7197ret = OB_NOT_INIT;
7198LOG_WARN("not init", K(ret));
7199} else {
7200ObSystemAdminCtx ctx;
7201if (OB_FAIL(init_sys_admin_ctx(ctx))) {
7202LOG_WARN("init_sys_admin_ctx failed", K(ret));
7203} else {
7204ObAdminLoadBaseline admin_util(ctx);
7205if (OB_FAIL(admin_util.execute(arg))) {
7206LOG_WARN("dispatch flush cache failed", K(arg), K(ret));
7207}
7208ROOTSERVICE_EVENT_ADD("root_service", "admin_load_baseline", K(ret), K(arg));
7209}
7210}
7211return ret;
7212}
7213
7214int ObRootService::admin_load_baseline_v2(const obrpc::ObLoadPlanBaselineArg &arg,
7215obrpc::ObLoadBaselineRes &res)
7216{
7217int ret = OB_SUCCESS;
7218if (!inited_) {
7219ret = OB_NOT_INIT;
7220LOG_WARN("not init", K(ret));
7221} else {
7222ObSystemAdminCtx ctx;
7223uint64_t load_count = 0;
7224if (OB_FAIL(init_sys_admin_ctx(ctx))) {
7225LOG_WARN("init_sys_admin_ctx failed", K(ret));
7226} else {
7227ObAdminLoadBaselineV2 admin_util(ctx);
7228if (OB_FAIL(admin_util.execute(arg, load_count))) {
7229LOG_WARN("dispatch flush cache failed", K(arg), K(ret));
7230} else {
7231res.load_count_ = load_count;
7232}
7233ROOTSERVICE_EVENT_ADD("root_service", "admin_load_baseline", K(ret), K(arg));
7234}
7235}
7236return ret;
7237}
7238
7239//-----End of functions for managing plan_baselines-----
7240#endif
7241
7242int ObRootService::admin_sync_rewrite_rules(const obrpc::ObSyncRewriteRuleArg &arg)
7243{
7244int ret = OB_SUCCESS;
7245if (!inited_) {
7246ret = OB_NOT_INIT;
7247LOG_WARN("not init", K(ret));
7248} else {
7249ObSystemAdminCtx ctx;
7250if (OB_FAIL(init_sys_admin_ctx(ctx))) {
7251LOG_WARN("init_sys_admin_ctx failed", K(ret));
7252} else {
7253ObAdminSyncRewriteRules admin_util(ctx);
7254if (OB_FAIL(admin_util.execute(arg))) {
7255LOG_WARN("dispatch sync rewrite rules failed", K(arg), K(ret));
7256}
7257ROOTSERVICE_EVENT_ADD("root_service", "admin_sync_rewrite_rules", K(ret), K(arg));
7258}
7259}
7260return ret;
7261}
7262
7263int ObRootService::create_package(const obrpc::ObCreatePackageArg &arg)
7264{
7265int ret = OB_SUCCESS;
7266if (!inited_) {
7267ret = OB_NOT_INIT;
7268LOG_WARN("not init", K(ret));
7269} else if (!arg.is_valid()) {
7270ret = OB_INVALID_ARGUMENT;
7271LOG_WARN("invalid arg", K(arg), K(ret));
7272} else {
7273ObPackageInfo new_package_info = arg.package_info_;
7274const ObPackageInfo *old_package_info = NULL;
7275uint64_t tenant_id = new_package_info.get_tenant_id();
7276ObString database_name = arg.db_name_;
7277ObSchemaGetterGuard schema_guard;
7278const ObDatabaseSchema *db_schema = NULL;
7279const ObUserInfo *user_info = NULL;
7280bool is_oracle_mode = false;
7281if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(
7282tenant_id, is_oracle_mode))) {
7283LOG_WARN("fail to check is oracle mode", K(ret));
7284} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
7285LOG_WARN("get schema guard in inner table failed", K(ret));
7286} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, database_name, db_schema))) {
7287LOG_WARN("get database schema failed", K(ret));
7288} else if (NULL == db_schema) {
7289ret = OB_ERR_BAD_DATABASE;
7290LOG_USER_ERROR(OB_ERR_BAD_DATABASE, database_name.length(), database_name.ptr());
7291} else if (db_schema->is_in_recyclebin()) {
7292ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
7293LOG_WARN("Can't not create package of db in recyclebin", K(ret), K(arg), K(*db_schema));
7294} else if (OB_INVALID_ID == db_schema->get_database_id()) {
7295ret = OB_ERR_BAD_DATABASE;
7296LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
7297} else {
7298new_package_info.set_database_id(db_schema->get_database_id());
7299}
7300if (OB_SUCC(ret)
7301&& database_name.case_compare(OB_SYS_DATABASE_NAME) != 0
7302&& is_oracle_mode) {
7303if (OB_FAIL(schema_guard.get_user_info(
7304tenant_id, database_name, ObString(OB_DEFAULT_HOST_NAME), user_info))) {
7305LOG_WARN("failed to get user info", K(ret), K(database_name));
7306} else if (OB_ISNULL(user_info)) {
7307ret = OB_USER_NOT_EXIST;
7308LOG_WARN("user is does not exist", K(ret), K(database_name));
7309} else if (OB_INVALID_ID == user_info->get_user_id()) {
7310ret = OB_USER_NOT_EXIST;
7311LOG_WARN("user id is invalid", K(ret), K(database_name));
7312} else {
7313new_package_info.set_owner_id(user_info->get_user_id());
7314}
7315}
7316if (OB_SUCC(ret)) {
7317ObArray<ObSchemaType> conflict_schema_types;
7318// package body 查重只比较有没有重复的 package body,package 查重需要比较除 package body 以外的对象
7319if (PACKAGE_TYPE == new_package_info.get_type()
7320&& OB_FAIL(schema_guard.check_oracle_object_exist(tenant_id,
7321db_schema->get_database_id(), new_package_info.get_package_name(), PACKAGE_SCHEMA,
7322INVALID_ROUTINE_TYPE, arg.is_replace_, conflict_schema_types))) {
7323LOG_WARN("fail to check object exist", K(ret), K(new_package_info.get_package_name()));
7324} else if (conflict_schema_types.count() > 0) {
7325// 这里检查 oracle 模式下新对象的名字是否已经被其他对象占用了
7326ret = OB_ERR_EXIST_OBJECT;
7327LOG_WARN("Name is already used by an existing object in oralce mode",
7328K(ret), K(new_package_info.get_package_name()),
7329K(conflict_schema_types));
7330}
7331}
7332if (OB_SUCC(ret)) {
7333if (OB_FAIL(schema_guard.get_package_info(tenant_id, db_schema->get_database_id(), new_package_info.get_package_name(),
7334new_package_info.get_type(), new_package_info.get_compatibility_mode(),
7335old_package_info))) {
7336LOG_WARN("failed to check package info exist", K(new_package_info), K(ret));
7337} else if (OB_ISNULL(old_package_info) || arg.is_replace_) {
7338bool need_create = true;
7339// 对于系统包, 为了避免多次重建, 比较下新的系统包与已经存在的系统包是否相同
7340if (OB_NOT_NULL(old_package_info) && OB_SYS_TENANT_ID == tenant_id) {
7341if (old_package_info->get_source().length() == new_package_info.get_source().length()
7342&& (0 == MEMCMP(old_package_info->get_source().ptr(),
7343new_package_info.get_source().ptr(),
7344old_package_info->get_source().length()))
7345&& old_package_info->get_exec_env() == new_package_info.get_exec_env()) {
7346need_create = false;
7347LOG_INFO("do not recreate package with same source",
7348K(ret),
7349K(old_package_info->get_source()),
7350K(new_package_info.get_source()), K(need_create));
7351} else {
7352LOG_INFO("recreate package with diff source",
7353K(ret),
7354K(old_package_info->get_source()),
7355K(new_package_info.get_source()), K(need_create));
7356}
7357}
7358if (need_create) {
7359ObSArray<ObRoutineInfo> &public_routine_infos = const_cast<ObSArray<ObRoutineInfo> &>(arg.public_routine_infos_);
7360ObErrorInfo error_info = arg.error_info_;
7361ObSArray<ObDependencyInfo> &dep_infos =
7362const_cast<ObSArray<ObDependencyInfo> &>(arg.dependency_infos_);
7363if (OB_FAIL(ddl_service_.create_package(schema_guard,
7364old_package_info,
7365new_package_info,
7366public_routine_infos,
7367error_info,
7368dep_infos,
7369&arg.ddl_stmt_str_))) {
7370LOG_WARN("create package failed", K(ret), K(new_package_info));
7371}
7372}
7373} else {
7374ret = OB_ERR_PACKAGE_ALREADY_EXISTS;
7375const char *type = (new_package_info.get_type() == PACKAGE_TYPE ? "PACKAGE" : "PACKAGE BODY");
7376LOG_USER_ERROR(OB_ERR_PACKAGE_ALREADY_EXISTS, type,
7377database_name.length(), database_name.ptr(),
7378new_package_info.get_package_name().length(), new_package_info.get_package_name().ptr());
7379}
7380}
7381}
7382return ret;
7383}
7384
7385int ObRootService::alter_package(const obrpc::ObAlterPackageArg &arg)
7386{
7387int ret = OB_SUCCESS;
7388if (!inited_) {
7389ret = OB_NOT_INIT;
7390LOG_WARN("not init", K(ret));
7391} else if (!arg.is_valid()) {
7392ret = OB_INVALID_ARGUMENT;
7393LOG_WARN("invalid arg", K(arg), K(ret));
7394} else {
7395uint64_t tenant_id = arg.tenant_id_;
7396const ObString &db_name = arg.db_name_;
7397const ObString &package_name = arg.package_name_;
7398ObPackageType package_type = arg.package_type_;
7399int64_t compatible_mode = arg.compatible_mode_;
7400ObSchemaGetterGuard schema_guard;
7401const ObDatabaseSchema *db_schema = NULL;
7402if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
7403LOG_WARN("get schema guard in inner table failed", K(ret));
7404} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, db_name, db_schema))) {
7405LOG_WARN("get database schema failed", K(ret));
7406} else if (NULL == db_schema) {
7407ret = OB_ERR_BAD_DATABASE;
7408LOG_WARN("database id is invalid", K(tenant_id), K(db_name), K(ret));
7409} else if (db_schema->is_in_recyclebin()) {
7410ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
7411LOG_WARN("Can't not create package of db in recyclebin", K(ret), K(arg), K(*db_schema));
7412}
7413if (OB_SUCC(ret)) {
7414bool exist = false;
7415ObSArray<ObRoutineInfo> &public_routine_infos = const_cast<ObSArray<ObRoutineInfo> &>(arg.public_routine_infos_);
7416if (OB_FAIL(schema_guard.check_package_exist(tenant_id, db_schema->get_database_id(),
7417package_name, package_type, compatible_mode, exist))) {
7418LOG_WARN("failed to check package info exist", K(package_name), K(ret));
7419} else if (exist) {
7420const ObPackageInfo *package_info = NULL;
7421if (OB_FAIL(schema_guard.get_package_info(tenant_id, db_schema->get_database_id(), package_name, package_type,
7422compatible_mode, package_info))) {
7423LOG_WARN("get package info failed", K(ret));
7424} else if (OB_ISNULL(package_info)) {
7425ret = OB_ERR_UNEXPECTED;
7426LOG_WARN("package info is null", K(db_schema->get_database_id()), K(package_name), K(package_type), K(ret));
7427} else if (OB_FAIL(ddl_service_.alter_package(schema_guard,
7428*package_info,
7429public_routine_infos,
7430const_cast<ObErrorInfo &>(arg.error_info_),
7431&arg.ddl_stmt_str_))) {
7432LOG_WARN("drop package failed", K(ret), K(package_name));
7433}
7434} else {
7435ret = OB_ERR_PACKAGE_DOSE_NOT_EXIST;
7436const char *type = (package_type == PACKAGE_TYPE ? "PACKAGE" : "PACKAGE BODY");
7437LOG_USER_ERROR(OB_ERR_PACKAGE_DOSE_NOT_EXIST, type,
7438db_schema->get_database_name_str().length(), db_schema->get_database_name(),
7439package_name.length(), package_name.ptr());
7440}
7441}
7442}
7443
7444return ret;
7445}
7446
7447int ObRootService::drop_package(const obrpc::ObDropPackageArg &arg)
7448{
7449int ret = OB_SUCCESS;
7450if (!inited_) {
7451ret = OB_NOT_INIT;
7452LOG_WARN("not init", K(ret));
7453} else if (!arg.is_valid()) {
7454ret = OB_INVALID_ARGUMENT;
7455LOG_WARN("invalid arg", K(arg), K(ret));
7456} else {
7457uint64_t tenant_id = arg.tenant_id_;
7458const ObString &db_name = arg.db_name_;
7459const ObString &package_name = arg.package_name_;
7460ObPackageType package_type = arg.package_type_;
7461int64_t compatible_mode = arg.compatible_mode_;
7462ObSchemaGetterGuard schema_guard;
7463const ObDatabaseSchema *db_schema = NULL;
7464if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
7465LOG_WARN("get schema guard in inner table failed", K(ret));
7466} else if (OB_FAIL(schema_guard.get_database_schema(tenant_id, db_name, db_schema))) {
7467LOG_WARN("get database schema failed", K(ret));
7468} else if (NULL == db_schema) {
7469ret = OB_ERR_BAD_DATABASE;
7470LOG_USER_ERROR(OB_ERR_BAD_DATABASE, db_name.length(), db_name.ptr());
7471} else if (db_schema->is_in_recyclebin()) {
7472ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT;
7473LOG_WARN("Can't not create package of db in recyclebin", K(ret), K(arg), K(*db_schema));
7474} else if (OB_INVALID_ID == db_schema->get_database_id()) {
7475ret = OB_ERR_BAD_DATABASE;
7476LOG_WARN("database id is invalid", K(tenant_id), K(*db_schema), K(ret));
7477}
7478if (OB_SUCC(ret)) {
7479bool exist = false;
7480if (OB_FAIL(schema_guard.check_package_exist(tenant_id, db_schema->get_database_id(),
7481package_name, package_type, compatible_mode, exist))) {
7482LOG_WARN("failed to check package info exist", K(package_name), K(ret));
7483} else if (exist) {
7484const ObPackageInfo *package_info = NULL;
7485ObErrorInfo error_info = arg.error_info_;
7486if (OB_FAIL(schema_guard.get_package_info(tenant_id, db_schema->get_database_id(), package_name, package_type, compatible_mode, package_info))) {
7487LOG_WARN("get package info failed", K(ret));
7488} else if (OB_FAIL(ddl_service_.drop_package(*package_info,
7489error_info,
7490&arg.ddl_stmt_str_))) {
7491LOG_WARN("drop package failed", K(ret), K(package_name));
7492}
7493} else {
7494ret = OB_ERR_PACKAGE_DOSE_NOT_EXIST;
7495const char *type = (package_type == PACKAGE_TYPE ? "PACKAGE" : "PACKAGE BODY");
7496LOG_USER_ERROR(OB_ERR_PACKAGE_DOSE_NOT_EXIST, type,
7497db_name.length(), db_name.ptr(),
7498package_name.length(), package_name.ptr());
7499}
7500}
7501}
7502return ret;
7503}
7504
7505int ObRootService::create_trigger(const obrpc::ObCreateTriggerArg &arg)
7506{
7507int ret = OB_SUCCESS;
7508ObSchemaGetterGuard schema_guard;
7509if (!inited_) {
7510ret = OB_NOT_INIT;
7511LOG_WARN("not init", K(ret));
7512} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
7513arg.trigger_info_.get_tenant_id(), schema_guard))) {
7514LOG_WARN("get schema guard with version in inner table failed", K(ret));
7515} else if (OB_FAIL(ddl_service_.create_trigger(arg, schema_guard, NULL))) {
7516LOG_WARN("failed to create trigger", K(ret));
7517}
7518return ret;
7519}
7520
7521int ObRootService::create_trigger_with_res(const obrpc::ObCreateTriggerArg &arg,
7522obrpc::ObCreateTriggerRes &res)
7523{
7524int ret = OB_SUCCESS;
7525ObSchemaGetterGuard schema_guard;
7526if (!inited_) {
7527ret = OB_NOT_INIT;
7528LOG_WARN("not init", K(ret));
7529} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
7530arg.trigger_info_.get_tenant_id(), schema_guard))) {
7531LOG_WARN("get schema guard with version in inner table failed", K(ret));
7532} else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) {
7533LOG_WARN("check parallel ddl conflict failed", K(ret));
7534} else if (OB_FAIL(ddl_service_.create_trigger(arg, schema_guard, &res))) {
7535LOG_WARN("failed to create trigger", K(ret));
7536}
7537return ret;
7538}
7539
7540int ObRootService::alter_trigger(const obrpc::ObAlterTriggerArg &arg)
7541{
7542int ret = OB_SUCCESS;
7543if (!inited_) {
7544ret = OB_NOT_INIT;
7545LOG_WARN("not init", K(ret));
7546} else if (!arg.is_valid()) {
7547ret = OB_INVALID_ARGUMENT;
7548LOG_WARN("invalid arg", K(arg), K(ret));
7549} else if (OB_FAIL(ddl_service_.alter_trigger(arg))) {
7550LOG_WARN("failed to alter trigger", K(ret));
7551}
7552return ret;
7553}
7554
7555int ObRootService::drop_trigger(const obrpc::ObDropTriggerArg &arg)
7556{
7557int ret = OB_SUCCESS;
7558if (!inited_) {
7559ret = OB_NOT_INIT;
7560LOG_WARN("not init", K(ret));
7561} else
7562if (!arg.is_valid()) {
7563ret = OB_INVALID_ARGUMENT;
7564LOG_WARN("invalid arg", K(arg), K(ret));
7565} else if (OB_FAIL(ddl_service_.drop_trigger(arg))) {
7566LOG_WARN("failed to drop trigger", K(ret));
7567}
7568return ret;
7569}
7570
7571////////////////////////////////////////////////////////////////
7572// sequence
7573////////////////////////////////////////////////////////////////
7574int ObRootService::do_sequence_ddl(const obrpc::ObSequenceDDLArg &arg)
7575{
7576int ret = OB_SUCCESS;
7577if (!inited_) {
7578ret = OB_NOT_INIT;
7579LOG_WARN("not init", K(ret));
7580} else if (OB_FAIL(ddl_service_.do_sequence_ddl(arg))) {
7581LOG_WARN("do sequence ddl failed", K(arg), K(ret));
7582}
7583return ret;
7584}
7585
7586////////////////////////////////////////////////////////////////
7587// context
7588////////////////////////////////////////////////////////////////
7589int ObRootService::do_context_ddl(const obrpc::ObContextDDLArg &arg)
7590{
7591int ret = OB_SUCCESS;
7592if (!inited_) {
7593ret = OB_NOT_INIT;
7594LOG_WARN("not init", K(ret));
7595} else if (OB_FAIL(ddl_service_.do_context_ddl(arg))) {
7596LOG_WARN("do context ddl failed", K(arg), K(ret));
7597}
7598return ret;
7599}
7600
7601////////////////////////////////////////////////////////////////
7602// schema revise
7603////////////////////////////////////////////////////////////////
7604int ObRootService::schema_revise(const obrpc::ObSchemaReviseArg &arg)
7605{
7606int ret = OB_SUCCESS;
7607if (!inited_) {
7608ret = OB_NOT_INIT;
7609LOG_WARN("not init", K(ret));
7610} else if (OB_FAIL(ddl_service_.do_schema_revise(arg))) {
7611LOG_WARN("schema revise failed", K(arg), K(ret));
7612}
7613return ret;
7614}
7615
7616////////////////////////////////////////////////////////////////
7617// keystore
7618////////////////////////////////////////////////////////////////
7619
7620int ObRootService::do_keystore_ddl(const obrpc::ObKeystoreDDLArg &arg)
7621{
7622int ret = OB_SUCCESS;
7623if (!inited_) {
7624ret = OB_NOT_INIT;
7625LOG_WARN("not init", K(ret));
7626#ifndef OB_BUILD_TDE_SECURITY
7627} else if (OB_FAIL(ddl_service_.do_keystore_ddl(arg))) {
7628LOG_WARN("do sequence ddl failed", K(arg), K(ret));
7629}
7630#else
7631} else {
7632// exclude add server
7633common::ObArray<uint64_t> tenant_id_array;
7634common::ObArray<std::pair<uint64_t, uint64_t> > max_key_version;
7635SpinRLockGuard sync_guard(master_key_mgr_.sync());
7636if (OB_FAIL(ddl_service_.do_keystore_ddl(arg))) {
7637LOG_WARN("do sequence ddl failed", K(arg), K(ret));
7638} else if (arg.type_ == ObKeystoreDDLArg::ALTER_KEYSTORE_SET_KEY) {
7639if (OB_FAIL(tenant_id_array.push_back(arg.exec_tenant_id_))) {
7640LOG_WARN("fail to push back", KR(ret));
7641} else if (OB_FAIL(ObMasterKeyGetter::instance().get_latest_key_versions(
7642tenant_id_array, max_key_version))) {
7643LOG_WARN("fail to get latest key versions", KR(ret));
7644} else if (max_key_version.count() != 1 || max_key_version.at(0).second <= 0) {
7645ret = OB_ERR_UNEXPECTED;
7646LOG_WARN("max key version unexpected", KR(ret), K(arg), K(max_key_version));
7647} else if (OB_FAIL(master_key_mgr_.forward_tenant_max_key_version(
7648arg.exec_tenant_id_, max_key_version.at(0).second))) {
7649LOG_WARN("fail to forward tenant max key version", KR(ret), K(arg), K(max_key_version));
7650}
7651} else {
7652// no new master key generated, ignore
7653}
7654}
7655#endif
7656return ret;
7657}
7658
7659////////////////////////////////////////////////////////////////
7660// label security policy
7661////////////////////////////////////////////////////////////////
7662
7663int ObRootService::handle_label_se_policy_ddl(const obrpc::ObLabelSePolicyDDLArg &arg)
7664{
7665int ret = OB_SUCCESS;
7666if (!inited_) {
7667ret = OB_NOT_INIT;
7668LOG_WARN("not init", K(ret));
7669} else if (OB_FAIL(ddl_service_.handle_label_se_policy_ddl(arg))) {
7670LOG_WARN("do label security policy ddl failed", K(arg), K(ret));
7671}
7672return ret;
7673}
7674
7675int ObRootService::handle_label_se_component_ddl(const obrpc::ObLabelSeComponentDDLArg &arg)
7676{
7677int ret = OB_SUCCESS;
7678if (!inited_) {
7679ret = OB_NOT_INIT;
7680LOG_WARN("not init", K(ret));
7681} else if (OB_FAIL(ddl_service_.handle_label_se_component_ddl(arg))) {
7682LOG_WARN("do label security policy ddl failed", K(arg), K(ret));
7683}
7684return ret;
7685}
7686
7687int ObRootService::handle_label_se_label_ddl(const obrpc::ObLabelSeLabelDDLArg &arg)
7688{
7689int ret = OB_SUCCESS;
7690if (!inited_) {
7691ret = OB_NOT_INIT;
7692LOG_WARN("not init", K(ret));
7693} else if (OB_FAIL(ddl_service_.handle_label_se_label_ddl(arg))) {
7694LOG_WARN("do label security policy ddl failed", K(arg), K(ret));
7695}
7696return ret;
7697}
7698
7699int ObRootService::handle_label_se_user_level_ddl(const obrpc::ObLabelSeUserLevelDDLArg &arg)
7700{
7701int ret = OB_SUCCESS;
7702if (!inited_) {
7703ret = OB_NOT_INIT;
7704LOG_WARN("not init", K(ret));
7705} else if (OB_FAIL(ddl_service_.handle_label_se_user_level_ddl(arg))) {
7706LOG_WARN("do label security policy ddl failed", K(arg), K(ret));
7707}
7708return ret;
7709}
7710// tablespace
7711////////////////////////////////////////////////////////////////
7712int ObRootService::do_tablespace_ddl(const obrpc::ObTablespaceDDLArg &arg)
7713{
7714int ret = OB_SUCCESS;
7715if (!inited_) {
7716ret = OB_NOT_INIT;
7717LOG_WARN("not init", K(ret));
7718} else if (OB_FAIL(ddl_service_.do_tablespace_ddl(arg))) {
7719LOG_WARN("do sequence ddl failed", K(arg), K(ret));
7720}
7721
7722return ret;
7723}
7724////////////////////////////////////////////////////////////////
7725// server & zone management
7726////////////////////////////////////////////////////////////////
7727int ObRootService::add_server_for_bootstrap_in_version_smaller_than_4_2_0(
7728const common::ObAddr &server,
7729const common::ObZone &zone)
7730{
7731return server_manager_.add_server(server, zone);
7732}
7733int ObRootService::add_server(const obrpc::ObAdminServerArg &arg)
7734{
7735int ret = OB_SUCCESS;
7736ObTimeoutCtx ctx;
7737if (OB_UNLIKELY(!inited_)) {
7738ret = OB_NOT_INIT;
7739LOG_WARN("not init", KR(ret), K(inited_));
7740} else if (!arg.is_valid()) {
7741ret = OB_INVALID_ARGUMENT;
7742LOG_WARN("invalid arg", KR(ret), K(arg));
7743} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
7744LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
7745} else {}
7746if (OB_SUCC(ret)) {
7747if (!ObHeartbeatService::is_service_enabled()) { // the old logic
7748LOG_INFO("sys tenant data version < 4.2, add_server", K(arg),
7749"timeout_ts", ctx.get_timeout());
7750if (OB_FAIL(old_add_server(arg))) {
7751LOG_WARN("fail to add server by using old logic", KR(ret), K(arg));
7752}
7753} else { // the new logic
7754LOG_INFO("sys tenant data version >= 4.2, add_server", K(arg),
7755"timeout_ts", ctx.get_timeout());
7756if (OB_FAIL(server_zone_op_service_.add_servers(arg.servers_, arg.zone_))) {
7757LOG_WARN("fail to add servers", KR(ret), K(arg));
7758}
7759int tmp_ret = OB_SUCCESS;
7760if (OB_TMP_FAIL(load_server_manager())) {
7761// ** FIXME (linqiucen.lqc): temp. solution.
7762// ** This will be removed if we do not need whitelist in server_manager
7763LOG_WARN("fail to load server_manager, please try 'ALTER SYSTEM RELOAD SERVER;'", KR(ret), KR(tmp_ret));
7764ret = OB_SUCC(ret) ? tmp_ret : ret;
7765}
7766}
7767}
7768FLOG_INFO("add server", KR(ret), K(arg));
7769return ret;
7770}
7771int ObRootService::old_add_server(const obrpc::ObAdminServerArg &arg)
7772{
7773int ret = OB_SUCCESS;
7774uint64_t sys_data_version = 0;
7775// argument
7776#ifdef OB_BUILD_TDE_SECURITY
7777ObWaitMasterKeyInSyncArg wms_in_sync_arg;
7778// master key mgr sync
7779#endif
7780if (!inited_) {
7781ret = OB_NOT_INIT;
7782LOG_WARN("not init", K(ret));
7783} else if (!arg.is_valid()) {
7784ret = OB_INVALID_ARGUMENT;
7785LOG_WARN("invalid arg", K(arg), K(ret));
7786} else if (OB_FAIL(GET_MIN_DATA_VERSION(OB_SYS_TENANT_ID, sys_data_version))) {
7787LOG_WARN("fail to get sys data version", KR(ret));
7788#ifdef OB_BUILD_TDE_SECURITY
7789} else if (OB_FAIL(server_zone_op_service_.construct_rs_list_arg(wms_in_sync_arg.rs_list_arg_))) {
7790LOG_WARN("fail to construct rs list arg", KR(ret));
7791#endif
7792} else {
7793LOG_INFO("add_server", K(arg), "timeout_ts", THIS_WORKER.get_timeout_ts());
7794ObCheckServerEmptyArg new_arg(ObCheckServerEmptyArg::ADD_SERVER,
7795sys_data_version);
7796ObCheckDeploymentModeArg dp_arg;
7797dp_arg.single_zone_deployment_on_ = OB_FILE_SYSTEM_ROUTER.is_single_zone_deployment_on();
7798
7799#ifdef OB_BUILD_TDE_SECURITY
7800SpinRLockGuard sync_guard(master_key_mgr_.sync());
7801#endif
7802for (int64_t i = 0; OB_SUCC(ret) && i < arg.servers_.count(); ++i) {
7803const ObAddr &addr = arg.servers_[i];
7804Bool is_empty(false);
7805Bool is_deployment_mode_match(false);
7806if (OB_FAIL(rpc_proxy_.to(addr).is_empty_server(new_arg, is_empty))) {
7807LOG_WARN("fail to check is server empty", K(ret), K(addr));
7808} else if (!is_empty) {
7809ret = OB_OP_NOT_ALLOW;
7810LOG_WARN("add non-empty server not allowed", K(ret));
7811LOG_USER_ERROR(OB_OP_NOT_ALLOW, "add non-empty server");
7812} else if (OB_FAIL([&](){
7813int ret = OB_SUCCESS;
7814ret = rpc_proxy_.to(addr).check_deployment_mode_match(
7815dp_arg, is_deployment_mode_match);
7816return ret;}())) {
7817LOG_WARN("fail to check deployment mode match", K(ret));
7818} else if (!is_deployment_mode_match) {
7819ret = OB_OP_NOT_ALLOW;
7820LOG_WARN("add server deployment mode mot match not allowed", K(ret));
7821LOG_USER_ERROR(OB_OP_NOT_ALLOW, "add server deployment mode not match");
7822#ifdef OB_BUILD_TDE_SECURITY
7823} else if (OB_FAIL(server_zone_op_service_.master_key_checking_for_adding_server(
7824addr,
7825arg.zone_,
7826wms_in_sync_arg))) {
7827LOG_WARN("master key checking for adding server is failed", KR(ret), K(addr), K(arg.zone_));
7828#endif
7829}
7830if (OB_SUCC(ret)) {
7831if (OB_FAIL(server_manager_.add_server(addr, arg.zone_))) {
7832LOG_WARN("add_server failed", "server", addr, "zone", arg.zone_, K(ret));
7833}
7834}
7835}
7836}
7837ROOTSERVICE_EVENT_ADD("root_service", "add_server", K(ret), K(arg));
7838return ret;
7839}
7840int ObRootService::delete_server(const obrpc::ObAdminServerArg &arg)
7841{
7842int ret = OB_SUCCESS;
7843ObTimeoutCtx ctx;
7844if (OB_UNLIKELY(!inited_)) {
7845ret = OB_NOT_INIT;
7846LOG_WARN("not init", KR(ret), K(inited_));
7847} else if (!arg.is_valid()) {
7848ret = OB_INVALID_ARGUMENT;
7849LOG_WARN("invalid arg", KR(ret), K(arg));
7850} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
7851LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
7852} else {}
7853if (OB_SUCC(ret)) {
7854if (!ObHeartbeatService::is_service_enabled()) { // the old logic
7855LOG_INFO("sys tenant data version < 4.2, delete_server", K(arg),
7856"timeout_ts", ctx.get_timeout());
7857if (OB_FAIL(old_delete_server(arg))) {
7858LOG_WARN("fail to delete server by using the old logic", KR(ret), K(arg));
7859}
7860} else { // the new logic
7861LOG_INFO("sys tenant data version >= 4.2, delete_server", K(arg),
7862"timeout_ts", ctx.get_timeout());
7863if (OB_FAIL(server_zone_op_service_.delete_servers(arg.servers_, arg.zone_))) {
7864LOG_WARN("fail to delete servers", KR(ret), K(arg));
7865}
7866int tmp_ret = OB_SUCCESS;
7867if (OB_TMP_FAIL(load_server_manager())) {
7868// ** FIXME (linqiucen.lqc): temp. solution.
7869// ** This will be removed if we do not need whitelist in server_manager
7870LOG_WARN("fail to load server_manager, please try 'ALTER SYSTEM RELOAD SERVER;'", KR(ret), KR(tmp_ret));
7871ret = OB_SUCC(ret) ? tmp_ret : ret;
7872} else {
7873root_balancer_.wakeup();
7874empty_server_checker_.wakeup();
7875lost_replica_checker_.wakeup();
7876LOG_INFO("delete server and load server manager successfully", K(arg));
7877}
7878}
7879}
7880FLOG_INFO("delete server", KR(ret), K(arg));
7881return ret;
7882}
7883int ObRootService::old_delete_server(const obrpc::ObAdminServerArg &arg)
7884{
7885int ret = OB_SUCCESS;
7886bool has_enough = false;
7887if (!inited_) {
7888ret = OB_NOT_INIT;
7889LOG_WARN("not init", K(ret));
7890} else if (!arg.is_valid()) {
7891ret = OB_INVALID_ARGUMENT;
7892LOG_WARN("invalid arg", K(arg), K(ret));
7893} else if (OB_FAIL(check_server_have_enough_resource_for_delete_server(arg.servers_, arg.zone_))) {
7894LOG_WARN("not enough resource, cannot delete servers", K(ret), K(arg));
7895} else if (OB_FAIL(check_all_ls_has_leader("delete server"))) {
7896LOG_WARN("fail to check all ls has leader", KR(ret), K(arg));
7897} else if (OB_FAIL(server_manager_.delete_server(arg.servers_, arg.zone_))) {
7898LOG_WARN("delete_server failed", "servers", arg.servers_, "zone", arg.zone_, K(ret));
7899} else {
7900root_balancer_.wakeup();
7901empty_server_checker_.wakeup();
7902lost_replica_checker_.wakeup();
7903}
7904ROOTSERVICE_EVENT_ADD("root_service", "delete_server", K(ret), K(arg));
7905return ret;
7906}
7907
7908int ObRootService::check_server_have_enough_resource_for_delete_server(
7909const ObIArray<ObAddr> &servers,
7910const ObZone &zone)
7911{
7912int ret = OB_SUCCESS;
7913common::ObZone tmp_zone;
7914if (OB_UNLIKELY(!inited_)) {
7915ret = OB_NOT_INIT;
7916LOG_WARN("not init", K(ret));
7917} else {
7918FOREACH_CNT_X(server, servers, OB_SUCC(ret)) {
7919if (zone.is_empty()) {
7920// still use server manager here, since this func. will be called only in version < 4.2
7921if (OB_FAIL(server_manager_.get_server_zone(*server, tmp_zone))) {
7922LOG_WARN("fail to get server zone", K(ret));
7923}
7924} else {
7925if (OB_FAIL(server_manager_.get_server_zone(*server, tmp_zone))) {
7926LOG_WARN("fail to get server zone", K(ret));
7927} else if (tmp_zone != zone) {
7928ret = OB_SERVER_ZONE_NOT_MATCH;
7929LOG_WARN("delete server not in zone", K(ret));
7930}
7931}
7932if (OB_SUCC(ret)) {
7933if (OB_FAIL(unit_manager_.check_enough_resource_for_delete_server(
7934*server, tmp_zone))) {
7935LOG_WARN("fail to check enouch resource", K(ret));
7936}
7937}
7938}//end for each
7939}
7940return ret;
7941}
7942
7943int ObRootService::cancel_delete_server(const obrpc::ObAdminServerArg &arg)
7944{
7945int ret = OB_SUCCESS;
7946ObTimeoutCtx ctx;
7947if (OB_UNLIKELY(!inited_)) {
7948ret = OB_NOT_INIT;
7949LOG_WARN("not init", KR(ret), K(inited_));
7950} else if (!arg.is_valid()) {
7951ret = OB_INVALID_ARGUMENT;
7952LOG_WARN("invalid arg", KR(ret), K(arg));
7953} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
7954LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
7955} else {}
7956if (OB_SUCC(ret)) {
7957if (!ObHeartbeatService::is_service_enabled()) { // the old logic
7958LOG_INFO("sys tenant data version < 4.2, cancel_delete_server", K(arg),
7959"timeout_ts", ctx.get_timeout());
7960if (OB_FAIL(old_cancel_delete_server(arg))) {
7961LOG_WARN("fail to cancel delete server by using the old logic", KR(ret), K(arg));
7962}
7963} else { // the new logic
7964LOG_INFO("sys tenant data version >= 4.2, cancel_delete_server", K(arg),
7965"timeout_ts", ctx.get_timeout());
7966if (OB_FAIL(server_zone_op_service_.cancel_delete_servers(arg.servers_, arg.zone_))) {
7967LOG_WARN("fail to cancel delete servers", KR(ret), K(arg));
7968}
7969int tmp_ret = OB_SUCCESS;
7970if (OB_TMP_FAIL(load_server_manager())) {
7971// ** FIXME (linqiucen.lqc): temp. solution.
7972// ** This will be removed if we do not need whitelist in server_manager
7973LOG_WARN("fail to load server_manager, please try 'ALTER SYSTEM RELOAD SERVER;'", KR(ret), KR(tmp_ret));
7974ret = OB_SUCC(ret) ? tmp_ret : ret;
7975} else {
7976root_balancer_.wakeup();
7977}
7978}
7979}
7980FLOG_INFO("cancel delete server", KR(ret), K(arg));
7981return ret;
7982}
7983
7984int ObRootService::old_cancel_delete_server(const obrpc::ObAdminServerArg &arg)
7985{
7986int ret = OB_SUCCESS;
7987if (!inited_) {
7988ret = OB_NOT_INIT;
7989LOG_WARN("not init", K(ret));
7990} else if (!arg.is_valid()) {
7991ret = OB_INVALID_ARGUMENT;
7992LOG_WARN("invalid arg", K(arg), K(ret));
7993} else {
7994for (int64_t i = 0; OB_SUCC(ret) && i < arg.servers_.count(); ++i) {
7995const bool commit = false;
7996if (OB_FAIL(ret)) {
7997} else if (OB_FAIL(server_manager_.end_delete_server(arg.servers_[i], arg.zone_, commit))) {
7998LOG_WARN("delete_server failed", "server", arg.servers_[i],
7999"zone", arg.zone_, K(commit), K(ret));
8000} else {
8001// TODO: @wanhong.wwh NEED support cancel DR task
8002root_balancer_.wakeup();
8003}
8004}
8005}
8006ROOTSERVICE_EVENT_ADD("root_service", "cancel_delete_server", K(ret), K(arg));
8007return ret;
8008}
8009
8010int ObRootService::start_server(const obrpc::ObAdminServerArg &arg)
8011{
8012int ret = OB_SUCCESS;
8013ObTimeoutCtx ctx;
8014if (OB_UNLIKELY(!inited_)) {
8015ret = OB_NOT_INIT;
8016LOG_WARN("not init", KR(ret), K(inited_));
8017} else if (!arg.is_valid()) {
8018ret = OB_INVALID_ARGUMENT;
8019LOG_WARN("invalid arg", KR(ret), K(arg));
8020} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
8021LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
8022} else {}
8023if (OB_SUCC(ret)) {
8024if (!ObHeartbeatService::is_service_enabled()) { // the old logic
8025LOG_INFO("sys tenant data version < 4.2, start_server", K(arg),
8026"timeout_ts", ctx.get_timeout());
8027if (OB_FAIL(server_manager_.start_server_list(arg.servers_, arg.zone_))) {
8028LOG_WARN("fail to start server by using old logic", KR(ret), K(arg));
8029}
8030} else { // the new logic
8031LOG_INFO("sys tenant data version >= 4.2, start_server", K(arg),
8032"timeout_ts", ctx.get_timeout());
8033if (OB_FAIL(server_zone_op_service_.start_servers(arg.servers_, arg.zone_))) {
8034LOG_WARN("fail to start servers", KR(ret), K(arg));
8035}
8036int tmp_ret = OB_SUCCESS;
8037if (OB_TMP_FAIL(load_server_manager())) {
8038// ** FIXME (linqiucen.lqc): temp. solution.
8039// ** This will be removed if we do not need whitelist in server_manager
8040LOG_WARN("fail to load server_manager, please try 'ALTER SYSTEM RELOAD SERVER;'", KR(ret), KR(tmp_ret));
8041ret = OB_SUCC(ret) ? tmp_ret : ret;
8042}
8043}
8044}
8045FLOG_INFO("start server", KR(ret), K(arg));
8046return ret;
8047}
8048
8049int ObRootService::stop_server(const obrpc::ObAdminServerArg &arg)
8050{
8051int ret = OB_SUCCESS;
8052ObTimeoutCtx ctx;
8053if (OB_UNLIKELY(!inited_)) {
8054ret = OB_NOT_INIT;
8055LOG_WARN("not init", KR(ret), K(inited_));
8056} else if (OB_UNLIKELY(!arg.is_valid())) {
8057ret = OB_INVALID_ARGUMENT;
8058LOG_WARN("invalid arg", KR(ret), K(arg));
8059} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
8060LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
8061} else {
8062if (!ObHeartbeatService::is_service_enabled()) { // the old logic
8063LOG_INFO("sys tenant data version < 4.2, stop_server", K(arg),
8064"timeout_ts", ctx.get_timeout());
8065if (OB_FAIL(server_zone_op_service_.stop_server_precheck(arg.servers_, arg.op_))) {
8066LOG_WARN("fail to precheck stop server", KR(ret), K(arg));
8067} else if (OB_FAIL(server_manager_.stop_server_list(arg.servers_, arg.zone_))) {
8068LOG_WARN("stop server failed", "server", arg.servers_, "zone", arg.zone_, KR(ret));
8069}
8070} else {
8071LOG_INFO("sys tenant data version >= 4.2, stop_server", K(arg),
8072"timeout_ts", ctx.get_timeout());
8073if (OB_FAIL(server_zone_op_service_.stop_servers(arg.servers_, arg.zone_, arg.op_))) {
8074LOG_WARN("stop server failed", KR(ret), K(arg));
8075}
8076int tmp_ret = OB_SUCCESS;
8077if (OB_TMP_FAIL(load_server_manager())) {
8078// ** FIXME (linqiucen.lqc): temp. solution.
8079// ** This will be removed if we do not need whitelist in server_manager
8080LOG_WARN("fail to load server_manager, please try 'ALTER SYSTEM RELOAD SERVER;'", KR(ret), KR(tmp_ret));
8081ret = OB_SUCC(ret) ? tmp_ret : ret;
8082}
8083if (OB_TMP_FAIL(try_notify_switch_leader(obrpc::ObNotifySwitchLeaderArg::STOP_SERVER))) {
8084LOG_WARN("failed to notify switch leader", KR(ret), KR(tmp_ret));
8085}
8086}
8087}
8088FLOG_INFO("stop server", KR(ret), K(arg));
8089return ret;
8090}
8091
8092#ifdef OB_BUILD_TDE_SECURITY
8093int ObRootService::try_check_encryption_zone_cond(
8094const obrpc::ObAdminZoneArg &arg)
8095{
8096int ret = OB_SUCCESS;
8097bool has_available_master_key = false;
8098if (OB_UNLIKELY(!inited_)) {
8099ret = OB_NOT_INIT;
8100LOG_WARN("not init", K(ret));
8101} else if (OB_UNLIKELY(!arg.is_valid())) {
8102ret = OB_INVALID_ARGUMENT;
8103LOG_WARN("invalid argument", KR(ret), K(arg));
8104} else if (arg.zone_type_ != ZONE_TYPE_ENCRYPTION) {
8105// good, no need to check
8106} else if (OB_FAIL(master_key_mgr_.check_if_tenant_has_available_master_keys(
8107OB_SYS_TENANT_ID, has_available_master_key))) {
8108LOG_WARN("fail to check if tenant has available master key", KR(ret));
8109} else if (!has_available_master_key) {
8110ret = OB_OP_NOT_ALLOW;
8111LOG_WARN("add encryption zone without available master key in sys tenant is not allowed", KR(ret));
8112LOG_USER_ERROR(OB_OP_NOT_ALLOW, "add encryption zone without available master key in sys tenant");
8113}
8114return ret;
8115}
8116#endif
8117
8118int ObRootService::add_zone(const obrpc::ObAdminZoneArg &arg)
8119{
8120int ret = OB_SUCCESS;
8121if (!inited_) {
8122ret = OB_NOT_INIT;
8123LOG_WARN("not init", K(ret));
8124} else if (!arg.is_valid()) {
8125ret = OB_INVALID_ARGUMENT;
8126LOG_WARN("invalid arg", K(arg), K(ret));
8127#ifdef OB_BUILD_TDE_SECURITY
8128} else if (OB_FAIL(try_check_encryption_zone_cond(arg))) {
8129LOG_WARN("fail to check encryption zone", KR(ret), K(arg));
8130#endif
8131} else if (OB_FAIL(zone_manager_.add_zone(arg.zone_, arg.region_, arg.idc_, arg.zone_type_))) {
8132LOG_WARN("failed to add zone", K(ret), K(arg));
8133} else {
8134LOG_INFO("add zone ok", K(arg));
8135}
8136ROOTSERVICE_EVENT_ADD("root_service", "add_zone", K(ret), "sql_text", ObHexEscapeSqlStr(arg.sql_stmt_str_));
8137return ret;
8138}
8139
8140int ObRootService::delete_zone(const obrpc::ObAdminZoneArg &arg)
8141{
8142int ret = OB_SUCCESS;
8143if (!inited_) {
8144ret = OB_NOT_INIT;
8145LOG_WARN("not init", K(ret));
8146} else if (!arg.is_valid()) {
8147ret = OB_INVALID_ARGUMENT;
8148LOG_WARN("invalid arg", K(arg), K(ret));
8149} else {
8150// @note to avoid deadlock risk, put it beside ZoneManager::write_lock_. ObServerManager::add_server also call the interfaces of zone_mgr.
8151// it does not matter while add server after check.
8152int64_t alive_count = 0;
8153int64_t not_alive_count = 0;
8154ObArray<ObServerInfoInTable> servers_info;
8155if (OB_ISNULL(GCTX.sql_proxy_)) {
8156ret = OB_ERR_UNEXPECTED;
8157LOG_WARN("GCTX.sql_proxy_ is null", KR(ret), KP(GCTX.sql_proxy_));
8158} else if (OB_FAIL(ObServerTableOperator::get(*GCTX.sql_proxy_, servers_info))) {
8159LOG_WARN("fail to get servers_info", KR(ret), KP(GCTX.sql_proxy_));
8160} else if (OB_FAIL(ObRootUtils::get_server_count(servers_info, arg.zone_, alive_count, not_alive_count))) {
8161LOG_WARN("failed to get server count of the zone", KR(ret), K(arg.zone_), K(servers_info));
8162} else {
8163LOG_INFO("current server count of zone",
8164"zone", arg.zone_, K(alive_count), K(not_alive_count));
8165if (alive_count > 0 || not_alive_count > 0) {
8166ret = OB_ERR_ZONE_NOT_EMPTY;
8167LOG_USER_ERROR(OB_ERR_ZONE_NOT_EMPTY, alive_count, not_alive_count);
8168} else if (OB_FAIL(zone_manager_.delete_zone(arg.zone_))) {
8169LOG_WARN("delete zone failed", K(ret), K(arg));
8170} else {
8171LOG_INFO("delete zone ok", K(arg));
8172}
8173}
8174}
8175ROOTSERVICE_EVENT_ADD("root_service", "delete_zone", K(ret), "sql_text", ObHexEscapeSqlStr(arg.sql_stmt_str_));
8176return ret;
8177}
8178
8179int ObRootService::start_zone(const obrpc::ObAdminZoneArg &arg)
8180{
8181int ret = OB_SUCCESS;
8182if (!inited_) {
8183ret = OB_NOT_INIT;
8184LOG_WARN("not init", K(ret));
8185} else if (!arg.is_valid()) {
8186ret = OB_INVALID_ARGUMENT;
8187LOG_WARN("invalid arg", K(arg), K(ret));
8188} else if (OB_FAIL(zone_manager_.start_zone(arg.zone_))) {
8189LOG_WARN("failed to start zone", K(ret), K(arg));
8190} else {
8191LOG_INFO("start zone ok", K(arg));
8192}
8193ROOTSERVICE_EVENT_ADD("root_service", "start_zone", K(ret), "sql_text", ObHexEscapeSqlStr(arg.sql_stmt_str_));
8194return ret;
8195}
8196
8197//check whether has a object that all primary_zones were stopped after this time stop.
8198//basic idea:
8199//1. get the intersection tenant of to_stop_list and stopped_server_list. if tenant is only on stopp_list, it is no matter with this time stop.
8200// therefor, only need to consider the intersection of two sets;
8201//2. set the union of to_stop_list and stopped_list to zone_list. set the intersection tenant of to_stop_list and stopped_server_list to tenant_ids,
8202// check whether the primary zone of every tenant in tenant_ids is the subset of zone_list. if it is the subset, then the leader of the object may switch
8203// to non_primary_zone observer, this situation is not allowed; if it is not the subset, than still has replica in primary zone can be leader.
8204int ObRootService::check_can_stop(const ObZone &zone,
8205const ObIArray<ObAddr> &servers,
8206const bool is_stop_zone)
8207{
8208int ret = OB_SUCCESS;
8209int64_t start_time = ObTimeUtility::current_time();
8210ObArray<ObAddr> to_stop_list;
8211ObArray<ObZone> stopped_zone_list;
8212ObArray<ObAddr> stopped_server_list;
8213ObArray<ObServerInfoInTable> servers_info_in_table;
8214if ((!is_stop_zone && (0 == servers.count() || zone.is_empty()))
8215|| (is_stop_zone && zone.is_empty())) {
8216ret = OB_INVALID_ARGUMENT;
8217LOG_WARN("invalid argument", KR(ret), K(servers), K(zone));
8218} else if (OB_FAIL(ObRootUtils::get_stopped_zone_list(stopped_zone_list,
8219stopped_server_list))) {
8220LOG_WARN("fail to get stopped zone list", KR(ret));
8221} else if (0 >= stopped_server_list.count()) {
8222//nothing todo
8223} else {
8224if (!is_stop_zone) {
8225if (OB_FAIL(to_stop_list.assign(servers))) {
8226LOG_WARN("fail to push back", KR(ret), K(servers));
8227}
8228} else if (OB_ISNULL(GCTX.sql_proxy_)) {
8229ret = OB_ERR_UNEXPECTED;
8230LOG_WARN("GCTX.sql_proxy_ is null", KR(ret), KP(GCTX.sql_proxy_));
8231} else if (OB_FAIL(ObServerTableOperator::get(*GCTX.sql_proxy_, servers_info_in_table))) {
8232LOG_WARN("fail to get servers_info_in_table", KR(ret), KP(GCTX.sql_proxy_));
8233} else if (OB_FAIL(ObRootUtils::get_servers_of_zone(servers_info_in_table, zone, to_stop_list))) {
8234LOG_WARN("fail to get servers of zone", KR(ret), K(zone));
8235}
8236ObArray<uint64_t> tenant_ids;
8237bool is_in = false;
8238if (OB_FAIL(ret)) {
8239} else if (OB_FAIL(ObRootUtils::get_tenant_intersection(unit_manager_, //get intersection tenant of to_stop_list and stopped_server_list
8240to_stop_list,
8241stopped_server_list,
8242tenant_ids))) {
8243LOG_WARN("fail to get tenant intersections", KR(ret));
8244} else if (!has_exist_in_array(stopped_zone_list, zone)
8245&& OB_FAIL(stopped_zone_list.push_back(zone))) {
8246LOG_WARN("fail to push back", KR(ret), K(zone));
8247} else if (OB_FAIL(ObRootUtils::check_primary_region_in_zonelist(schema_service_, //check whether stop primary region of the tenant
8248&ddl_service_,
8249unit_manager_,
8250zone_manager_,
8251tenant_ids,
8252stopped_zone_list,
8253is_in))) {
8254LOG_WARN("fail to check tenant stop primary region", KR(ret));
8255} else if (!is_in) {
8256//nothing todo
8257} else {
8258ret = OB_OP_NOT_ALLOW;
8259LOG_WARN("stop all primary region is not allowed", KR(ret), K(zone), K(servers));
8260}
8261}
8262int64_t cost = ObTimeUtility::current_time() - start_time;
8263LOG_INFO("check can stop zone/server", KR(ret), K(zone), K(servers), K(cost));
8264return ret;
8265}
8266
8267int ObRootService::stop_zone(const obrpc::ObAdminZoneArg &arg)
8268{
8269int ret = OB_SUCCESS;
8270ObArray<ObAddr> empty_server;
8271HEAP_VAR(ObZoneInfo, zone_info) {
8272bool zone_active = false;
8273bool zone_exist = false;
8274if (OB_UNLIKELY(!inited_)) {
8275ret = OB_NOT_INIT;
8276LOG_WARN("not init", K(ret));
8277} else if (!arg.is_valid()) {
8278ret = OB_INVALID_ARGUMENT;
8279LOG_WARN("invalid arg", K(arg), K(ret));
8280} else if (OB_FAIL(zone_manager_.check_zone_exist(arg.zone_, zone_exist))) {
8281LOG_WARN("fail to check zone exist", K(ret));
8282} else if (!zone_exist) {
8283ret = OB_ENTRY_NOT_EXIST;
8284LOG_WARN("zone not exist");
8285LOG_USER_ERROR(OB_ENTRY_NOT_EXIST, "zone not exist");
8286} else if (OB_FAIL(zone_manager_.check_zone_active(arg.zone_, zone_active))) {
8287LOG_WARN("fail to check zone active", KR(ret), K(arg.zone_));
8288} else if (!zone_active) {
8289//nothing todo
8290} else if (ObAdminZoneArg::ISOLATE == arg.op_) {
8291if (OB_FAIL(check_can_stop(arg.zone_, empty_server, true/*is_stop_zone*/))) {
8292LOG_WARN("fail to check zone can stop", KR(ret), K(arg));
8293if (OB_OP_NOT_ALLOW == ret) {
8294LOG_USER_ERROR(OB_OP_NOT_ALLOW, "Stop all server in primary region is disabled");
8295}
8296}
8297} else {
8298//stop zone/force stop zone
8299if (ObRootUtils::have_other_stop_task(arg.zone_)) {
8300ret = OB_STOP_SERVER_IN_MULTIPLE_ZONES;
8301LOG_WARN("cannot stop zone when other stop task already exist", KR(ret), K(arg));
8302LOG_USER_ERROR(OB_STOP_SERVER_IN_MULTIPLE_ZONES,
8303"cannot stop server or stop zone in multiple zones");
8304}
8305}
8306
8307if (OB_FAIL(ret)) {
8308} else if (OB_FAIL(zone_manager_.get_zone(arg.zone_, zone_info))) {
8309LOG_WARN("fail to get zone info", K(ret));
8310} else {
8311common::ObZoneType zone_type = static_cast<ObZoneType>(zone_info.zone_type_.value_);
8312if (ObAdminZoneArg::ISOLATE == arg.op_) {
8313// isolate server no need to check count and status of replicas, it can not kill observer savely
8314} else if (common::ZONE_TYPE_READONLY == zone_type) {
8315// do not need to check anything for readonly zone
8316} else if (common::ZONE_TYPE_READWRITE == zone_type
8317|| common::ZONE_TYPE_ENCRYPTION == zone_type) {
8318ObArray<ObAddr> server_list;
8319ObArray<ObServerInfoInTable> servers_info;
8320if (OB_ISNULL(GCTX.sql_proxy_)) {
8321ret = OB_ERR_UNEXPECTED;
8322LOG_WARN("GCTX.sql_proxy_ is null", KR(ret), KP(GCTX.sql_proxy_));
8323} else if (OB_FAIL(ObServerTableOperator::get(*GCTX.sql_proxy_, servers_info))) {
8324LOG_WARN("fail to get servers_info", KR(ret), KP(GCTX.sql_proxy_));
8325} else if (OB_FAIL(ObRootUtils::get_servers_of_zone(servers_info, arg.zone_, server_list))) {
8326LOG_WARN("get servers of zone failed", KR(ret), K(arg.zone_), K(servers_info));
8327} else if (server_list.count() <= 0) {
8328//do not need to check anyting while zone is empty
8329} else if (OB_FAIL(check_majority_and_log_in_sync(
8330server_list,
8331arg.force_stop_,/*skip_log_sync_check*/
8332"stop zone"))) {
8333LOG_WARN("fail to check majority and log in-sync", KR(ret), K(arg));
8334}
8335} else {
8336ret = OB_ERR_UNEXPECTED;
8337LOG_WARN("invalid zone type", K(ret), "zone", arg.zone_, K(zone_type));
8338}
8339if (OB_SUCC(ret)) {
8340if (OB_FAIL(zone_manager_.stop_zone(arg.zone_))) {
8341LOG_WARN("stop zone failed", K(arg), K(ret));
8342} else {
8343LOG_INFO("stop zone ok", K(arg));
8344int tmp_ret = OB_SUCCESS;
8345if (OB_TMP_FAIL(try_notify_switch_leader(obrpc::ObNotifySwitchLeaderArg::STOP_ZONE))) {
8346LOG_WARN("failed to notify switch leader", KR(ret), KR(tmp_ret));
8347}
8348}
8349} else {
8350//set other error code to 4179
8351}
8352}
8353ROOTSERVICE_EVENT_ADD("root_service", "stop_zone", K(ret), "sql_text", ObHexEscapeSqlStr(arg.sql_stmt_str_));
8354}
8355return ret;
8356}
8357
8358int ObRootService::alter_zone(const obrpc::ObAdminZoneArg &arg)
8359{
8360int ret = OB_SUCCESS;
8361if (!inited_) {
8362ret = OB_NOT_INIT;
8363LOG_WARN("not init", K(ret));
8364} else if (!arg.is_valid()) {
8365ret = OB_INVALID_ARGUMENT;
8366LOG_WARN("invalid arg", K(arg), K(ret));
8367} else if (OB_FAIL(zone_manager_.alter_zone(arg))) {
8368LOG_WARN("failed to alter zone", K(ret), K(arg));
8369} else {
8370LOG_INFO("alter zone ok", K(arg));
8371}
8372ROOTSERVICE_EVENT_ADD("root_service", "alter_zone", K(ret), "sql_text", ObHexEscapeSqlStr(arg.sql_stmt_str_));
8373return ret;
8374}
8375
8376
8377int ObRootService::generate_stop_server_log_in_sync_dest_server_array(
8378const common::ObIArray<common::ObAddr> &alive_server_array,
8379const common::ObIArray<common::ObAddr> &excluded_server_array,
8380common::ObIArray<common::ObAddr> &dest_server_array)
8381{
8382int ret = OB_SUCCESS;
8383if (OB_UNLIKELY(!inited_)) {
8384ret = OB_NOT_INIT;
8385LOG_WARN("not init", K(ret));
8386} else {
8387dest_server_array.reset();
8388for (int64_t i = 0; OB_SUCC(ret) && i < alive_server_array.count(); ++i) {
8389const common::ObAddr &server = alive_server_array.at(i);
8390if (has_exist_in_array(excluded_server_array, server)) {
8391// in this excluded server array
8392} else {
8393if (OB_FAIL(dest_server_array.push_back(server))) {
8394LOG_WARN("fail to push back", K(ret));
8395}
8396}
8397}
8398}
8399return ret;
8400}
8401
8402int ObRootService::try_notify_switch_leader(const obrpc::ObNotifySwitchLeaderArg::SwitchLeaderComment &comment)
8403{
8404int ret = OB_SUCCESS;
8405ObServerManager::ObServerArray server_list;
8406ObZone zone;
8407obrpc::ObNotifySwitchLeaderArg arg;
8408if (OB_UNLIKELY(!inited_)) {
8409ret = OB_NOT_INIT;
8410LOG_WARN("not init", K(ret));
8411} else if (OB_FAIL(SVR_TRACER.get_alive_servers(zone, server_list))) {
8412LOG_WARN("failed to get server list", KR(ret), K(zone));
8413} else if (OB_FAIL(arg.init(OB_INVALID_TENANT_ID, ObLSID(), ObAddr(), comment))) {
8414LOG_WARN("failed to init switch leader arg", KR(ret), K(comment));
8415} else if (OB_FAIL(ObRootUtils::notify_switch_leader(&rpc_proxy_, OB_SYS_TENANT_ID, arg, server_list))) {
8416LOG_WARN("failed to notify switch leader", KR(ret), K(arg), K(server_list));
8417}
8418return ret;
8419}
8420////////////////////////////////////////////////////////////////
8421// system admin command (alter system ...)
8422////////////////////////////////////////////////////////////////
8423int ObRootService::init_sys_admin_ctx(ObSystemAdminCtx &ctx)
8424{
8425int ret = OB_SUCCESS;
8426if (!inited_) {
8427ret = OB_NOT_INIT;
8428LOG_WARN("not init", K(ret));
8429} else {
8430ctx.rs_status_ = &rs_status_;
8431ctx.rpc_proxy_ = &rpc_proxy_;
8432ctx.sql_proxy_ = &sql_proxy_;
8433ctx.server_mgr_ = &server_manager_;
8434ctx.zone_mgr_ = &zone_manager_;
8435ctx.schema_service_ = schema_service_;
8436ctx.ddl_service_ = &ddl_service_;
8437ctx.config_mgr_ = config_mgr_;
8438ctx.unit_mgr_ = &unit_manager_;
8439ctx.root_inspection_ = &root_inspection_;
8440ctx.root_service_ = this;
8441ctx.root_balancer_ = &root_balancer_;
8442ctx.upgrade_storage_format_executor_ = &upgrade_storage_format_executor_;
8443ctx.create_inner_schema_executor_ = &create_inner_schema_executor_;
8444ctx.inited_ = true;
8445}
8446return ret;
8447}
8448
8449int ObRootService::admin_switch_replica_role(const obrpc::ObAdminSwitchReplicaRoleArg &arg)
8450{
8451int ret = OB_SUCCESS;
8452if (!inited_) {
8453ret = OB_NOT_INIT;
8454LOG_WARN("not init", K(ret));
8455} else if (!arg.is_valid()) {
8456ret = OB_INVALID_ARGUMENT;
8457LOG_WARN("invalid arg", K(arg), K(ret));
8458} else {
8459ObSystemAdminCtx ctx;
8460if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8461LOG_WARN("init_sys_admin_ctx failed", K(ret));
8462} else {
8463ObAdminSwitchReplicaRole admin_util(ctx);
8464if (OB_FAIL(admin_util.execute(arg))) {
8465LOG_WARN("execute switch replica role failed", K(arg), K(ret));
8466}
8467}
8468}
8469ROOTSERVICE_EVENT_ADD("root_service", "admin_switch_replica_role", K(ret), K(arg));
8470return ret;
8471}
8472
8473int ObRootService::admin_switch_rs_role(const obrpc::ObAdminSwitchRSRoleArg &arg)
8474{
8475int ret = OB_NOT_SUPPORTED;
8476UNUSED(arg);
8477return ret;
8478}
8479
8480int ObRootService::admin_change_replica(const obrpc::ObAdminChangeReplicaArg &arg)
8481{
8482int ret = OB_NOT_SUPPORTED;
8483UNUSED(arg);
8484return ret;
8485}
8486
8487int ObRootService::admin_drop_replica(const obrpc::ObAdminDropReplicaArg &arg)
8488{
8489int ret = OB_NOT_SUPPORTED;
8490UNUSED(arg);
8491return ret;
8492}
8493
8494int ObRootService::admin_migrate_replica(const obrpc::ObAdminMigrateReplicaArg &arg)
8495{
8496int ret = OB_NOT_SUPPORTED;
8497UNUSED(arg);
8498return ret;
8499}
8500
8501int ObRootService::admin_report_replica(const obrpc::ObAdminReportReplicaArg &arg)
8502{
8503int ret = OB_SUCCESS;
8504if (!inited_) {
8505ret = OB_NOT_INIT;
8506LOG_WARN("not init", K(ret));
8507} else if (!arg.is_valid()) {
8508ret = OB_INVALID_ARGUMENT;
8509LOG_WARN("invalid arg", K(arg), K(ret));
8510} else {
8511ObSystemAdminCtx ctx;
8512if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8513LOG_WARN("init_sys_admin_ctx failed", K(ret));
8514} else {
8515ObAdminReportReplica admin_util(ctx);
8516if (OB_FAIL(admin_util.execute(arg))) {
8517LOG_WARN("execute report replica failed", K(arg), K(ret));
8518}
8519}
8520}
8521ROOTSERVICE_EVENT_ADD("root_service", "admin_report_replica", K(ret), K(arg));
8522return ret;
8523}
8524
8525int ObRootService::admin_flush_cache(const obrpc::ObAdminFlushCacheArg &arg)
8526{
8527int ret = OB_SUCCESS;
8528if (!inited_) {
8529ret = OB_NOT_INIT;
8530LOG_WARN("not init", K(ret));
8531} else if (!arg.is_valid()) {
8532ret = OB_INVALID_ARGUMENT;
8533LOG_WARN("invalid arg", K(arg), K(ret));
8534} else {
8535ObSystemAdminCtx ctx;
8536if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8537LOG_WARN("init_sys_admin_ctx failed", K(ret));
8538} else {
8539ObAdminFlushCache admin_util(ctx);
8540if (OB_FAIL(admin_util.execute(arg))) {
8541LOG_WARN("dispatch flush cache failed", K(arg), K(ret));
8542}
8543ROOTSERVICE_EVENT_ADD("root_service", "admin_flush_cache", K(ret), K(arg));
8544}
8545}
8546return ret;
8547}
8548
8549int ObRootService::admin_recycle_replica(const obrpc::ObAdminRecycleReplicaArg &arg)
8550{
8551int ret = OB_SUCCESS;
8552if (!inited_) {
8553ret = OB_NOT_INIT;
8554LOG_WARN("not init", K(ret));
8555} else if (!arg.is_valid()) {
8556ret = OB_INVALID_ARGUMENT;
8557LOG_WARN("invalid arg", K(arg), K(ret));
8558} else {
8559ObSystemAdminCtx ctx;
8560if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8561LOG_WARN("init_sys_admin_ctx failed", K(ret));
8562} else {
8563ObAdminRecycleReplica admin_util(ctx);
8564if (OB_FAIL(admin_util.execute(arg))) {
8565LOG_WARN("execute recycle replica failed", K(arg), K(ret));
8566}
8567}
8568}
8569ROOTSERVICE_EVENT_ADD("root_service", "admin_recycle_replica", K(ret), K(arg));
8570return ret;
8571}
8572
8573int ObRootService::admin_merge(const obrpc::ObAdminMergeArg &arg)
8574{
8575int ret = OB_SUCCESS;
8576if (!inited_) {
8577ret = OB_NOT_INIT;
8578LOG_WARN("not init", K(ret));
8579} else if (!arg.is_valid()) {
8580ret = OB_INVALID_ARGUMENT;
8581LOG_WARN("invalid arg", K(arg), K(ret));
8582} else {
8583ObSystemAdminCtx ctx;
8584if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8585LOG_WARN("init_sys_admin_ctx failed", K(ret));
8586} else {
8587ObAdminMerge admin_util(ctx);
8588if (OB_FAIL(admin_util.execute(arg))) {
8589LOG_WARN("execute merge control failed", K(arg), K(ret));
8590}
8591}
8592}
8593ROOTSERVICE_EVENT_ADD("root_service", "admin_merge", K(ret), K(arg));
8594return ret;
8595}
8596
8597int ObRootService::admin_recovery(const obrpc::ObAdminRecoveryArg &arg)
8598{
8599int ret = OB_NOT_SUPPORTED;
8600if (OB_UNLIKELY(!inited_)) {
8601ret = OB_NOT_INIT;
8602LOG_WARN("ObRootService has not been inited", K(ret));
8603} else if (OB_UNLIKELY(!arg.is_valid())) {
8604ret = OB_INVALID_ARGUMENT;
8605LOG_WARN("invalid arguments", K(ret), K(arg));
8606} else {
8607ObSystemAdminCtx ctx;
8608if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8609LOG_WARN("init_sys_admin_ctx failed", K(ret));
8610} else {
8611ObAdminZoneFastRecovery admin_util(ctx);
8612if (OB_FAIL(admin_util.execute(arg))) {
8613LOG_WARN("execute merge control failed", K(arg), K(ret));
8614}
8615}
8616}
8617ROOTSERVICE_EVENT_ADD("root_service", "admin_recovery", K(ret), K(arg));
8618return ret;
8619}
8620
8621int ObRootService::admin_clear_roottable(const obrpc::ObAdminClearRoottableArg &arg)
8622{
8623int ret = OB_SUCCESS;
8624if (!inited_) {
8625ret = OB_NOT_INIT;
8626LOG_WARN("not init", K(ret));
8627} else if (!arg.is_valid()) {
8628ret = OB_INVALID_ARGUMENT;
8629LOG_WARN("invalid arg", K(arg), K(ret));
8630} else {
8631ObSystemAdminCtx ctx;
8632if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8633LOG_WARN("init_sys_admin_ctx failed", K(ret));
8634} else {
8635ObAdminClearRoottable admin_util(ctx);
8636if (OB_FAIL(admin_util.execute(arg))) {
8637LOG_WARN("execute clear root table failed", K(arg), K(ret));
8638}
8639}
8640}
8641ROOTSERVICE_EVENT_ADD("root_service", "admin_clear_roottable", K(ret), K(arg));
8642return ret;
8643}
8644
8645int ObRootService::admin_refresh_schema(const obrpc::ObAdminRefreshSchemaArg &arg)
8646{
8647int ret = OB_SUCCESS;
8648if (!inited_) {
8649ret = OB_NOT_INIT;
8650LOG_WARN("not init", K(ret));
8651} else if (!arg.is_valid()) {
8652ret = OB_INVALID_ARGUMENT;
8653LOG_WARN("invalid arg", K(arg), K(ret));
8654} else {
8655ObSystemAdminCtx ctx;
8656if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8657LOG_WARN("init_sys_admin_ctx failed", K(ret));
8658} else {
8659ObAdminRefreshSchema admin_util(ctx);
8660if (OB_FAIL(admin_util.execute(arg))) {
8661LOG_WARN("execute refresh schema failed", K(arg), K(ret));
8662}
8663}
8664}
8665ROOTSERVICE_EVENT_ADD("root_service", "admin_refresh_schema", K(ret), K(arg));
8666return ret;
8667}
8668
8669int ObRootService::admin_set_config(obrpc::ObAdminSetConfigArg &arg)
8670{
8671int ret = OB_SUCCESS;
8672if (!inited_) {
8673ret = OB_NOT_INIT;
8674LOG_WARN("not init", K(ret));
8675} else if (!arg.is_valid()) {
8676ret = OB_INVALID_ARGUMENT;
8677LOG_WARN("invalid arg", K(arg), K(ret));
8678} else if (arg.is_backup_config_) {
8679if (OB_FAIL(admin_set_backup_config(arg))) {
8680LOG_WARN("fail to set backup config", K(ret), K(arg));
8681}
8682} else {
8683ObSystemAdminCtx ctx;
8684if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8685LOG_WARN("init_sys_admin_ctx failed", K(ret));
8686} else {
8687ObLatchWGuard guard(set_config_lock_, ObLatchIds::CONFIG_LOCK);
8688ObAdminSetConfig admin_util(ctx);
8689if (OB_FAIL(admin_util.execute(arg))) {
8690LOG_WARN("execute set config failed", K(arg), K(ret));
8691}
8692}
8693}
8694// Add event one by one if more than one parameters are set
8695for (int i = 0; i < arg.items_.count(); i++) {
8696ROOTSERVICE_EVENT_ADD_TRUNCATE("root_service", "admin_set_config", K(ret), "arg", arg.items_.at(i), "is_inner", arg.is_inner_);
8697}
8698return ret;
8699}
8700
8701int ObRootService::admin_clear_location_cache(
8702const obrpc::ObAdminClearLocationCacheArg &arg)
8703{
8704int ret = OB_SUCCESS;
8705if (!inited_) {
8706ret = OB_NOT_INIT;
8707LOG_WARN("not init", K(ret));
8708} else if (!arg.is_valid()) {
8709ret = OB_INVALID_ARGUMENT;
8710LOG_WARN("invalid arg", K(arg), K(ret));
8711} else {
8712ObSystemAdminCtx ctx;
8713if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8714LOG_WARN("init_sys_admin_ctx failed", K(ret));
8715} else {
8716ObAdminClearLocationCache admin_util(ctx);
8717if (OB_FAIL(admin_util.execute(arg))) {
8718LOG_WARN("execute clear location cache failed", K(arg), K(ret));
8719}
8720}
8721}
8722ROOTSERVICE_EVENT_ADD("root_service", "admin_clear_location_cache", K(ret), K(arg));
8723return ret;
8724}
8725
8726int ObRootService::admin_refresh_memory_stat(const ObAdminRefreshMemStatArg &arg)
8727{
8728int ret = OB_SUCCESS;
8729if (!inited_) {
8730ret = OB_NOT_INIT;
8731LOG_WARN("not init", K(ret));
8732} else {
8733ObSystemAdminCtx ctx;
8734if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8735LOG_WARN("init_sys_admin_ctx failed", K(ret));
8736} else {
8737ObAdminRefreshMemStat admin_util(ctx);
8738if (OB_FAIL(admin_util.execute(arg))) {
8739LOG_WARN("execute refresh memory stat failed", K(ret));
8740}
8741}
8742}
8743ROOTSERVICE_EVENT_ADD("root_service", "admin_refresh_memory_stat", K(ret));
8744return ret;
8745}
8746
8747int ObRootService::admin_wash_memory_fragmentation(const ObAdminWashMemFragmentationArg &arg)
8748{
8749int ret = OB_SUCCESS;
8750if (!inited_) {
8751ret = OB_NOT_INIT;
8752LOG_WARN("not init", K(ret));
8753} else {
8754ObSystemAdminCtx ctx;
8755if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8756LOG_WARN("init_sys_admin_ctx failed", K(ret));
8757} else {
8758ObAdminWashMemFragmentation admin_util(ctx);
8759if (OB_FAIL(admin_util.execute(arg))) {
8760LOG_WARN("execute refresh memory stat failed", K(ret));
8761}
8762}
8763}
8764ROOTSERVICE_EVENT_ADD("root_service", "admin_wash_memory_fragmentation", K(ret));
8765return ret;
8766}
8767
8768int ObRootService::admin_refresh_io_calibration(const obrpc::ObAdminRefreshIOCalibrationArg &arg)
8769{
8770int ret = OB_SUCCESS;
8771if (OB_UNLIKELY(!inited_)) {
8772ret = OB_NOT_INIT;
8773LOG_WARN("not init", K(ret));
8774} else if (OB_UNLIKELY(!arg.is_valid())) {
8775ret = OB_INVALID_ARGUMENT;
8776LOG_WARN("invalid argument", K(ret), K(arg));
8777} else {
8778ObSystemAdminCtx ctx;
8779if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8780LOG_WARN("init_sys_admin_ctx failed", K(ret));
8781} else {
8782ObAdminRefreshIOCalibration admin_util(ctx);
8783if (OB_FAIL(admin_util.execute(arg))) {
8784LOG_WARN("execute refresh io calibration failed", K(ret));
8785}
8786}
8787}
8788ROOTSERVICE_EVENT_ADD("root_service", "admin_refresh_io_calibration", K(ret));
8789return ret;
8790}
8791
8792int ObRootService::admin_reload_unit()
8793{
8794int ret = OB_SUCCESS;
8795if (!inited_) {
8796ret = OB_NOT_INIT;
8797LOG_WARN("not init", K(ret));
8798} else {
8799ObSystemAdminCtx ctx;
8800if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8801LOG_WARN("init_sys_admin_ctx failed", K(ret));
8802} else {
8803ObAdminReloadUnit admin_util(ctx);
8804if (OB_FAIL(admin_util.execute())) {
8805LOG_WARN("execute reload unit failed", K(ret));
8806}
8807}
8808}
8809ROOTSERVICE_EVENT_ADD("root_service", "admin_reload_unit", K(ret));
8810return ret;
8811}
8812
8813int ObRootService::admin_reload_server()
8814{
8815int ret = OB_SUCCESS;
8816if (!inited_) {
8817ret = OB_NOT_INIT;
8818LOG_WARN("not init", K(ret));
8819} else {
8820ObSystemAdminCtx ctx;
8821if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8822LOG_WARN("init_sys_admin_ctx failed", K(ret));
8823} else {
8824ObAdminReloadServer admin_util(ctx);
8825if (OB_FAIL(admin_util.execute())) {
8826LOG_WARN("execute reload server failed", K(ret));
8827}
8828}
8829}
8830ROOTSERVICE_EVENT_ADD("root_service", "admin_reload_server", K(ret));
8831return ret;
8832}
8833
8834int ObRootService::admin_reload_zone()
8835{
8836int ret = OB_SUCCESS;
8837if (!inited_) {
8838ret = OB_NOT_INIT;
8839LOG_WARN("not init", K(ret));
8840} else {
8841ObSystemAdminCtx ctx;
8842if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8843LOG_WARN("init_sys_admin_ctx failed", K(ret));
8844} else {
8845ObAdminReloadZone admin_util(ctx);
8846if (OB_FAIL(admin_util.execute())) {
8847LOG_WARN("execute reload zone failed", K(ret));
8848}
8849}
8850}
8851ROOTSERVICE_EVENT_ADD("root_service", "admin_reload_zone", K(ret));
8852return ret;
8853}
8854
8855int ObRootService::admin_clear_merge_error(const obrpc::ObAdminMergeArg &arg)
8856{
8857int ret = OB_SUCCESS;
8858LOG_INFO("admin receive clear_merge_error request");
8859if (!inited_) {
8860ret = OB_NOT_INIT;
8861LOG_WARN("not init", K(ret));
8862} else {
8863ObSystemAdminCtx ctx;
8864if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8865LOG_WARN("init_sys_admin_ctx failed", KR(ret));
8866} else {
8867ObAdminClearMergeError admin_util(ctx);
8868if (OB_FAIL(admin_util.execute(arg))) {
8869LOG_WARN("execute clear merge error failed", KR(ret), K(arg));
8870}
8871ROOTSERVICE_EVENT_ADD("root_service", "clear_merge_error", KR(ret), K(arg));
8872}
8873}
8874return ret;
8875}
8876
8877#ifdef OB_BUILD_ARBITRATION
8878int ObRootService::admin_add_arbitration_service(const obrpc::ObAdminAddArbitrationServiceArg &arg)
8879{
8880int ret = OB_SUCCESS;
8881if (!inited_) {
8882ret = OB_NOT_INIT;
8883LOG_WARN("not init", KR(ret));
8884} else if (!arg.is_valid()) {
8885ret = OB_INVALID_ARGUMENT;
8886LOG_WARN("invalid arg", KR(ret), K(arg));
8887} else if (OB_FAIL(share::ObArbitrationServiceUtils::add_arbitration_service(sql_proxy_, arg))) {
8888LOG_WARN("fail to add arbitration service", KR(ret), K(arg));
8889}
8890ROOTSERVICE_EVENT_ADD("arb_service", "admin_add_arbitration_service", K(ret), K(arg));
8891return ret;
8892}
8893
8894int ObRootService::admin_remove_arbitration_service(const obrpc::ObAdminRemoveArbitrationServiceArg &arg)
8895{
8896int ret = OB_SUCCESS;
8897if (!inited_) {
8898ret = OB_NOT_INIT;
8899LOG_WARN("not init", KR(ret));
8900} else if (!arg.is_valid()) {
8901ret = OB_INVALID_ARGUMENT;
8902LOG_WARN("invalid arg", KR(ret), K(arg));
8903} else if (OB_FAIL(share::ObArbitrationServiceUtils::remove_arbitration_service(sql_proxy_, arg))) {
8904LOG_WARN("fail to remove arbitration service", KR(ret), K(arg));
8905}
8906ROOTSERVICE_EVENT_ADD("arb_service", "admin_remove_arbitration_service", K(ret), K(arg));
8907return ret;
8908}
8909
8910int ObRootService::admin_replace_arbitration_service(const obrpc::ObAdminReplaceArbitrationServiceArg &arg)
8911{
8912int ret = OB_SUCCESS;
8913if (!inited_) {
8914ret = OB_NOT_INIT;
8915LOG_WARN("not init", KR(ret));
8916} else if (!arg.is_valid()) {
8917ret = OB_INVALID_ARGUMENT;
8918LOG_WARN("invalid arg", KR(ret), K(arg));
8919} else if (OB_FAIL(share::ObArbitrationServiceUtils::replace_arbitration_service(sql_proxy_, arg))) {
8920LOG_WARN("fail to replace arbitration service", KR(ret), K(arg));
8921}
8922ROOTSERVICE_EVENT_ADD("arb_service", "admin_replace_arbitration_service", K(ret), K(arg));
8923return ret;
8924}
8925
8926int ObRootService::remove_cluster_info_from_arb_server(const obrpc::ObRemoveClusterInfoFromArbServerArg &arg)
8927{
8928int ret = OB_SUCCESS;
8929if (!inited_) {
8930ret = OB_NOT_INIT;
8931LOG_WARN("not init", KR(ret));
8932} else if (!arg.is_valid()) {
8933ret = OB_INVALID_ARGUMENT;
8934LOG_WARN("invalid arg", KR(ret), K(arg));
8935} else if (OB_FAIL(ObArbitrationServiceUtils::remove_cluster_info_from_arb_server(arg.get_arbitration_service()))) {
8936LOG_WARN("fail to remove cluster info from arb server", KR(ret), K(arg));
8937}
8938return ret;
8939}
8940#endif
8941
8942int ObRootService::admin_migrate_unit(const obrpc::ObAdminMigrateUnitArg &arg)
8943{
8944int ret = OB_SUCCESS;
8945if (!inited_) {
8946ret = OB_NOT_INIT;
8947LOG_WARN("not init", K(ret));
8948} else if (!arg.is_valid()) {
8949ret = OB_INVALID_ARGUMENT;
8950LOG_WARN("invalid arg", K(arg), K(ret));
8951} else {
8952ObSystemAdminCtx ctx;
8953if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8954LOG_WARN("init_sys_admin_ctx failed", K(ret));
8955} else {
8956ObAdminMigrateUnit admin_util(ctx);
8957if (OB_FAIL(admin_util.execute(arg))) {
8958LOG_WARN("execute migrate unit failed", K(arg), K(ret));
8959}
8960}
8961}
8962ROOTSERVICE_EVENT_ADD("root_service", "admin_migrate_unit", K(ret), K(arg));
8963return ret;
8964}
8965
8966int ObRootService::admin_upgrade_virtual_schema()
8967{
8968int ret = OB_SUCCESS;
8969if (!inited_) {
8970ret = OB_NOT_INIT;
8971LOG_WARN("not init", K(ret));
8972} else {
8973ObSystemAdminCtx ctx;
8974if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8975LOG_WARN("init_sys_admin_ctx failed", K(ret));
8976} else {
8977ObAdminUpgradeVirtualSchema admin_util(ctx);
8978if (OB_FAIL(admin_util.execute())) {
8979LOG_WARN("upgrade virtual schema failed", K(ret));
8980}
8981}
8982}
8983ROOTSERVICE_EVENT_ADD("root_service", "admin_upgrade_virtual_schema", K(ret));
8984return ret;
8985}
8986
8987int ObRootService::admin_upgrade_cmd(const obrpc::Bool &arg)
8988{
8989int ret = OB_SUCCESS;
8990if (!inited_) {
8991ret = OB_NOT_INIT;
8992LOG_WARN("not init", K(ret));
8993} else {
8994ObSystemAdminCtx ctx;
8995if (OB_FAIL(init_sys_admin_ctx(ctx))) {
8996LOG_WARN("init_sys_admin_ctx failed", K(ret));
8997} else {
8998ObAdminUpgradeCmd admin_util(ctx);
8999if (OB_FAIL(admin_util.execute(arg))) {
9000LOG_WARN("begin upgrade failed", K(ret));
9001}
9002}
9003}
9004ROOTSERVICE_EVENT_ADD("root_service", "admin_upgrade_cmd", K(ret), K(arg));
9005return ret;
9006}
9007
9008int ObRootService::admin_rolling_upgrade_cmd(const obrpc::ObAdminRollingUpgradeArg &arg)
9009{
9010int ret = OB_SUCCESS;
9011if (!inited_) {
9012ret = OB_NOT_INIT;
9013LOG_WARN("not init", K(ret));
9014} else {
9015ObSystemAdminCtx ctx;
9016if (OB_FAIL(init_sys_admin_ctx(ctx))) {
9017LOG_WARN("init_sys_admin_ctx failed", K(ret));
9018} else {
9019ObAdminRollingUpgradeCmd admin_util(ctx);
9020if (OB_FAIL(admin_util.execute(arg))) {
9021LOG_WARN("begin upgrade failed", K(ret));
9022}
9023}
9024}
9025ROOTSERVICE_EVENT_ADD("root_service", "admin_rolling_upgrade_cmd", K(ret), K(arg));
9026return ret;
9027}
9028
9029int ObRootService::physical_restore_tenant(const obrpc::ObPhysicalRestoreTenantArg &arg, obrpc::Int64 &res_job_id)
9030{
9031int ret = OB_SUCCESS;
9032bool has_standby_cluster = false;
9033res_job_id = OB_INVALID_ID;
9034int64_t current_timestamp = ObTimeUtility::current_time();
9035int64_t start_ts = ObTimeUtility::current_time();
9036int64_t job_id = OB_INVALID_ID;
9037int64_t refreshed_schema_version = OB_INVALID_VERSION;
9038ObSchemaGetterGuard schema_guard;
9039int64_t restore_concurrency = 0;
9040omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID()));
9041if (tenant_config.is_valid()) {
9042restore_concurrency = tenant_config->ha_high_thread_score;
9043}
9044if (0 == restore_concurrency) {
9045restore_concurrency = OB_DEFAULT_RESTORE_CONCURRENCY;
9046}
9047
9048if (!inited_) {
9049ret = OB_NOT_INIT;
9050LOG_WARN("not init", K(ret));
9051} else if (!arg.is_valid()) {
9052ret = OB_INVALID_ARGUMENT;
9053LOG_WARN("invalid arg", K(arg), K(ret));
9054} else if (GCTX.is_standby_cluster() || GCONF.in_upgrade_mode()) {
9055ret = OB_OP_NOT_ALLOW;
9056LOG_WARN("restore tenant while in standby cluster or "
9057"in upgrade mode is not allowed", KR(ret));
9058LOG_USER_ERROR(OB_OP_NOT_ALLOW,
9059"restore tenant while in standby cluster or in upgrade mode");
9060} else if (0 == restore_concurrency) {
9061ret = OB_OP_NOT_ALLOW;
9062LOG_WARN("restore tenant when restore_concurrency is 0 not allowed", KR(ret));
9063LOG_USER_ERROR(OB_OP_NOT_ALLOW, "restore tenant when restore_concurrency is 0");
9064} else if (OB_FAIL(ObResolverUtils::check_not_supported_tenant_name(arg.tenant_name_))) {
9065LOG_WARN("unsupported tenant name", KR(ret), "tenant_name", arg.tenant_name_);
9066} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
9067OB_SYS_TENANT_ID, schema_guard))) {
9068LOG_WARN("fail to get sys tenant's schema guard", KR(ret));
9069} else if (OB_FAIL(schema_guard.get_schema_version(OB_SYS_TENANT_ID, refreshed_schema_version))) {
9070LOG_WARN("fail to get sys schema version", KR(ret));
9071} else {
9072HEAP_VAR(ObPhysicalRestoreJob, job_info) {
9073// just to check sys tenant's schema with latest schema version
9074ObDDLSQLTransaction trans(schema_service_, false /*end_signal*/);
9075if (OB_FAIL(trans.start(&sql_proxy_, OB_SYS_TENANT_ID, refreshed_schema_version))) {
9076LOG_WARN("failed to start trans, ", K(ret));
9077} else if (OB_FAIL(RS_JOB_CREATE_EXT(job_id, RESTORE_TENANT, trans,
9078"sql_text", ObHexEscapeSqlStr(arg.get_sql_stmt())))) {
9079LOG_WARN("fail create rs job", K(ret), K(arg));
9080} else if (job_id < 0) {
9081ret = OB_ERR_UNEXPECTED;
9082LOG_WARN("invalid job_id", K(ret), K(job_id));
9083} else if (OB_FAIL(ObRestoreUtil::fill_physical_restore_job(job_id, arg, job_info))) {
9084LOG_WARN("fail to fill physical restore job", K(ret), K(job_id), K(arg));
9085} else {
9086job_info.set_restore_start_ts(start_ts);
9087res_job_id = job_id;
9088}
9089if (FAILEDx(check_restore_tenant_valid(job_info, schema_guard))) {
9090LOG_WARN("failed to check restore tenant vailid", KR(ret), K(job_info));
9091}
9092
9093if (FAILEDx(ObRestoreUtil::record_physical_restore_job(trans, job_info))) {
9094LOG_WARN("fail to record physical restore job", K(ret), K(job_id), K(arg));
9095} else {
9096//TODO wakeup restore scheduler
9097}
9098
9099if (trans.is_started()) {
9100int temp_ret = OB_SUCCESS;
9101if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) {
9102LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, K(temp_ret));
9103ret = (OB_SUCC(ret)) ? temp_ret : ret;
9104}
9105}
9106}
9107}
9108LOG_INFO("[RESTORE] physical restore tenant start", K(arg), K(ret));
9109ROOTSERVICE_EVENT_ADD("physical_restore", "restore_start", K(ret),
9110"tenant_name", arg.tenant_name_);
9111if (OB_SUCC(ret)) {
9112const char *status_str = ObPhysicalRestoreTableOperator::get_restore_status_str(
9113static_cast<PhysicalRestoreStatus>(PHYSICAL_RESTORE_CREATE_TENANT));
9114ROOTSERVICE_EVENT_ADD("physical_restore", "change_restore_status",
9115"job_id", job_id,
9116"tenant_name", arg.tenant_name_,
9117"status", status_str);
9118}
9119return ret;
9120}
9121
9122int ObRootService::check_restore_tenant_valid(const share::ObPhysicalRestoreJob &job_info,
9123share::schema::ObSchemaGetterGuard &schema_guard)
9124{
9125int ret = OB_SUCCESS;
9126if (OB_UNLIKELY(!inited_)) {
9127ret = OB_NOT_INIT;
9128LOG_WARN("not init", K(ret));
9129} else if (OB_UNLIKELY(!job_info.is_valid())) {
9130ret = OB_INVALID_ARGUMENT;
9131LOG_WARN("invalid arg", KR(ret), K(job_info));
9132} else {
9133//check tenant if exist
9134const ObTenantSchema *tenant_schema = NULL;
9135const ObString &tenant_name = job_info.get_tenant_name();
9136if (OB_FAIL(schema_guard.get_tenant_info(tenant_name, tenant_schema))) {
9137LOG_WARN("fail to get tenant schema", KR(ret), K(job_info));
9138} else if (OB_NOT_NULL(tenant_schema)) {
9139ret = OB_OP_NOT_ALLOW;
9140LOG_WARN("restore tenant with existed tenant name is not allowed", KR(ret), K(tenant_name));
9141LOG_USER_ERROR(OB_OP_NOT_ALLOW, "restore tenant with existed tenant name is");
9142} else {
9143// check if resource pool contains any E zone
9144ObSqlString pool_list_str;
9145ObArray<ObString> pool_list;
9146ObArray<ObResourcePoolName> pools;
9147ObArray<ObZone> zones;
9148if (OB_FAIL(pool_list_str.assign(job_info.get_pool_list()))) {
9149LOG_WARN("failed to assign pool list", KR(ret), K(job_info));
9150} else if (OB_FAIL(ObRestoreScheduler::assign_pool_list(pool_list_str.ptr(), pool_list))) {
9151LOG_WARN("failed to assgin pool list", KR(ret), K(pool_list_str));
9152} else if (OB_FAIL(ObUnitManager::convert_pool_name_list(pool_list, pools))) {
9153LOG_WARN("fail to convert pools", KR(ret), K(pool_list));
9154} else if (OB_FAIL(unit_manager_.get_zones_of_pools(pools, zones))) {
9155LOG_WARN("fail to get zones of pools", KR(ret), K(pools));
9156} else {
9157HEAP_VAR(ObZoneInfo, info) {
9158for (int64_t i = 0; OB_SUCC(ret) && i < zones.count(); i++) {
9159const ObZone &zone = zones.at(i);
9160info.reset();
9161if (OB_FAIL(zone_manager_.get_zone(zone, info))) {
9162LOG_WARN("fail to get zone info", KR(ret), K(zone));
9163} else if (static_cast<int64_t>(ObZoneType::ZONE_TYPE_ENCRYPTION) == info.zone_type_.value_) {
9164ret = OB_NOT_SUPPORTED;
9165LOG_WARN("restore tenant with encrypted zone is not supported", KR(ret), K(info));
9166}
9167}
9168}
9169}
9170}
9171}
9172//TODO check if need check R replica
9173return ret;
9174}
9175
9176int ObRootService::run_job(const obrpc::ObRunJobArg &arg)
9177{
9178int ret = OB_SUCCESS;
9179if (!inited_) {
9180ret = OB_NOT_INIT;
9181LOG_WARN("not init", K(ret));
9182} else if (!arg.is_valid()) {
9183ret = OB_INVALID_ARGUMENT;
9184LOG_WARN("invalid arg", K(arg), K(ret));
9185} else {
9186ObSystemAdminCtx ctx;
9187if (OB_FAIL(init_sys_admin_ctx(ctx))) {
9188LOG_WARN("init_sys_admin_ctx failed", K(ret));
9189} else {
9190ObAdminRunJob admin_util(ctx);
9191if (OB_FAIL(admin_util.execute(arg))) {
9192LOG_WARN("run job failed", K(arg), K(ret));
9193}
9194}
9195}
9196ROOTSERVICE_EVENT_ADD("root_service", "admin_run_job", K(ret), K(arg));
9197return ret;
9198}
9199
9200int ObRootService::run_upgrade_job(const obrpc::ObUpgradeJobArg &arg)
9201{
9202int ret = OB_SUCCESS;
9203int64_t version = arg.version_;
9204if (!inited_) {
9205ret = OB_NOT_INIT;
9206LOG_WARN("not init", KR(ret), K(arg));
9207} else if (!arg.is_valid()) {
9208ret = OB_INVALID_ARGUMENT;
9209LOG_WARN("invalid arg", K(arg), KR(ret));
9210} else if (ObUpgradeJobArg::UPGRADE_POST_ACTION == arg.action_
9211&& !ObUpgradeChecker::check_data_version_exist(version)) {
9212ret = OB_NOT_SUPPORTED;
9213LOG_WARN("unsupported version to run upgrade job", KR(ret), K(version));
9214LOG_USER_ERROR(OB_NOT_SUPPORTED, "run upgrade job with such version is");
9215} else if (ObUpgradeJobArg::STOP_UPGRADE_JOB == arg.action_) {
9216if (OB_FAIL(upgrade_executor_.stop())) {
9217LOG_WARN("fail to stop upgrade task", KR(ret));
9218} else {
9219upgrade_executor_.start();
9220}
9221} else if (OB_FAIL(submit_upgrade_task(arg))) {
9222LOG_WARN("fail to submit upgrade task", KR(ret), K(arg));
9223}
9224ROOTSERVICE_EVENT_ADD("root_service", "admin_run_upgrade_job", KR(ret), K(arg));
9225return ret;
9226}
9227
9228int ObRootService::upgrade_table_schema(const obrpc::ObUpgradeTableSchemaArg &arg)
9229{
9230int ret = OB_SUCCESS;
9231const int64_t start = ObTimeUtility::current_time();
9232FLOG_INFO("[UPGRADE] start to upgrade table", K(arg));
9233if (!inited_) {
9234ret = OB_NOT_INIT;
9235LOG_WARN("not init", KR(ret));
9236} else if (!arg.is_valid()) {
9237ret = OB_INVALID_ARGUMENT;
9238LOG_WARN("arg is invalid", KR(ret), K(arg));
9239} else if (!arg.upgrade_virtual_schema()) {
9240// upgrade single system table
9241if (OB_FAIL(ddl_service_.upgrade_table_schema(arg))) {
9242LOG_WARN("fail to upgrade table schema", KR(ret), K(arg));
9243}
9244} else {
9245// upgrade all virtual table/sys view
9246ObSystemAdminCtx ctx;
9247if (OB_FAIL(init_sys_admin_ctx(ctx))) {
9248LOG_WARN("init_sys_admin_ctx failed", K(ret));
9249} else {
9250ObAdminUpgradeVirtualSchema admin_util(ctx);
9251int64_t upgrade_cnt = 0;
9252if (OB_FAIL(admin_util.execute(arg.get_tenant_id(), upgrade_cnt))) {
9253LOG_WARN("upgrade virtual schema failed", KR(ret), K(arg));
9254}
9255}
9256}
9257ROOTSERVICE_EVENT_ADD("ddl scheduler", "update table schema",
9258"tenant_id", arg.get_tenant_id(),
9259"ret", ret,
9260"trace_id", *ObCurTraceId::get_trace_id(),
9261"table_id", arg.get_table_id());
9262FLOG_INFO("[UPGRADE] finish upgrade table", KR(ret), K(arg),
9263"cost_us", ObTimeUtility::current_time() - start, "ddl_event_info", ObDDLEventInfo());
9264return ret;
9265}
9266
9267int ObRootService::broadcast_ds_action(const obrpc::ObDebugSyncActionArg &arg)
9268{
9269LOG_INFO("receive broadcast debug sync actions", K(arg));
9270int ret = OB_SUCCESS;
9271ObArray<ObAddr> server_list;
9272const ObZone all_zone;
9273if (!inited_) {
9274ret = OB_NOT_INIT;
9275LOG_WARN("not init", K(ret));
9276} else if (!arg.is_valid()) {
9277ret = OB_INVALID_ARGUMENT;
9278LOG_WARN("invalid arg", K(arg), K(ret));
9279} else if (OB_FAIL(SVR_TRACER.get_alive_servers(all_zone, server_list))) {
9280LOG_WARN("get all alive servers failed", K(all_zone), K(ret));
9281} else {
9282FOREACH_X(s, server_list, OB_SUCCESS == ret) {
9283if (OB_FAIL(rpc_proxy_.to(*s).timeout(config_->rpc_timeout).set_debug_sync_action(arg))) {
9284LOG_WARN("set server's global sync action failed", K(ret), "server", *s, K(arg));
9285}
9286}
9287}
9288return ret;
9289}
9290
9291int ObRootService::check_dangling_replica_finish(const obrpc::ObCheckDanglingReplicaFinishArg &arg)
9292{
9293UNUSED(arg);
9294return OB_NOT_SUPPORTED;
9295}
9296
9297int ObRootService::fetch_alive_server(const ObFetchAliveServerArg &arg,
9298ObFetchAliveServerResult &result)
9299{
9300LOG_DEBUG("receive fetch alive server request");
9301ObZone empty_zone; // for all server
9302int ret = OB_SUCCESS;
9303if (!inited_) {
9304ret = OB_NOT_INIT;
9305LOG_WARN("not init", K(ret));
9306} else if (!arg.is_valid()) {
9307ret = OB_INVALID_ARGUMENT;
9308LOG_WARN("invalid argument", K(ret), K(arg));
9309} else if (!server_refreshed_) {
9310ret = OB_SERVER_IS_INIT;
9311LOG_WARN("RS is initializing, server not refreshed, can not process this request");
9312} else if (arg.cluster_id_ != config_->cluster_id) {
9313ret = OB_ERR_UNEXPECTED;
9314LOG_WARN("cluster id mismatch",
9315K(ret), K(arg), "cluster_id", static_cast<int64_t>(config_->cluster_id));
9316} else if (OB_FAIL(SVR_TRACER.get_servers_by_status(empty_zone, result.active_server_list_,
9317result.inactive_server_list_))) {
9318LOG_WARN("get alive servers failed", K(ret));
9319}
9320return ret;
9321}
9322
9323int ObRootService::refresh_server(const bool load_frozen_status, const bool need_retry)
9324{
9325int ret = OB_SUCCESS;
9326if (!inited_) {
9327ret = OB_NOT_INIT;
9328LOG_WARN("not init", K(ret));
9329} else if (!in_service()|| (server_refreshed_ && load_frozen_status)) {
9330// no need to refresh again for fast recover
9331} else {
9332{
9333ObTimeoutCtx ctx;
9334if (load_frozen_status) {
9335ctx.set_timeout(config_->rpc_timeout);
9336}
9337if (OB_FAIL(load_server_manager())) {
9338LOG_WARN("build server manager failed", K(ret), K(load_frozen_status));
9339} else {
9340LOG_INFO("build server manager succeed", K(load_frozen_status));
9341}
9342if (FAILEDx(SVR_TRACER.refresh())) {
9343LOG_WARN("fail to refresh all server tracer", KR(ret));
9344}
9345}
9346// request heartbeats from observers
9347if (OB_SUCC(ret) && !ObHeartbeatService::is_service_enabled()) {
9348int temp_ret = OB_SUCCESS;
9349if (OB_SUCCESS != (temp_ret = request_heartbeats())) {
9350LOG_WARN("request heartbeats failed", K(temp_ret));
9351} else {
9352LOG_INFO("request heartbeats succeed");
9353}
9354}
9355if (OB_SUCC(ret)) {
9356server_refreshed_ = true;
9357LOG_INFO("refresh server success", K(load_frozen_status));
9358} else if (need_retry) {
9359LOG_INFO("refresh server failed, retry", K(ret), K(load_frozen_status));
9360int tmp_ret = OB_SUCCESS;
9361if (OB_SUCCESS != (tmp_ret = schedule_refresh_server_timer_task(
9362ObRefreshServerTask::REFRESH_SERVER_INTERVAL))) {
9363if (OB_CANCELED != ret) {
9364LOG_ERROR("schedule refresh server task failed", K(ret));
9365} else {
9366LOG_WARN("schedule refresh server task failed, because the server is stopping", K(ret));
9367}
9368} else {
9369ObTaskController::get().allow_next_syslog();
9370LOG_INFO("schedule refresh server task again", KR(tmp_ret), KR(ret));
9371}
9372} else {} // no more to do
9373}
9374return ret;
9375}
9376
9377int ObRootService::refresh_schema(const bool load_frozen_status)
9378{
9379int ret = OB_SUCCESS;
9380if (!inited_) {
9381ret = OB_NOT_INIT;
9382LOG_WARN("not init", K(ret));
9383} else {
9384ObTimeoutCtx ctx;
9385int64_t schema_version = OB_INVALID_VERSION;
9386if (load_frozen_status) {
9387ctx.set_timeout(config_->rpc_timeout);
9388}
9389ObArray<uint64_t> tenant_ids; //depend on sys schema while start RS
9390if (OB_FAIL(tenant_ids.push_back(OB_SYS_TENANT_ID))) {
9391LOG_WARN("fail to refresh sys schema", K(ret));
9392} else if (OB_FAIL(schema_service_->refresh_and_add_schema(tenant_ids))) {
9393LOG_WARN("refresh schema failed", K(ret), K(load_frozen_status));
9394} else if (OB_FAIL(schema_service_->get_tenant_schema_version(OB_SYS_TENANT_ID, schema_version))) {
9395LOG_WARN("fail to get max schema version", K(ret));
9396} else {
9397LOG_INFO("refresh schema with new mode succeed", K(load_frozen_status), K(schema_version));
9398}
9399if (OB_SUCC(ret)) {
9400ObSchemaService *schema_service = schema_service_->get_schema_service();
9401if (NULL == schema_service) {
9402ret = OB_ERR_SYS;
9403LOG_WARN("schema_service can't be null", K(ret), K(schema_version));
9404} else {
9405schema_service->set_refreshed_schema_version(schema_version);
9406LOG_INFO("set schema version succeed", K(ret), K(schema_service), K(schema_version));
9407}
9408}
9409}
9410return ret;
9411}
9412
9413int ObRootService::set_cluster_version()
9414{
9415int ret = OB_SUCCESS;
9416int64_t affected_rows = 0;
9417char sql[1024] = {0};
9418ObMySQLProxy &sql_proxy = ddl_service_.get_sql_proxy();
9419
9420snprintf(sql, sizeof(sql), "alter system set min_observer_version = '%s'", PACKAGE_VERSION);
9421if (OB_FAIL(sql_proxy.write(OB_SYS_TENANT_ID, sql, affected_rows))) {
9422LOG_WARN("execute sql failed", K(sql));
9423}
9424
9425return ret;
9426}
9427
9428int ObRootService::admin_set_tracepoint(const obrpc::ObAdminSetTPArg &arg)
9429{
9430int ret = OB_SUCCESS;
9431if (!inited_) {
9432ret = OB_NOT_INIT;
9433LOG_WARN("not init", K(ret));
9434} else if (!arg.is_valid()) {
9435ret = OB_INVALID_ARGUMENT;
9436LOG_WARN("invalid arg", K(arg), K(ret));
9437} else {
9438ObSystemAdminCtx ctx;
9439if (OB_FAIL(init_sys_admin_ctx(ctx))) {
9440LOG_WARN("init_sys_admin_ctx failed", K(ret));
9441} else {
9442ObAdminSetTP admin_util(ctx, arg);
9443if (OB_FAIL(admin_util.execute(arg))) {
9444LOG_WARN("execute report replica failed", K(arg), K(ret));
9445}
9446}
9447}
9448ROOTSERVICE_EVENT_ADD("root_service", "admin_set_tracepoint", K(ret), K(arg));
9449return ret;
9450}
9451
9452// RS may receive refresh time zone from observer with old binary during upgrade.
9453// do notiong
9454int ObRootService::refresh_time_zone_info(const obrpc::ObRefreshTimezoneArg &arg)
9455{
9456int ret = OB_SUCCESS;
9457UNUSED(arg);
9458ROOTSERVICE_EVENT_ADD("root_service", "refresh_time_zone_info", K(ret), K(arg));
9459return ret;
9460}
9461
9462int ObRootService::request_time_zone_info(const ObRequestTZInfoArg &arg, ObRequestTZInfoResult &result)
9463{
9464UNUSED(arg);
9465int ret = OB_SUCCESS;
9466uint64_t tenant_id = OB_SYS_TENANT_ID;
9467
9468ObTZMapWrap tz_map_wrap;
9469ObTimeZoneInfoManager *tz_info_mgr = NULL;
9470if (!inited_) {
9471ret = OB_NOT_INIT;
9472LOG_WARN("not init", K(ret));
9473} else if (OB_FAIL(OTTZ_MGR.get_tenant_timezone(tenant_id, tz_map_wrap, tz_info_mgr))) {
9474LOG_WARN("get tenant timezone failed", K(ret));
9475} else if (OB_ISNULL(tz_info_mgr)) {
9476ret = OB_ERR_UNEXPECTED;
9477LOG_WARN("get_tz_mgr failed", K(ret), K(tz_info_mgr));
9478} else if (OB_FAIL(tz_info_mgr->response_time_zone_info(result))) {
9479LOG_WARN("fail to response tz_info", K(ret));
9480} else {
9481LOG_INFO("rs success to response lastest tz_info to server", "server", arg.obs_addr_, "last_version", result.last_version_);
9482}
9483return ret;
9484}
9485
9486bool ObRootService::check_config(const ObConfigItem &item, const char *&err_info)
9487{
9488bool bret = true;
9489err_info = NULL;
9490if (!inited_) {
9491bret = false;
9492LOG_WARN_RET(OB_NOT_INIT, "service not init");
9493} else if (0 == STRCMP(item.name(), MIN_OBSERVER_VERSION)) {
9494if (OB_SUCCESS != ObClusterVersion::is_valid(item.str())) {
9495LOG_WARN_RET(OB_INVALID_ERROR, "fail to parse min_observer_version value");
9496bret = false;
9497}
9498} else if (0 == STRCMP(item.name(), __BALANCE_CONTROLLER)) {
9499ObString balance_troller_str(item.str());
9500ObRootBalanceHelp::BalanceController switch_info;
9501int tmp_ret = ObRootBalanceHelp::parse_balance_info(balance_troller_str, switch_info);
9502if (OB_SUCCESS != tmp_ret) {
9503LOG_WARN_RET(tmp_ret, "fail to parse balance switch", K(balance_troller_str));
9504bret = false;
9505}
9506}
9507return bret;
9508}
9509
9510int ObRootService::report_replica()
9511{
9512int ret = OB_SUCCESS;
9513ObArray<ObAddr> server_list;
9514ObZone null_zone;
9515if (!inited_) {
9516ret = OB_NOT_INIT;
9517LOG_WARN("not init", K(ret));
9518} else if (OB_FAIL(SVR_TRACER.get_alive_servers(null_zone, server_list))) {
9519LOG_WARN("fail to get alive server", K(ret));
9520} else {
9521FOREACH_CNT(server, server_list) {
9522if (OB_ISNULL(server)) {
9523ret = OB_ERR_UNEXPECTED;
9524LOG_WARN("get invalid server", K(ret));
9525} else if (OB_FAIL(rpc_proxy_.to(*server).report_replica())) {
9526LOG_WARN("fail to force observer report replica", K(ret), K(*server));
9527}
9528ret = OB_SUCCESS;
9529}
9530}
9531return ret;
9532}
9533
9534int ObRootService::report_single_replica(
9535const int64_t tenant_id,
9536const ObLSID &ls_id)
9537{
9538int ret = OB_SUCCESS;
9539ObArray<ObAddr> server_list;
9540ObZone null_zone;
9541obrpc::ObReportSingleReplicaArg arg;
9542if (OB_UNLIKELY(!inited_)) {
9543ret = OB_NOT_INIT;
9544LOG_WARN("not init", KR(ret));
9545} else if (OB_FAIL(SVR_TRACER.get_alive_servers(null_zone, server_list))) {
9546LOG_WARN("fail to get alive server", KR(ret));
9547} else if (OB_INVALID_TENANT_ID == tenant_id || !ls_id.is_valid()) {
9548ret = OB_INVALID_ARGUMENT;
9549LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(ls_id));
9550} else {
9551arg.tenant_id_ = tenant_id;
9552arg.ls_id_ = ls_id;
9553FOREACH_CNT(server, server_list) {
9554if (OB_ISNULL(server)) {
9555ret = OB_ERR_UNEXPECTED;
9556LOG_WARN("get invalid server", KR(ret));
9557// } else if (OB_FAIL(rpc_proxy_.to(*server).report_single_replica(arg))) {//TODO(xiuming):delete it
9558// LOG_WARN("fail to force observer report replica", KR(ret), K(server), K(arg));
9559}
9560ret = OB_SUCCESS;
9561}
9562}
9563return ret;
9564}
9565
9566int ObRootService::update_all_server_config()
9567{
9568int ret = OB_SUCCESS;
9569ObZone empty_zone;
9570ObArray<ObAddr> server_list;
9571ObArray<ObAddr> config_all_server_list;
9572ObArray<ObAddr> empty_excluded_server_list;
9573bool need_update = true;
9574HEAP_VAR(ObAdminSetConfigItem, all_server_config) {
9575auto &value = all_server_config.value_;
9576int64_t pos = 0;
9577if (!inited_) {
9578ret = OB_NOT_INIT;
9579LOG_WARN("not init", K(ret));
9580} else if (OB_UNLIKELY(!SVR_TRACER.has_build())) {
9581need_update = false;
9582} else if (OB_FAIL(SVR_TRACER.get_servers_of_zone(empty_zone, server_list))) {
9583LOG_WARN("fail to get server", K(ret));
9584} else if (OB_UNLIKELY(0 == server_list.size())) {
9585need_update = false;
9586LOG_WARN("no servers in all_server_tracer");
9587} else if (OB_FAIL(all_server_config.name_.assign(config_->all_server_list.name()))) {
9588LOG_WARN("fail to assign name", K(ret));
9589} else if (OB_FAIL(ObShareUtil::parse_all_server_list(empty_excluded_server_list, config_all_server_list))) {
9590LOG_WARN("fail to parse all_server_list from GCONF", KR(ret));
9591} else if (ObRootUtils::is_subset(server_list, config_all_server_list)
9592&& ObRootUtils::is_subset(config_all_server_list, server_list)) {
9593need_update = false;
9594LOG_TRACE("server_list is the same as config_all_server_list, no need to update GCONF.all_server_list",
9595K(server_list), K(config_all_server_list));
9596} else {
9597LOG_INFO("GCONF.all_server_list should be updated", K(config_all_server_list), K(server_list));
9598char ip_port_buf[MAX_IP_PORT_LENGTH];
9599for (int64_t i = 0; i < server_list.count() - 1; i++) {
9600if (OB_FAIL(server_list.at(i).ip_port_to_string(ip_port_buf, MAX_IP_PORT_LENGTH))) {
9601LOG_WARN("fail to print ip port", K(ret), "server", server_list.at(i));
9602} else if (OB_FAIL(databuff_printf(value.ptr(), OB_MAX_CONFIG_VALUE_LEN, pos, "%s", ip_port_buf))) {
9603LOG_WARN("fail to databuff_printf", K(ret), K(i), K(server_list));
9604} else if (OB_FAIL(databuff_printf(value.ptr(), OB_MAX_CONFIG_VALUE_LEN, pos, "%c", ','))) {
9605LOG_WARN("fail to print char", K(ret), K(i), K(server_list));
9606}
9607}
9608if (OB_SUCC(ret) && 0 < server_list.count()) {
9609if (OB_FAIL(server_list.at(server_list.count() - 1).ip_port_to_string(ip_port_buf, MAX_IP_PORT_LENGTH))) {
9610LOG_WARN("fail to print ip port", K(ret), "server", server_list.at(server_list.count() - 1));
9611} else if (OB_FAIL(databuff_printf(value.ptr(), OB_MAX_CONFIG_VALUE_LEN, pos, "%s", ip_port_buf))) {
9612LOG_WARN("fail to databuff_printf", K(ret), K(server_list), K(ip_port_buf));
9613}
9614}
9615}
9616if (OB_SIZE_OVERFLOW == ret) {
9617LOG_ERROR("can't print server addr to buffer, size overflow", K(ret), K(server_list));
9618}
9619if (need_update && OB_SUCC(ret)) {
9620ObAdminSetConfigArg arg;
9621arg.is_inner_ = true;
9622if (OB_FAIL(arg.items_.push_back(all_server_config))) {
9623LOG_WARN("fail to push back", K(ret));
9624} else if (OB_FAIL(admin_set_config(arg))) {
9625LOG_WARN("fail to set config", K(ret));
9626} else {
9627LOG_INFO("update all server config success", K(arg));
9628}
9629}
9630}
9631return ret;
9632}
9633/////////////////////////
9634ObRootService::ObReportCoreTableReplicaTask::ObReportCoreTableReplicaTask(ObRootService &root_service)
9635: ObAsyncTimerTask(root_service.task_queue_),
9636root_service_(root_service)
9637{
9638set_retry_times(INT64_MAX); //retry until success
9639}
9640
9641int ObRootService::ObReportCoreTableReplicaTask::process()
9642{
9643int ret = OB_SUCCESS;
9644const int64_t tenant_id = OB_SYS_TENANT_ID;
9645if (OB_FAIL(root_service_.report_single_replica(tenant_id, SYS_LS))) {
9646LOG_WARN("fail to report single replica", K(ret), K(tenant_id), K(SYS_LS));
9647} else {
9648LOG_INFO("report all_core table succeed");
9649}
9650return ret;
9651}
9652
9653ObAsyncTask *ObRootService::ObReportCoreTableReplicaTask::deep_copy(char *buf, const int64_t buf_size) const
9654{
9655ObReportCoreTableReplicaTask *task = NULL;
9656if (NULL == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
9657LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buffer not large enough", K(buf_size), KP(buf));
9658} else {
9659task = new (buf) ObReportCoreTableReplicaTask(root_service_);
9660}
9661return task;
9662}
9663//////////////ObReloadUnitManagerTask
9664ObRootService::ObReloadUnitManagerTask::ObReloadUnitManagerTask(ObRootService &root_service,
9665ObUnitManager &unit_manager)
9666: ObAsyncTimerTask(root_service.task_queue_),
9667root_service_(root_service),
9668unit_manager_(unit_manager)
9669{
9670set_retry_times(INT64_MAX); // retry until success
9671}
9672
9673int ObRootService::ObReloadUnitManagerTask::process()
9674{
9675int ret = OB_SUCCESS;
9676if (OB_FAIL(unit_manager_.load())) {
9677LOG_WARN("fail to reload unit_manager", K(ret));
9678} else {
9679LOG_INFO("reload unit_manger succeed");
9680}
9681return ret;
9682}
9683
9684ObAsyncTask *ObRootService::ObReloadUnitManagerTask::deep_copy(char *buf, const int64_t buf_size) const
9685{
9686ObReloadUnitManagerTask *task = NULL;
9687if (NULL == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
9688LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buffer not large enough", K(buf_size), KP(buf));
9689} else {
9690task = new (buf) ObReloadUnitManagerTask(root_service_, unit_manager_);
9691}
9692return task;
9693}
9694
9695ObRootService::ObLoadDDLTask::ObLoadDDLTask(ObRootService &root_service)
9696: ObAsyncTimerTask(root_service.task_queue_), root_service_(root_service)
9697{
9698set_retry_times(INT64_MAX);
9699}
9700
9701int ObRootService::ObLoadDDLTask::process()
9702{
9703int ret = OB_SUCCESS;
9704ObDDLScheduler &ddl_scheduler = root_service_.get_ddl_scheduler();
9705if (OB_FAIL(ddl_scheduler.recover_task())) {
9706LOG_WARN("load ddl task failed", K(ret));
9707}
9708return ret;
9709}
9710
9711ObAsyncTask *ObRootService::ObLoadDDLTask::deep_copy(char *buf, const int64_t buf_size) const
9712{
9713ObLoadDDLTask *task = nullptr;
9714if (nullptr == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
9715LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buf is not enough", K(buf_size), "request_size", sizeof(*this));
9716} else {
9717task = new (buf) ObLoadDDLTask(root_service_);
9718}
9719return task;
9720}
9721
9722ObRootService::ObRefreshIOCalibrationTask::ObRefreshIOCalibrationTask(ObRootService &root_service)
9723: ObAsyncTimerTask(root_service.task_queue_), root_service_(root_service)
9724{
9725set_retry_times(INT64_MAX);
9726}
9727
9728int ObRootService::ObRefreshIOCalibrationTask::process()
9729{
9730int ret = OB_SUCCESS;
9731obrpc::ObAdminRefreshIOCalibrationArg arg;
9732arg.only_refresh_ = true;
9733if (OB_FAIL(root_service_.admin_refresh_io_calibration(arg))) {
9734LOG_WARN("refresh io calibration failed", K(ret), K(arg));
9735} else {
9736LOG_INFO("refresh io calibration succeeded");
9737}
9738return ret;
9739}
9740
9741ObAsyncTask *ObRootService::ObRefreshIOCalibrationTask::deep_copy(char *buf, const int64_t buf_size) const
9742{
9743ObRefreshIOCalibrationTask *task = nullptr;
9744if (nullptr == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
9745LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buf is not enough", K(buf_size), "request_size", sizeof(*this));
9746} else {
9747task = new (buf) ObRefreshIOCalibrationTask(root_service_);
9748}
9749return task;
9750}
9751
9752////////////////////
9753ObRootService::ObSelfCheckTask::ObSelfCheckTask(ObRootService &root_service)
9754:ObAsyncTimerTask(root_service.task_queue_),
9755root_service_(root_service)
9756{
9757set_retry_times(0); // don't retry when failed
9758}
9759
9760int ObRootService::ObSelfCheckTask::process()
9761{
9762int ret = OB_SUCCESS;
9763if (OB_FAIL(root_service_.self_check())) {
9764LOG_WARN("fail to do root inspection check, please check it", K(ret));
9765} else {
9766LOG_INFO("self check success!");
9767}
9768return ret;
9769}
9770
9771ObAsyncTask *ObRootService::ObSelfCheckTask::deep_copy(char *buf, const int64_t buf_size) const
9772{
9773ObSelfCheckTask *task = NULL;
9774if (NULL == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
9775LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buffer not large enough", K(buf_size));
9776} else {
9777task = new(buf) ObSelfCheckTask(root_service_);
9778}
9779return task;
9780}
9781
9782/////////////////////////
9783ObRootService::ObUpdateAllServerConfigTask::ObUpdateAllServerConfigTask(ObRootService &root_service)
9784: ObAsyncTimerTask(root_service.task_queue_),
9785root_service_(root_service)
9786{
9787set_retry_times(INT64_MAX); // retry until success
9788}
9789
9790int ObRootService::ObUpdateAllServerConfigTask::process()
9791{
9792int ret = OB_SUCCESS;
9793if (OB_FAIL(root_service_.update_all_server_config())) {
9794LOG_WARN("fail to update all server config", K(ret));
9795} else {
9796LOG_INFO("update all server config success");
9797}
9798return ret;
9799}
9800
9801ObAsyncTask *ObRootService::ObUpdateAllServerConfigTask::deep_copy(char *buf, const int64_t buf_size) const
9802{
9803ObUpdateAllServerConfigTask *task = NULL;
9804if (NULL == buf || buf_size < static_cast<int64_t>(sizeof(*this))) {
9805LOG_WARN_RET(OB_BUF_NOT_ENOUGH, "buffer not large enough", K(buf_size), KP(buf));
9806} else {
9807task = new (buf) ObUpdateAllServerConfigTask(root_service_);
9808}
9809return task;
9810}
9811
9812/////////////////////////
9813int ObRootService::admin_clear_balance_task(const obrpc::ObAdminClearBalanceTaskArg &args)
9814{
9815// TODO: @wanhong.wwh NEED SUPPORT
9816UNUSEDx(args);
9817return 0;
9818}
9819
9820status::ObRootServiceStatus ObRootService::get_status() const
9821{
9822return rs_status_.get_rs_status();
9823}
9824
9825int ObRootService::table_allow_ddl_operation(const obrpc::ObAlterTableArg &arg)
9826{
9827int ret = OB_SUCCESS;
9828const ObTableSchema *schema = NULL;
9829ObSchemaGetterGuard schema_guard;
9830const AlterTableSchema &alter_table_schema = arg.alter_table_schema_;
9831const uint64_t tenant_id = alter_table_schema.get_tenant_id();
9832const ObString &origin_database_name = alter_table_schema.get_origin_database_name();
9833const ObString &origin_table_name = alter_table_schema.get_origin_table_name();
9834schema_guard.set_session_id(arg.session_id_);
9835if (arg.is_refresh_sess_active_time()) {
9836//do nothing
9837} else if (!arg.is_valid()) {
9838ret = OB_INVALID_ARGUMENT;
9839LOG_WARN("invali argument", K(ret), K(arg));
9840} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
9841LOG_WARN("get schema guard in inner table failed", K(ret));
9842} else if (OB_FAIL(schema_guard.get_table_schema(tenant_id, origin_database_name,
9843origin_table_name, false, schema))) {
9844LOG_WARN("fail to get table schema", K(ret), K(tenant_id), K(origin_database_name), K(origin_table_name));
9845} else if (OB_ISNULL(schema)) {
9846ret = OB_TABLE_NOT_EXIST;
9847LOG_WARN("invalid schema", K(ret));
9848LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(origin_database_name), to_cstring(origin_table_name));
9849} else if (schema->is_in_splitting()) {
9850//TODO ddl must not execute on splitting table due to split not unstable
9851ret = OB_OP_NOT_ALLOW;
9852LOG_WARN("table is physical or logical split can not split", K(ret), K(schema));
9853LOG_USER_ERROR(OB_OP_NOT_ALLOW, "table is in physial or logical split, ddl operation");
9854} else if (schema->is_ctas_tmp_table()) {
9855if (!alter_table_schema.alter_option_bitset_.has_member(ObAlterTableArg::SESSION_ID)) {
9856//to prevet alter table after failed to create table, the table is invisible.
9857ret = OB_OP_NOT_ALLOW;
9858LOG_WARN("try to alter invisible table schema", K(schema->get_session_id()), K(arg));
9859LOG_USER_ERROR(OB_OP_NOT_ALLOW, "try to alter invisible table");
9860}
9861} else if (schema->has_mlog_table() || schema->is_mlog_table()) {
9862if (OB_FAIL(ObResolverUtils::check_allowed_alter_operations_for_mlog(
9863tenant_id, arg, *schema))) {
9864LOG_WARN("failed to check allowed alter operation for mlog",
9865KR(ret), K(tenant_id), K(arg));
9866}
9867}
9868return ret;
9869}
9870
9871// ask each server to update statistic
9872int ObRootService::update_stat_cache(const obrpc::ObUpdateStatCacheArg &arg)
9873{
9874int ret = OB_SUCCESS;
9875ObZone null_zone;
9876ObSEArray<ObAddr, 8> server_list;
9877bool evict_plan_failed = false;
9878if (!inited_) {
9879ret = OB_NOT_INIT;
9880LOG_WARN("not init", K(ret));
9881} else if (OB_FAIL(SVR_TRACER.get_alive_servers(null_zone, server_list))) {
9882LOG_WARN("fail to get alive server", K(ret));
9883} else {
9884for (int64_t i = 0; OB_SUCC(ret) && i < server_list.count(); i++) {
9885if (OB_FAIL(rpc_proxy_.to(server_list.at(i)).update_local_stat_cache(arg))) {
9886LOG_WARN("fail to update table statistic", K(ret), K(server_list.at(i)));
9887// OB_SQL_PC_NOT_EXIST represent evict plan failed
9888if (OB_SQL_PC_NOT_EXIST == ret) {
9889ret = OB_SUCCESS;
9890evict_plan_failed = true;
9891}
9892} else { /*do nothing*/}
9893}
9894}
9895if (OB_SUCC(ret) && evict_plan_failed) {
9896ret = OB_SQL_PC_NOT_EXIST;
9897}
9898return ret;
9899}
9900
9901int ObRootService::check_weak_read_version_refresh_interval(int64_t refresh_interval, bool &valid)
9902{
9903int ret = OB_SUCCESS;
9904ObSchemaGetterGuard sys_schema_guard;
9905ObArray<uint64_t> tenant_ids;
9906valid = true;
9907
9908if (OB_ISNULL(GCTX.schema_service_)) {
9909ret = OB_ERR_UNEXPECTED;
9910LOG_WARN("schema service is null", KR(ret));
9911} else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, sys_schema_guard))) {
9912LOG_WARN("get sys schema guard failed", KR(ret));
9913} else if (OB_FAIL(sys_schema_guard.get_tenant_ids(tenant_ids))) {
9914LOG_WARN("get tenant ids failed", KR(ret));
9915} else {
9916ObSchemaGetterGuard schema_guard;
9917const ObSimpleTenantSchema *tenant_schema = NULL;
9918const ObSysVarSchema *var_schema = NULL;
9919ObObj obj;
9920int64_t session_max_stale_time = 0;
9921uint64_t tenant_id = OB_INVALID_TENANT_ID;
9922for (int64_t i = 0; OB_SUCC(ret) && valid && i < tenant_ids.count(); i++) {
9923tenant_id = tenant_ids[i];
9924if (OB_FAIL(sys_schema_guard.get_tenant_info(tenant_id, tenant_schema))) {
9925LOG_WARN("fail to get tenant schema", KR(ret), K(tenant_id));
9926} else if (OB_ISNULL(tenant_schema)) {
9927ret = OB_SUCCESS;
9928LOG_WARN("tenant schema is null, skip and continue", KR(ret), K(tenant_id));
9929} else if (!tenant_schema->is_normal()) {
9930ret = OB_SUCCESS;
9931LOG_WARN("tenant schema is not normal, skip and continue", KR(ret), K(tenant_id));
9932} else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) {
9933LOG_WARN("get schema guard failed", KR(ret), K(tenant_id));
9934} else if (OB_FAIL(schema_guard.get_tenant_system_variable(tenant_id,
9935OB_SV_MAX_READ_STALE_TIME, var_schema))) {
9936LOG_WARN("get tenant system variable failed", KR(ret), K(tenant_id));
9937} else if (OB_ISNULL(var_schema)) {
9938ret = OB_ERR_UNEXPECTED;
9939LOG_WARN("var schema is null", KR(ret), K(tenant_id));
9940} else if (OB_FAIL(var_schema->get_value(NULL, NULL, obj))) {
9941LOG_WARN("get value failed", KR(ret), K(tenant_id), K(obj));
9942} else if (OB_FAIL(obj.get_int(session_max_stale_time))) {
9943LOG_WARN("get int failed", KR(ret), K(tenant_id), K(obj));
9944} else if (session_max_stale_time != share::ObSysVarFactory::INVALID_MAX_READ_STALE_TIME
9945&& refresh_interval > session_max_stale_time) {
9946valid = false;
9947LOG_USER_ERROR(OB_INVALID_ARGUMENT,
9948"weak_read_version_refresh_interval is larger than ob_max_read_stale_time");
9949}
9950}
9951}
9952return ret;
9953}
9954
9955int ObRootService::set_config_pre_hook(obrpc::ObAdminSetConfigArg &arg)
9956{
9957int ret = OB_SUCCESS;
9958if (!arg.is_valid()) {
9959ret = OB_INVALID_ARGUMENT;
9960LOG_WARN("invalid argument", K(ret), K(arg));
9961}
9962FOREACH_X(item, arg.items_, OB_SUCCESS == ret) {
9963bool valid = true;
9964if (item->name_.is_empty()) {
9965ret = OB_INVALID_ARGUMENT;
9966LOG_WARN("empty config name", "item", *item, K(ret));
9967} else if (0 == STRCMP(item->name_.ptr(), _TX_SHARE_MEMORY_LIMIT_PERCENTAGE)) {
9968ret = check_tx_share_memory_limit_(*item);
9969} else if (0 == STRCMP(item->name_.ptr(), MEMSTORE_LIMIT_PERCENTAGE)) {
9970ret = check_memstore_limit_(*item);
9971} else if (0 == STRCMP(item->name_.ptr(), TENANT_MEMSTORE_LIMIT_PERCENTAGE)) {
9972ret = check_tenant_memstore_limit_(*item);
9973} else if (0 == STRCMP(item->name_.ptr(), _TX_DATA_MEMORY_LIMIT_PERCENTAGE)) {
9974ret = check_tx_data_memory_limit_(*item);
9975} else if (0 == STRCMP(item->name_.ptr(), _MDS_MEMORY_LIMIT_PERCENTAGE)) {
9976ret = check_mds_memory_limit_(*item);
9977} else if (0 == STRCMP(item->name_.ptr(), FREEZE_TRIGGER_PERCENTAGE)) {
9978ret = check_freeze_trigger_percentage_(*item);
9979} else if (0 == STRCMP(item->name_.ptr(), WRITING_THROTTLEIUNG_TRIGGER_PERCENTAGE)) {
9980ret = check_write_throttle_trigger_percentage(*item);
9981} else if (0 == STRCMP(item->name_.ptr(), WEAK_READ_VERSION_REFRESH_INTERVAL)) {
9982int64_t refresh_interval = ObConfigTimeParser::get(item->value_.ptr(), valid);
9983if (valid && OB_FAIL(check_weak_read_version_refresh_interval(refresh_interval, valid))) {
9984LOG_WARN("check refresh interval failed ", KR(ret), K(*item));
9985} else if (!valid) {
9986ret = OB_INVALID_ARGUMENT;
9987LOG_WARN("config invalid", KR(ret), K(*item));
9988}
9989} else if (0 == STRCMP(item->name_.ptr(), PARTITION_BALANCE_SCHEDULE_INTERVAL)) {
9990const int64_t DEFAULT_BALANCER_IDLE_TIME = 10 * 1000 * 1000L; // 10s
9991for (int i = 0; i < item->tenant_ids_.count() && valid; i++) {
9992const uint64_t tenant_id = item->tenant_ids_.at(i);
9993omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
9994int64_t balancer_idle_time = tenant_config.is_valid() ? tenant_config->balancer_idle_time : DEFAULT_BALANCER_IDLE_TIME;
9995int64_t interval = ObConfigTimeParser::get(item->value_.ptr(), valid);
9996if (valid) {
9997if (0 == interval) {
9998valid = true;
9999} else if (interval >= balancer_idle_time) {
10000valid = true;
10001} else {
10002valid = false;
10003char err_msg[DEFAULT_BUF_LENGTH];
10004(void)snprintf(err_msg, sizeof(err_msg), "partition_balance_schedule_interval of tenant %ld, "
10005"it should not be less than balancer_idle_time", tenant_id);
10006LOG_USER_ERROR(OB_INVALID_ARGUMENT, err_msg);
10007}
10008}
10009if (!valid) {
10010ret = OB_INVALID_ARGUMENT;
10011LOG_WARN("config invalid", KR(ret), K(*item), K(balancer_idle_time), K(tenant_id));
10012}
10013}
10014} else if (0 == STRCMP(item->name_.ptr(), BALANCER_IDLE_TIME)) {
10015const int64_t DEFAULT_PARTITION_BALANCE_SCHEDULE_INTERVAL = 2 * 3600 * 1000 * 1000L; // 2h
10016for (int i = 0; i < item->tenant_ids_.count() && valid; i++) {
10017const uint64_t tenant_id = item->tenant_ids_.at(i);
10018omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
10019int64_t interval = tenant_config.is_valid()
10020? tenant_config->partition_balance_schedule_interval
10021: DEFAULT_PARTITION_BALANCE_SCHEDULE_INTERVAL;
10022int64_t idle_time = ObConfigTimeParser::get(item->value_.ptr(), valid);
10023if (valid && (idle_time > interval)) {
10024valid = false;
10025char err_msg[DEFAULT_BUF_LENGTH];
10026(void)snprintf(err_msg, sizeof(err_msg), "balancer_idle_time of tenant %ld, "
10027"it should not be longer than partition_balance_schedule_interval", tenant_id);
10028LOG_USER_ERROR(OB_INVALID_ARGUMENT, err_msg);
10029}
10030if (!valid) {
10031ret = OB_INVALID_ARGUMENT;
10032LOG_WARN("config invalid", KR(ret), K(*item), K(interval), K(tenant_id));
10033}
10034}
10035} else if (0 == STRCMP(item->name_.ptr(), LOG_DISK_UTILIZATION_LIMIT_THRESHOLD)) {
10036// check log_disk_utilization_limit_threshold
10037for (int i = 0; i < item->tenant_ids_.count() && valid; i++) {
10038valid = valid && ObConfigLogDiskLimitThresholdIntChecker::check(item->tenant_ids_.at(i), *item);
10039if (!valid) {
10040ret = OB_INVALID_ARGUMENT;
10041LOG_USER_ERROR(OB_INVALID_ARGUMENT, "log_disk_utilization_limit_threshold should be greater than log_disk_throttling_percentage "
10042"when log_disk_throttling_percentage is not equal to 100");
10043LOG_WARN("config invalid", "item", *item, K(ret), K(i), K(item->tenant_ids_.at(i)));
10044}
10045}
10046} else if (0 == STRCMP(item->name_.ptr(), LOG_DISK_THROTTLING_PERCENTAGE)) {
10047// check log_disk_throttling_percentage
10048for (int i = 0; i < item->tenant_ids_.count() && valid; i++) {
10049valid = valid && ObConfigLogDiskThrottlingPercentageIntChecker::check(item->tenant_ids_.at(i), *item);
10050if (!valid) {
10051ret = OB_INVALID_ARGUMENT;
10052LOG_USER_ERROR(OB_INVALID_ARGUMENT, "log_disk_throttling_percentage should be equal to 100 or smaller than log_disk_utilization_limit_threshold");
10053LOG_WARN("config invalid", "item", *item, K(ret), K(i), K(item->tenant_ids_.at(i)));
10054}
10055}
10056}
10057}
10058return ret;
10059}
10060
10061#define CHECK_TENANTS_CONFIG_WITH_FUNC(FUNCTOR, LOG_INFO) \
10062do { \
10063bool valid = true; \
10064for (int i = 0; i < item.tenant_ids_.count() && valid; i++) { \
10065valid = valid && FUNCTOR::check(item.tenant_ids_.at(i), item); \
10066if (!valid) { \
10067ret = OB_INVALID_ARGUMENT; \
10068LOG_USER_ERROR(OB_INVALID_ARGUMENT, LOG_INFO); \
10069LOG_WARN("config invalid", "item", item, K(ret), K(i), K(item.tenant_ids_.at(i))); \
10070} \
10071} \
10072} while (0)
10073
10074#define CHECK_CLUSTER_CONFIG_WITH_FUNC(FUNCTOR, LOG_INFO) \
10075do { \
10076bool valid = true; \
10077for (int i = 0; i < tenant_ids.count() && valid; i++) { \
10078valid = valid && FUNCTOR::check(tenant_ids.at(i), item); \
10079if (!valid) { \
10080ret = OB_INVALID_ARGUMENT; \
10081LOG_USER_ERROR(OB_INVALID_ARGUMENT, LOG_INFO); \
10082LOG_WARN("config invalid", "item", item, K(ret), K(i), K(tenant_ids.at(i))); \
10083} \
10084} \
10085} while (0)
10086
10087int ObRootService::check_tx_share_memory_limit_(obrpc::ObAdminSetConfigItem &item)
10088{
10089int ret = OB_SUCCESS;
10090// There is a prefix "Incorrect arguments to " before user log so the warn log looked kinds of wired
10091const char *warn_log = "tenant config _tx_share_memory_limit_percentage. "
10092"It should larger than or equal with any single module in it(Memstore, TxData, Mds)";
10093CHECK_TENANTS_CONFIG_WITH_FUNC(ObConfigTxShareMemoryLimitChecker, warn_log);
10094return ret;
10095}
10096
10097int ObRootService::check_memstore_limit_(obrpc::ObAdminSetConfigItem &item)
10098{
10099int ret = OB_SUCCESS;
10100const char *warn_log = "cluster config memstore_limit_percentage. "
10101"It should less than or equal with all tenant's _tx_share_memory_limit_percentage";
10102ObArray<uint64_t> tenant_ids;
10103ObSchemaGetterGuard schema_guard;
10104if (OB_UNLIKELY(!inited_)) {
10105ret = OB_NOT_INIT;
10106LOG_WARN("not inited", KR(ret));
10107} else if (OB_ISNULL(schema_service_)) {
10108ret = OB_ERR_UNEXPECTED;
10109LOG_WARN("schema service is null", KR(ret));
10110} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) {
10111LOG_WARN("get schema guard failed", KR(ret));
10112} else if (OB_FAIL(schema_guard.get_tenant_ids(tenant_ids))) {
10113LOG_WARN("failed to get all tenant ids", KR(ret), K(tenant_ids));
10114} else {
10115CHECK_CLUSTER_CONFIG_WITH_FUNC(ObConfigMemstoreLimitChecker, warn_log);
10116}
10117return ret;
10118}
10119
10120int ObRootService::check_tenant_memstore_limit_(obrpc::ObAdminSetConfigItem &item)
10121{
10122int ret = OB_SUCCESS;
10123const char *warn_log = "tenant config _memstore_limit_percentage. "
10124"It should less than or equal with _tx_share_memory_limit_percentage";
10125CHECK_TENANTS_CONFIG_WITH_FUNC(ObConfigMemstoreLimitChecker, warn_log);
10126return ret;
10127}
10128
10129int ObRootService::check_tx_data_memory_limit_(obrpc::ObAdminSetConfigItem &item)
10130{
10131int ret = OB_SUCCESS;
10132const char *warn_log = "tenant config _tx_data_memory_limit_percentage. "
10133"It should less than or equal with _tx_share_memory_limit_percentage";
10134CHECK_TENANTS_CONFIG_WITH_FUNC(ObConfigTxDataLimitChecker, warn_log);
10135return ret;
10136}
10137
10138int ObRootService::check_mds_memory_limit_(obrpc::ObAdminSetConfigItem &item)
10139{
10140int ret = OB_SUCCESS;
10141const char *warn_log = "tenant config _mds_memory_limit_percentage. "
10142"It should less than or equal with _tx_share_memory_limit_percentage";
10143CHECK_TENANTS_CONFIG_WITH_FUNC(ObConfigMdsLimitChecker, warn_log);
10144return ret;
10145}
10146
10147int ObRootService::check_freeze_trigger_percentage_(obrpc::ObAdminSetConfigItem &item)
10148{
10149int ret = OB_SUCCESS;
10150const char *warn_log = "tenant freeze_trigger_percentage "
10151"which should smaller than writing_throttling_trigger_percentage";
10152CHECK_TENANTS_CONFIG_WITH_FUNC(ObConfigFreezeTriggerIntChecker, warn_log);
10153return ret;
10154}
10155
10156int ObRootService::check_write_throttle_trigger_percentage(obrpc::ObAdminSetConfigItem &item)
10157{
10158int ret = OB_SUCCESS;
10159const char *warn_log = "tenant writing_throttling_trigger_percentage "
10160"which should greater than freeze_trigger_percentage";
10161CHECK_TENANTS_CONFIG_WITH_FUNC(ObConfigWriteThrottleTriggerIntChecker, warn_log);
10162return ret;
10163}
10164
10165#undef CHECK_TENANTS_CONFIG_WITH_FUNC
10166#undef CHECK_CLUSTER_CONFIG_WITH_FUNC
10167
10168int ObRootService::set_config_post_hook(const obrpc::ObAdminSetConfigArg &arg)
10169{
10170int ret = OB_SUCCESS;
10171if (!arg.is_valid()) {
10172ret = OB_INVALID_ARGUMENT;
10173LOG_WARN("invalid argument", K(ret), K(arg));
10174}
10175FOREACH_X(item, arg.items_, OB_SUCCESS == ret) {
10176if (item->name_.is_empty()) {
10177ret = OB_INVALID_ARGUMENT;
10178LOG_WARN("empty config name", "item", *item, K(ret));
10179} else if (0 == STRCMP(item->name_.ptr(), ENABLE_REBALANCE)
10180|| 0 == STRCMP(item->name_.ptr(), ENABLE_REREPLICATION)) {
10181// TODO: @wanhong.wwh SUPPORT clear DR task after disable rebalance and rereplication
10182} else if (0 == STRCMP(item->name_.ptr(), MERGER_CHECK_INTERVAL)) {
10183//daily_merge_scheduler_.wakeup();
10184} else if (0 == STRCMP(item->name_.ptr(), ENABLE_AUTO_LEADER_SWITCH)) {
10185//wake_up leader_cooridnator
10186} else if (0 == STRCMP(item->name_.ptr(), OBCONFIG_URL)) {
10187int tmp_ret = OB_SUCCESS;
10188bool force_update = true;
10189if (OB_SUCCESS != (tmp_ret = submit_update_rslist_task(force_update))) {
10190LOG_WARN("fail to submit update rs list task", KR(ret), K(tmp_ret));
10191}
10192LOG_INFO("obconfig_url parameters updated, force submit update rslist task", KR(tmp_ret),
10193KPC(item));
10194} else if (0 == STRCMP(item->name_.ptr(), SCHEMA_HISTORY_RECYCLE_INTERVAL)) {
10195schema_history_recycler_.wakeup();
10196LOG_INFO("schema_history_recycle_interval parameters updated, wakeup schema_history_recycler",
10197KPC(item));
10198}
10199}
10200return ret;
10201}
10202
10203//ensure execute on DDL thread
10204int ObRootService::force_create_sys_table(const obrpc::ObForceCreateSysTableArg &arg)
10205{
10206return OB_NOT_SUPPORTED;
10207}
10208
10209// set tenant's locality
10210// TODO
10211// 1. set all locality of normal tenant to DEFAULT first.
10212// 2. verify that replica distribution satifies the new locality
10213int ObRootService::force_set_locality(const obrpc::ObForceSetLocalityArg &arg)
10214{
10215LOG_INFO("receive force set locality arg", K(arg));
10216int ret = OB_SUCCESS;
10217ObSchemaGetterGuard schema_guard;
10218const ObTenantSchema *tenant_schema = NULL;
10219const uint64_t tenant_id = arg.exec_tenant_id_;
10220if (!inited_) {
10221LOG_WARN("not init", KR(ret));
10222} else if (!arg.is_valid()
10223|| is_meta_tenant(tenant_id)) {
10224ret = OB_INVALID_ARGUMENT;
10225LOG_WARN("invalid arg", KR(ret), K(arg));
10226} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(OB_SYS_TENANT_ID, schema_guard))) {
10227LOG_WARN("fail to get schema guard with version in inner table", KR(ret));
10228} else if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) {
10229LOG_WARN("fail to get tenant schema", KR(ret), K(tenant_id));
10230} else if (OB_ISNULL(tenant_schema)) {
10231ret = OB_TENANT_NOT_EXIST;
10232LOG_WARN("tenant not exist", KR(ret));
10233} else {
10234ObTenantSchema new_tenant;
10235if (OB_FAIL(new_tenant.assign(*tenant_schema))) {
10236LOG_WARN("fail to assgin tenant schema", KR(ret), KPC(tenant_schema));
10237} else if (OB_FAIL(new_tenant.set_locality(arg.locality_))) {
10238LOG_WARN("fail to set locality", KR(ret), K(arg));
10239} else if (OB_FAIL(new_tenant.set_previous_locality(ObString("")))) {
10240LOG_WARN("fail to reset previous locality", KR(ret), K(arg));
10241} else if (OB_FAIL(ddl_service_.force_set_locality(schema_guard, new_tenant))) {
10242LOG_WARN("fail to force set locality", K(ret), K(new_tenant));
10243}
10244}
10245LOG_INFO("force set locality", K(arg));
10246return ret;
10247}
10248
10249int ObRootService::clear_special_cluster_schema_status()
10250{
10251int ret = OB_SUCCESS;
10252if (OB_UNLIKELY(!inited_)) {
10253ret = OB_NOT_INIT;
10254LOG_WARN("not init", KR(ret));
10255} else if (OB_ISNULL(schema_service_)) {
10256ret = OB_ERR_UNEXPECTED;
10257LOG_WARN("schema service is null", KR(ret));
10258} else {
10259ObSchemaService *schema_service = schema_service_->get_schema_service();
10260if (OB_ISNULL(schema_service)) {
10261ret = OB_ERR_UNEXPECTED;
10262LOG_WARN("schema service is null", K(ret));
10263} else {
10264schema_service->set_cluster_schema_status(
10265ObClusterSchemaStatus::NORMAL_STATUS);
10266}
10267}
10268return ret;
10269}
10270
10271int ObRootService::get_is_in_bootstrap(bool &is_bootstrap) const
10272{
10273int ret = OB_SUCCESS;
10274is_bootstrap = false;
10275if (OB_UNLIKELY(!inited_)) {
10276ret = OB_NOT_INIT;
10277LOG_WARN("not init", KR(ret));
10278} else if (OB_ISNULL(schema_service_)) {
10279ret = OB_ERR_UNEXPECTED;
10280LOG_WARN("schema service is null", KR(ret));
10281} else {
10282ObSchemaService *schema_service = schema_service_->get_schema_service();
10283if (OB_ISNULL(schema_service_)) {
10284ret = OB_ERR_UNEXPECTED;
10285LOG_WARN("schema service is null", KR(ret));
10286} else if (ObClusterSchemaStatus::BOOTSTRAP_STATUS
10287== schema_service->get_cluster_schema_status()) {
10288is_bootstrap = true;
10289}
10290}
10291return ret;
10292}
10293
10294int ObRootService::log_nop_operation(const obrpc::ObDDLNopOpreatorArg &arg)
10295{
10296int ret = OB_SUCCESS;
10297LOG_INFO("start to log nop operation", K(arg));
10298if (!inited_) {
10299ret = OB_NOT_INIT;
10300LOG_WARN("not init", K(ret));
10301} else if (OB_FAIL(ddl_service_.log_nop_operation(arg))) {
10302LOG_WARN("failed to log nop operation", K(ret), K(arg));
10303}
10304return ret;
10305}
10306
10307// if tenant_id = OB_INVALID_TENANT_ID, indicates refresh all tenants's schema;
10308// otherwise, refresh specify tenant's schema. ensure schema_version not fallback by outer layer logic.
10309int ObRootService::broadcast_schema(const obrpc::ObBroadcastSchemaArg &arg)
10310{
10311int ret = OB_SUCCESS;
10312LOG_INFO("receieve broadcast_schema request", K(arg));
10313if (!inited_) {
10314ret = OB_NOT_INIT;
10315LOG_WARN("not init", K(ret));
10316} else if (OB_ISNULL(schema_service_)
10317|| OB_ISNULL(schema_service_->get_schema_service())) {
10318ret = OB_ERR_UNEXPECTED;
10319LOG_WARN("schema_service is null", K(ret), KP_(schema_service));
10320} else {
10321ObRefreshSchemaInfo schema_info;
10322ObSchemaService *schema_service = schema_service_->get_schema_service();
10323if (OB_INVALID_TENANT_ID != arg.tenant_id_) {
10324// tenant_id is valid, just refresh specify tenant's schema.
10325schema_info.set_tenant_id(arg.tenant_id_);
10326schema_info.set_schema_version(arg.schema_version_);
10327} else {
10328// tenant_id = OB_INVALID_TENANT_ID, indicates refresh all tenants's schema;
10329if (OB_FAIL(schema_service->inc_sequence_id())) {
10330LOG_WARN("increase sequence_id failed", K(ret));
10331}
10332}
10333if (OB_FAIL(ret)) {
10334} else if (OB_FAIL(schema_service->inc_sequence_id())) {
10335LOG_WARN("increase sequence_id failed", K(ret));
10336} else if (OB_FAIL(schema_service->set_refresh_schema_info(schema_info))) {
10337LOG_WARN("fail to set refresh schema info", K(ret), K(schema_info));
10338}
10339}
10340LOG_INFO("end broadcast_schema request", K(ret), K(arg));
10341return ret;
10342}
10343
10344/*
10345* standby_cluster, will return local tenant's schema_version
10346* primary_cluster, will return tenant's newest schema_version
10347* - schema_version = OB_CORE_SCHEMA_VERSION, indicate the tenant is garbage.
10348* - schema_version = OB_INVALID_VERSION, indicate that it is failed to get schame_version.
10349* - schema_version > OB_CORE_SCHEMA_VERSION, indicate that the schema_version is valid.
10350*/
10351int ObRootService::get_tenant_schema_versions(
10352const obrpc::ObGetSchemaArg &arg,
10353obrpc::ObTenantSchemaVersions &tenant_schema_versions)
10354{
10355int ret = OB_SUCCESS;
10356tenant_schema_versions.reset();
10357ObSchemaGetterGuard schema_guard;
10358ObArray<uint64_t> tenant_ids;
10359if (!inited_) {
10360ret = OB_NOT_INIT;
10361LOG_WARN("not init", KR(ret));
10362} else if (OB_ISNULL(schema_service_)) {
10363ret = OB_ERR_UNEXPECTED;
10364LOG_WARN("schema_service is null", K(ret));
10365} else if (OB_FAIL(ddl_service_.get_tenant_schema_guard_with_version_in_inner_table(
10366OB_SYS_TENANT_ID, schema_guard))) {
10367LOG_WARN("fail to get schema guard", KR(ret));
10368} else if (OB_FAIL(schema_guard.get_tenant_ids(tenant_ids))) {
10369LOG_WARN("fail to get tenant ids", KR(ret));
10370} else {
10371int64_t tenant_id = OB_INVALID_TENANT_ID;
10372int64_t schema_version = 0;
10373for (int64_t i = 0; i < tenant_ids.count() && OB_SUCC(ret); i++) {
10374ObSchemaGetterGuard tenant_schema_guard;
10375tenant_id = tenant_ids.at(i);
10376schema_version = 0;
10377if (OB_SYS_TENANT_ID == tenant_id
10378|| STANDBY_CLUSTER == ObClusterInfoGetter::get_cluster_role_v2()) {
10379// 对于备库,由于schema_status不在DDL线程推进,且能接受最终一致,
10380// 故只需取本地schema版本即可
10381if (OB_FAIL(schema_service_->get_tenant_refreshed_schema_version(
10382tenant_id, schema_version))) {
10383LOG_WARN("fail to get tenant refreshed schema version", K(ret), K(tenant_id));
10384}
10385} else {
10386// for primary cluster, need to get newest schema_version from inner table.
10387ObRefreshSchemaStatus schema_status;
10388schema_status.tenant_id_ = tenant_id;
10389int64_t version_in_inner_table = OB_INVALID_VERSION;
10390bool is_restore = false;
10391if (OB_FAIL(schema_service_->check_tenant_is_restore(&schema_guard, tenant_id, is_restore))) {
10392LOG_WARN("fail to check tenant is restore", KR(ret), K(tenant_id));
10393} else if (is_restore) {
10394ObSchemaStatusProxy *schema_status_proxy = GCTX.schema_status_proxy_;
10395if (OB_ISNULL(schema_status_proxy)) {
10396ret = OB_ERR_UNEXPECTED;
10397LOG_WARN("schema_status_proxy is null", KR(ret));
10398} else if (OB_FAIL(schema_status_proxy->get_refresh_schema_status(tenant_id, schema_status))) {
10399LOG_WARN("failed to get tenant refresh schema status", KR(ret), K(tenant_id));
10400} else if (OB_INVALID_VERSION != schema_status.readable_schema_version_) {
10401ret = OB_EAGAIN;
10402LOG_WARN("tenant's sys replicas are not restored yet, try later", KR(ret), K(tenant_id));
10403}
10404}
10405if (FAILEDx(schema_service_->get_schema_version_in_inner_table(
10406sql_proxy_, schema_status, version_in_inner_table))) {
10407// failed tenant creation, inner table is empty, return OB_CORE_SCHEMA_VERSION
10408if (OB_EMPTY_RESULT == ret) {
10409LOG_INFO("create tenant maybe failed", K(ret), K(tenant_id));
10410schema_version = OB_CORE_SCHEMA_VERSION;
10411ret = OB_SUCCESS;
10412} else {
10413LOG_WARN("fail to get latest schema version in inner table", K(ret));
10414}
10415} else if (OB_FAIL(schema_service_->get_tenant_refreshed_schema_version(
10416tenant_id, schema_version))) {
10417LOG_WARN("fail to get tenant refreshed schema version", K(ret), K(tenant_id));
10418} else if (schema_version < version_in_inner_table) {
10419ObArray<uint64_t> tenant_ids;
10420if (OB_FAIL(tenant_ids.push_back(tenant_id))) {
10421LOG_WARN("fail to push back tenant_id", K(ret), K(tenant_id));
10422} else if (OB_FAIL(schema_service_->refresh_and_add_schema(tenant_ids))) {
10423LOG_WARN("fail to refresh schema", K(ret), K(tenant_id));
10424} else if (OB_FAIL(schema_service_->get_tenant_refreshed_schema_version(
10425tenant_id, schema_version))) {
10426LOG_WARN("fail to get tenant refreshed schema version", K(ret), K(tenant_id));
10427} else if (schema_version < version_in_inner_table) {
10428ret = OB_ERR_UNEXPECTED;
10429LOG_WARN("local version is still less than version in table",
10430K(ret), K(tenant_id), K(schema_version), K(version_in_inner_table));
10431} else {}
10432} else {}
10433}
10434if (OB_FAIL(ret)) {
10435} else if (OB_FAIL(tenant_schema_versions.add(tenant_id, schema_version))) {
10436LOG_WARN("fail to add tenant schema version", KR(ret), K(tenant_id), K(schema_version));
10437}
10438if (OB_FAIL(ret) && arg.ignore_fail_ && OB_SYS_TENANT_ID != tenant_id) {
10439int64_t invalid_schema_version = OB_INVALID_SCHEMA_VERSION;
10440if (OB_FAIL(tenant_schema_versions.add(tenant_id, invalid_schema_version))) {
10441LOG_WARN("fail to add tenant schema version", KR(ret), K(tenant_id), K(schema_version));
10442}
10443}
10444} // end for
10445}
10446return ret;
10447}
10448
10449int ObRootService::generate_user(const ObClusterRole &cluster_role,
10450const char* user_name,
10451const char* user_passwd)
10452{
10453int ret = OB_SUCCESS;
10454ObSqlString ddl_stmt_str;
10455int64_t affected_row = 0;
10456ObString passwd(user_passwd);
10457ObString encry_passwd;
10458char enc_buf[ENC_BUF_LEN] = {0};
10459if (OB_ISNULL(user_name) || OB_ISNULL(user_passwd)) {
10460ret = OB_INVALID_ARGUMENT;
10461LOG_WARN("invalid argument", KR(ret), K(user_name), K(user_passwd));
10462} else if (PRIMARY_CLUSTER != cluster_role) {
10463LOG_INFO("standby cluster, no need to create user", K(cluster_role));
10464} else if (OB_FAIL(sql::ObCreateUserExecutor::encrypt_passwd(passwd, encry_passwd, enc_buf, ENC_BUF_LEN))) {
10465LOG_WARN("Encrypt passwd failed", K(ret));
10466} else if (OB_FAIL(ObDDLSqlGenerator::gen_create_user_sql(ObAccountArg(user_name, OB_SYS_HOST_NAME),
10467encry_passwd, ddl_stmt_str))) {
10468LOG_WARN("fail to gen create user sql", KR(ret));
10469} else if (OB_FAIL(sql_proxy_.write(ddl_stmt_str.ptr(), affected_row))) {
10470LOG_WARN("execute sql failed", K(ret), K(ddl_stmt_str));
10471} else {
10472LOG_INFO("create user success", K(user_name), K(affected_row));
10473}
10474ddl_stmt_str.reset();
10475if (OB_FAIL(ret) || PRIMARY_CLUSTER != cluster_role) {
10476//nothing todo
10477} else if (OB_FAIL(ddl_stmt_str.assign_fmt("grant select on *.* to '%s'",
10478user_name))) {
10479LOG_WARN("fail to assign fmt", KR(ret));
10480} else if (OB_FAIL(sql_proxy_.write(ddl_stmt_str.ptr(), affected_row))) {
10481LOG_WARN("fail to write", KR(ret), K(ddl_stmt_str));
10482} else {
10483LOG_INFO("grant privilege success", K(ddl_stmt_str));
10484}
10485return ret;
10486}
10487
10488int ObRootService::get_recycle_schema_versions(
10489const obrpc::ObGetRecycleSchemaVersionsArg &arg,
10490obrpc::ObGetRecycleSchemaVersionsResult &result)
10491{
10492int ret = OB_SUCCESS;
10493LOG_INFO("receive get recycle schema versions request", K(arg));
10494bool is_standby = GCTX.is_standby_cluster();
10495bool in_service = is_full_service();
10496if (OB_UNLIKELY(!inited_)) {
10497ret = OB_NOT_INIT;
10498LOG_WARN("not init", K(ret));
10499} else if (!arg.is_valid()) {
10500ret = OB_INVALID_ARGUMENT;
10501LOG_WARN("arg is invalid", K(ret), K(arg));
10502} else if (!is_standby || !in_service) {
10503ret = OB_STATE_NOT_MATCH;
10504LOG_WARN("should be standby cluster and rs in service",
10505KR(ret), K(is_standby), K(in_service));
10506} else if (OB_FAIL(schema_history_recycler_.get_recycle_schema_versions(arg, result))) {
10507LOG_WARN("fail to get recycle schema versions", KR(ret), K(arg));
10508}
10509LOG_INFO("get recycle schema versions", KR(ret), K(arg), K(result));
10510return ret;
10511}
10512int ObRootService::do_profile_ddl(const obrpc::ObProfileDDLArg &arg)
10513{
10514int ret = OB_SUCCESS;
10515if (!inited_) {
10516ret = OB_NOT_INIT;
10517LOG_WARN("not init", K(ret));
10518} else if (OB_FAIL(ddl_service_.handle_profile_ddl(arg))) {
10519LOG_WARN("handle ddl failed", K(arg), K(ret));
10520}
10521return ret;
10522}
10523
10524int ObRootService::rebuild_index_in_restore(
10525const obrpc::ObRebuildIndexInRestoreArg &arg)
10526{
10527int ret = OB_NOT_SUPPORTED;
10528UNUSED(arg);
10529return ret;
10530}
10531
10532int ObRootService::handle_archive_log(const obrpc::ObArchiveLogArg &arg)
10533{
10534int ret = OB_SUCCESS;
10535LOG_INFO("handle_archive_log", K(arg));
10536if (!inited_) {
10537ret = OB_NOT_INIT;
10538LOG_WARN("not init", K(ret));
10539} else if (OB_FAIL(ObBackupServiceProxy::handle_archive_log(arg))) {
10540LOG_WARN("failed to handle archive log", K(ret));
10541}
10542return ret;
10543}
10544
10545int ObRootService::handle_backup_database(const obrpc::ObBackupDatabaseArg &in_arg)
10546{
10547int ret = OB_SUCCESS;
10548if (!inited_) {
10549ret = OB_NOT_INIT;
10550LOG_WARN("not init", K(ret));
10551} else if (OB_FAIL(ObBackupServiceProxy::handle_backup_database(in_arg))) {
10552LOG_WARN("failed to handle backup database", K(ret), K(in_arg));
10553}
10554FLOG_INFO("handle_backup_database", K(ret), K(in_arg));
10555return ret;
10556}
10557
10558int ObRootService::handle_validate_database(const obrpc::ObBackupManageArg &arg)
10559{
10560int ret = OB_NOT_SUPPORTED;
10561LOG_ERROR("not supported now", K(ret), K(arg));
10562return ret;
10563}
10564
10565int ObRootService::handle_validate_backupset(const obrpc::ObBackupManageArg &arg)
10566{
10567int ret = OB_NOT_SUPPORTED;
10568LOG_ERROR("not supported now", K(ret), K(arg));
10569return ret;
10570}
10571
10572int ObRootService::handle_cancel_validate(const obrpc::ObBackupManageArg &arg)
10573{
10574int ret = OB_NOT_SUPPORTED;
10575LOG_ERROR("not supported now", K(ret), K(arg));
10576return ret;
10577}
10578
10579
10580int ObRootService::disaster_recovery_task_reply(
10581const obrpc::ObDRTaskReplyResult &arg)
10582{
10583int ret = OB_SUCCESS;
10584DEBUG_SYNC(BEFORE_RS_DEAL_WITH_RPC);
10585FLOG_INFO("[DRTASK_NOTICE] receive disaster recovery task reply", K(arg));
10586if (OB_UNLIKELY(!inited_)) {
10587ret = OB_NOT_INIT;
10588LOG_WARN("not init", K(ret));
10589} else if (OB_UNLIKELY(!arg.is_valid())) {
10590ret = OB_INVALID_ARGUMENT;
10591LOG_WARN("invalid arg", KR(ret), K(arg));
10592} else if (OB_FAIL(disaster_recovery_task_mgr_.deal_with_task_reply(arg))) {
10593LOG_WARN("fail to execute over", KR(ret), K(arg));
10594}
10595return ret;
10596}
10597
10598int ObRootService::handle_backup_manage(const obrpc::ObBackupManageArg &arg)
10599{
10600int ret = OB_SUCCESS;
10601
10602if (!inited_) {
10603ret = OB_NOT_INIT;
10604LOG_WARN("not init", K(ret));
10605} else {
10606switch (arg.type_) {
10607case ObBackupManageArg::CANCEL_BACKUP: {
10608if (OB_FAIL(handle_backup_database_cancel(arg))) {
10609LOG_WARN("failed to handle backup database cancel", K(ret), K(arg));
10610}
10611break;
10612};
10613case ObBackupManageArg::VALIDATE_DATABASE: {
10614if (OB_FAIL(handle_validate_database(arg))) {
10615LOG_WARN("failed to handle validate database", K(ret), K(arg));
10616}
10617break;
10618};
10619case ObBackupManageArg::VALIDATE_BACKUPSET: {
10620if (OB_FAIL(handle_validate_backupset(arg))) {
10621LOG_WARN("failed to handle validate backupset", K(ret), K(arg));
10622}
10623break;
10624};
10625case ObBackupManageArg::CANCEL_VALIDATE: {
10626if (OB_FAIL(handle_cancel_validate(arg))) {
10627LOG_WARN("failed to handle cancel validate", K(ret), K(arg));
10628}
10629break;
10630};
10631case ObBackupManageArg::CANCEL_BACKUP_BACKUPSET: {
10632if (OB_FAIL(handle_cancel_backup_backup(arg))) {
10633LOG_WARN("failed to handle cancel backup backup", K(ret), K(arg));
10634}
10635break;
10636}
10637case ObBackupManageArg::CANCEL_BACKUP_BACKUPPIECE: {
10638if (OB_FAIL(handle_cancel_backup_backup(arg))) {
10639LOG_WARN("failed to handle cancel backup backup", K(ret), K(arg));
10640}
10641break;
10642}
10643case ObBackupManageArg::CANCEL_ALL_BACKUP_FORCE: {
10644if (OB_FAIL(handle_cancel_all_backup_force(arg))) {
10645LOG_WARN("failed to handle cancel all backup force", K(ret), K(arg));
10646}
10647break;
10648};
10649default: {
10650ret = OB_INVALID_ARGUMENT;
10651LOG_ERROR("invalid backup manage arg", K(ret), K(arg));
10652break;
10653}
10654}
10655}
10656
10657FLOG_INFO("finish handle_backup_manage", K(ret), K(arg));
10658return ret;
10659}
10660
10661int ObRootService::handle_backup_delete(const obrpc::ObBackupCleanArg &arg)
10662{
10663int ret = OB_SUCCESS;
10664if (!inited_) {
10665ret = OB_NOT_INIT;
10666LOG_WARN("not init", K(ret));
10667} else if (OB_FAIL(ObBackupServiceProxy::handle_backup_delete(arg))) {
10668LOG_WARN("failed to handle backup delete", K(ret), K(arg));
10669}
10670return ret;
10671}
10672
10673int ObRootService::handle_delete_policy(const obrpc::ObDeletePolicyArg &arg)
10674{
10675int ret = OB_SUCCESS;
10676if (!inited_) {
10677ret = OB_NOT_INIT;
10678LOG_WARN("not init", K(ret));
10679} else if (OB_FAIL(ObBackupServiceProxy::handle_delete_policy(arg))) {
10680LOG_WARN("failed to handle delete policy", K(ret), K(arg));
10681}
10682return ret;
10683}
10684
10685int ObRootService::handle_backup_database_cancel(
10686const obrpc::ObBackupManageArg &arg)
10687{
10688int ret = OB_SUCCESS;
10689if (!inited_) {
10690ret = OB_NOT_INIT;
10691LOG_WARN("not init", KR(ret));
10692} else if (ObBackupManageArg::CANCEL_BACKUP != arg.type_) {
10693ret = OB_INVALID_ARGUMENT;
10694LOG_WARN("handle backup database cancel get invalid argument", K(ret), K(arg));
10695} else if (OB_FAIL(ObBackupServiceProxy::handle_backup_database_cancel(arg))) {
10696LOG_WARN("failed to start schedule backup cancel", K(ret), K(arg));
10697}
10698return ret;
10699}
10700
10701int ObRootService::check_backup_scheduler_working(Bool &is_working)
10702{
10703int ret = OB_NOT_SUPPORTED;
10704is_working = true;
10705
10706FLOG_INFO("not support check backup scheduler working, should not use anymore", K(ret), K(is_working));
10707return ret;
10708}
10709
10710ObRootService::ObTenantGlobalContextCleanTimerTask::ObTenantGlobalContextCleanTimerTask(
10711ObRootService &root_service)
10712: root_service_(root_service)
10713{
10714}
10715
10716int ObRootService::ObTenantGlobalContextCleanTimerTask::schedule(int tg_id)
10717{
10718return TG_SCHEDULE(tg_id, *this, SCHEDULE_PERIOD, true);
10719}
10720
10721void ObRootService::ObTenantGlobalContextCleanTimerTask::runTimerTask()
10722{
10723int ret = OB_SUCCESS;
10724if (OB_FAIL(root_service_.clean_global_context())) {
10725LOG_WARN("failed to clean global context", K(ret));
10726}
10727}
10728
10729int ObRootService::handle_cancel_backup_backup(const obrpc::ObBackupManageArg &arg)
10730{
10731int ret = OB_NOT_SUPPORTED;
10732LOG_ERROR("not supported now", K(ret), K(arg));
10733return ret;
10734}
10735
10736int ObRootService::handle_cancel_all_backup_force(const obrpc::ObBackupManageArg &arg)
10737{
10738int ret = OB_NOT_SUPPORTED;
10739LOG_ERROR("not support now", K(ret), K(arg));
10740return ret;
10741}
10742
10743void ObRootService::reset_fail_count()
10744{
10745ATOMIC_STORE(&fail_count_, 0);
10746}
10747
10748void ObRootService::update_fail_count(int ret)
10749{
10750int64_t count = ATOMIC_AAF(&fail_count_, 1);
10751if (count > OB_ROOT_SERVICE_START_FAIL_COUNT_UPPER_LIMIT
10752&& REACH_TIME_INTERVAL(60 * 1000 * 1000)) {
10753LOG_ERROR("rs_monitor_check : fail to start root service", KR(ret), K(count));
10754} else {
10755LOG_WARN("rs_monitor_check : fail to start root service", KR(ret), K(count));
10756}
10757LOG_DBA_WARN(OB_ERR_ROOTSERVICE_START, "msg", "rootservice start()/do_restart() has failure",
10758KR(ret), "fail_cnt", count);
10759}
10760
10761int ObRootService::send_physical_restore_result(const obrpc::ObPhysicalRestoreResult &res)
10762{
10763int ret = OB_SUCCESS;
10764if (!inited_) {
10765ret = OB_NOT_INIT;
10766LOG_WARN("not init", K(ret));
10767} else if (!res.is_valid()) {
10768ret = OB_INVALID_ARGUMENT;
10769LOG_WARN("invalid arg", K(ret), K(res));
10770} else {
10771ret = OB_NOT_SUPPORTED;
10772//TODO set physical restore result
10773}
10774LOG_INFO("get physical restore job's result", K(ret), K(res));
10775return ret;
10776}
10777
10778int ObRootService::create_restore_point(const obrpc::ObCreateRestorePointArg &arg)
10779{
10780int ret = OB_NOT_SUPPORTED;
10781UNUSED(arg);
10782LOG_WARN("craete restpre point is not supported now", K(ret));
10783return ret;
10784}
10785
10786int ObRootService::drop_restore_point(const obrpc::ObDropRestorePointArg &arg)
10787{
10788int ret = OB_NOT_SUPPORTED;
10789UNUSED(arg);
10790LOG_WARN("drop restpre point is not supported now", K(ret));
10791return ret;
10792}
10793
10794int ObRootService::build_ddl_single_replica_response(const obrpc::ObDDLBuildSingleReplicaResponseArg &arg)
10795{
10796int ret = OB_SUCCESS;
10797LOG_INFO("receive build ddl single replica response", K(arg));
10798ObDDLTaskInfo info;
10799info.row_scanned_ = arg.row_scanned_;
10800info.row_inserted_ = arg.row_inserted_;
10801if (OB_UNLIKELY(!inited_)) {
10802ret = OB_NOT_INIT;
10803LOG_WARN("not inited", K(ret));
10804} else if (OB_UNLIKELY(!arg.is_valid())) {
10805ret = OB_INVALID_ARGUMENT;
10806LOG_WARN("invalid arguments", K(ret), K(arg));
10807} else if (OB_FAIL(DDL_SIM(arg.tenant_id_, arg.task_id_, PROCESS_BUILD_SSTABLE_RESPONSE_SLOW))) {
10808LOG_WARN("ddl sim failure: procesc build sstable response slow", K(ret));
10809} else if (OB_FAIL(ddl_scheduler_.on_sstable_complement_job_reply(
10810arg.tablet_id_/*source tablet id*/, ObDDLTaskKey(arg.dest_tenant_id_, arg.dest_schema_id_, arg.dest_schema_version_), arg.snapshot_version_, arg.execution_id_, arg.ret_code_, info))) {
10811LOG_WARN("handle column checksum calc response failed", K(ret), K(arg));
10812}
10813ROOTSERVICE_EVENT_ADD("ddl scheduler", "build ddl single replica response",
10814"tenant_id", arg.tenant_id_,
10815"ret", ret,
10816"trace_id", *ObCurTraceId::get_trace_id(),
10817"task_id", arg.task_id_,
10818"tablet_id_", arg.tablet_id_,
10819"snapshot_version_", arg.snapshot_version_,
10820arg.source_table_id_);
10821LOG_INFO("finish build ddl single replica response ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
10822return ret;
10823}
10824
10825int ObRootService::purge_recyclebin_objects(int64_t purge_each_time)
10826{
10827int ret = OB_SUCCESS;
10828// always passed
10829int64_t expire_timeval = GCONF.recyclebin_object_expire_time;
10830ObSEArray<uint64_t, 16> tenant_ids;
10831ObSchemaGetterGuard guard;
10832if (OB_ISNULL(schema_service_)) {
10833ret = OB_ERR_UNEXPECTED;
10834LOG_WARN("schema_serviece_ is null", KR(ret));
10835} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, guard))) {
10836LOG_WARN("fail to get sys schema guard", KR(ret));
10837} else if (OB_FAIL(guard.get_tenant_ids(tenant_ids))) {
10838LOG_WARN("get all tenants failed", KR(ret));
10839} else {
10840const int64_t current_time = ObTimeUtility::current_time();
10841obrpc::Int64 expire_time = current_time - expire_timeval;
10842const int64_t SLEEP_INTERVAL = 100 * 1000; //100ms interval of send rpc
10843const int64_t PURGE_EACH_RPC = 10; //delete count per rpc
10844obrpc::Int64 affected_rows = 0;
10845obrpc::ObPurgeRecycleBinArg arg;
10846int64_t purge_sum = purge_each_time;
10847const bool is_standby = PRIMARY_CLUSTER != ObClusterInfoGetter::get_cluster_role_v2();
10848const ObSimpleTenantSchema *simple_tenant = NULL;
10849//ignore ret
10850for (int i = 0; i < tenant_ids.count() && in_service() && purge_sum > 0; ++i) {
10851int64_t purge_time = GCONF._recyclebin_object_purge_frequency;
10852const uint64_t tenant_id = tenant_ids.at(i);
10853if (purge_time <= 0) {
10854break;
10855}
10856if (OB_SYS_TENANT_ID != tenant_id && is_standby) {
10857// standby cluster won't purge recyclebin automacially.
10858LOG_TRACE("user tenant won't purge recyclebin automacially in standby cluster", K(tenant_id));
10859continue;
10860} else if (OB_FAIL(guard.get_tenant_info(tenant_id, simple_tenant))) {
10861LOG_WARN("fail to get simple tenant schema", KR(ret), K(tenant_id));
10862} else if (OB_ISNULL(simple_tenant)) {
10863ret = OB_TENANT_NOT_EXIST;
10864LOG_WARN("simple tenant schema not exist", KR(ret), K(tenant_id));
10865} else if (!simple_tenant->is_normal()) {
10866// only deal with normal tenant.
10867LOG_TRACE("tenant which isn't normal won't purge recyclebin automacially", K(tenant_id));
10868continue;
10869}
10870// ignore error code of different tenant
10871ret = OB_SUCCESS;
10872affected_rows = 0;
10873arg.tenant_id_ = tenant_id;
10874arg.expire_time_ = expire_time;
10875arg.auto_purge_ = true;
10876arg.exec_tenant_id_ = tenant_id;
10877LOG_INFO("start purge recycle objects of tenant", K(arg), K(purge_sum));
10878while (OB_SUCC(ret) && in_service() && purge_sum > 0) {
10879int64_t cal_timeout = 0;
10880int64_t start_time = ObTimeUtility::current_time();
10881arg.purge_num_ = purge_sum > PURGE_EACH_RPC ? PURGE_EACH_RPC : purge_sum;
10882if (OB_FAIL(schema_service_->cal_purge_need_timeout(arg, cal_timeout))) {
10883LOG_WARN("fail to cal purge need timeout", KR(ret), K(arg));
10884} else if (0 == cal_timeout) {
10885LOG_INFO("cal purge need timeout is zero, just exit", K(tenant_id), K(purge_sum));
10886break;
10887} else if (OB_FAIL(common_proxy_.timeout(cal_timeout).purge_expire_recycle_objects(arg, affected_rows))) {
10888LOG_WARN("purge reyclebin objects failed", KR(ret),
10889K(current_time), K(expire_time), K(affected_rows), K(arg));
10890} else {
10891purge_sum -= affected_rows;
10892if (arg.purge_num_ != affected_rows) {
10893int64_t cost_time = ObTimeUtility::current_time() - start_time;
10894LOG_INFO("purge recycle objects", KR(ret), K(tenant_id), K(cost_time), K(purge_sum),
10895K(cal_timeout), K(expire_time), K(current_time), K(affected_rows));
10896if (OB_SUCC(ret) && in_service()) {
10897ob_usleep(SLEEP_INTERVAL);
10898}
10899break;
10900}
10901}
10902int64_t cost_time = ObTimeUtility::current_time() - start_time;
10903LOG_INFO("purge recycle objects", KR(ret), K(tenant_id), K(cost_time), K(purge_sum),
10904K(cal_timeout), K(expire_time), K(current_time), K(affected_rows));
10905if (OB_SUCC(ret) && in_service()) {
10906ob_usleep(SLEEP_INTERVAL);
10907}
10908}
10909}
10910}
10911return ret;
10912}
10913
10914int ObRootService::flush_opt_stat_monitoring_info(const obrpc::ObFlushOptStatArg &arg)
10915{
10916int ret = OB_SUCCESS;
10917ObZone empty_zone;
10918ObSEArray<ObAddr, 8> server_list;
10919if (!inited_) {
10920ret = OB_NOT_INIT;
10921LOG_WARN("not init", K(ret));
10922} else if (OB_FAIL(SVR_TRACER.get_alive_servers(empty_zone, server_list))) {
10923LOG_WARN("fail to get alive server", KR(ret));
10924} else {
10925for (int64_t i = 0; OB_SUCC(ret) && i < server_list.count(); ++i) {
10926if (OB_FAIL(rpc_proxy_.to(server_list.at(i)).flush_local_opt_stat_monitoring_info(arg))) {
10927LOG_WARN("fail to update table statistic", K(ret), K(server_list.at(i)));
10928} else { /*do nothing*/}
10929}
10930}
10931return ret;
10932}
10933
10934int ObRootService::clean_global_context()
10935{
10936int ret = OB_SUCCESS;
10937ObArray<uint64_t> tenant_ids;
10938ObSchemaGetterGuard schema_guard;
10939if (OB_UNLIKELY(!inited_)) {
10940ret = OB_NOT_INIT;
10941LOG_WARN("not inited", KR(ret));
10942} else if (OB_ISNULL(schema_service_)) {
10943ret = OB_ERR_UNEXPECTED;
10944LOG_WARN("schema service is null", KR(ret));
10945} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) {
10946LOG_WARN("get schema guard failed", KR(ret));
10947} else if (OB_FAIL(schema_guard.get_tenant_ids(tenant_ids))) {
10948LOG_WARN("failed to get all tenant ids", KR(ret), K(tenant_ids));
10949} else {
10950ObGlobalContextOperator ctx_operator;
10951if (OB_FAIL(ctx_operator.clean_global_context(tenant_ids, sql_proxy_, *schema_service_))) {
10952LOG_WARN("failed to clean global context", K(ret));
10953}
10954}
10955return ret;
10956}
10957
10958int ObRootService::admin_set_backup_config(const obrpc::ObAdminSetConfigArg &arg)
10959{
10960int ret = OB_SUCCESS;
10961if (!arg.is_valid()) {
10962ret = OB_ERR_UNEXPECTED;
10963LOG_WARN("invalid backup config arg", K(ret));
10964} else if (!arg.is_backup_config_) {
10965ret = OB_ERR_UNEXPECTED;
10966LOG_WARN("admin set config type not backup config", K(ret), K(arg));
10967}
10968share::BackupConfigItemPair config_item;
10969share::ObBackupConfigParserMgr config_parser_mgr;
10970ARRAY_FOREACH_X(arg.items_, i , cnt, OB_SUCC(ret)) {
10971const ObAdminSetConfigItem &item = arg.items_.at(i);
10972uint64_t exec_tenant_id = OB_INVALID_TENANT_ID;
10973ObMySQLTransaction trans;
10974config_parser_mgr.reset();
10975if ((common::is_sys_tenant(item.exec_tenant_id_) && item.tenant_name_.is_empty())
10976|| (common::is_user_tenant(item.exec_tenant_id_) && !item.tenant_name_.is_empty())
10977|| common::is_meta_tenant(item.exec_tenant_id_)) {
10978ret = OB_NOT_SUPPORTED;
10979LOG_WARN("backup config only support user tenant", K(ret));
10980} else if (!item.tenant_name_.is_empty()) {
10981schema::ObSchemaGetterGuard guard;
10982if (OB_ISNULL(schema_service_)) {
10983ret = OB_ERR_UNEXPECTED;
10984LOG_WARN("schema service must not be null", K(ret));
10985} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, guard))) {
10986LOG_WARN("fail to get tenant schema guard", K(ret));
10987} else if (OB_FAIL(guard.get_tenant_id(ObString(item.tenant_name_.ptr()), exec_tenant_id))) {
10988LOG_WARN("fail to get tenant id", K(ret));
10989}
10990} else {
10991exec_tenant_id = item.exec_tenant_id_;
10992}
10993
10994if (OB_FAIL(ret)) {
10995} else if (OB_FAIL(trans.start(&sql_proxy_, gen_meta_tenant_id(exec_tenant_id)))) {
10996LOG_WARN("fail to start trans", K(ret));
10997} else {
10998common::ObSqlString name;
10999common::ObSqlString value;
11000if (OB_FAIL(name.assign(item.name_.ptr()))) {
11001LOG_WARN("fail to assign name", K(ret));
11002} else if (OB_FAIL(value.assign(item.value_.ptr()))) {
11003LOG_WARN("fail to assign value", K(ret));
11004} else if (OB_FAIL(config_parser_mgr.init(name, value, exec_tenant_id))) {
11005LOG_WARN("fail to init backup config parser mgr", K(ret), K(item));
11006} else if (OB_FAIL(config_parser_mgr.update_inner_config_table(rpc_proxy_, trans))) {
11007LOG_WARN("fail to update inner config table", K(ret));
11008}
11009
11010if (OB_SUCC(ret)) {
11011if (OB_FAIL(trans.end(true))) {
11012LOG_WARN("fail to commit trans", K(ret));
11013}
11014} else {
11015int tmp_ret = OB_SUCCESS;
11016if (OB_SUCCESS != (tmp_ret = trans.end(false))) {
11017LOG_WARN("fail to rollback trans", K(tmp_ret));
11018}
11019}
11020}
11021}
11022return ret;
11023}
11024
11025int ObRootService::cancel_ddl_task(const ObCancelDDLTaskArg &arg)
11026{
11027int ret = OB_SUCCESS;
11028LOG_INFO("receive cancel ddl task", K(arg));
11029if (OB_UNLIKELY(!arg.is_valid())) {
11030ret = OB_INVALID_ARGUMENT;
11031LOG_WARN("invalid arguments", K(ret), K(arg));
11032} else if (OB_FAIL(SYS_TASK_STATUS_MGR.cancel_task(arg.get_task_id()))) {
11033LOG_WARN("cancel task failed", K(ret));
11034} else {
11035LOG_INFO("succeed to cancel ddl task", K(arg));
11036}
11037ROOTSERVICE_EVENT_ADD("ddl scheduler", "cancel ddl task",
11038"tenant_id", MTL_ID(),
11039"ret", ret,
11040"trace_id", *ObCurTraceId::get_trace_id(),
11041"task_id", arg.get_task_id());
11042LOG_INFO("finish cancel ddl task ddl", K(ret), K(arg), "ddl_event_info", ObDDLEventInfo());
11043return ret;
11044}
11045
11046int ObRootService::check_majority_and_log_in_sync(
11047const ObIArray<ObAddr> &to_stop_servers,
11048const bool skip_log_sync_check,
11049const char *print_str)
11050{
11051int ret = OB_SUCCESS;
11052ObLSStatusOperator ls_status_op;
11053bool need_retry = false;
11054const int64_t CHECK_RETRY_INTERVAL = 100 * 1000; // 100ms
11055const int64_t RESERVED_TIME = 500 * 1000; // 500ms
11056int64_t start_time = ObTimeUtility::current_time();
11057int64_t abs_timeout_us = OB_INVALID_TIMESTAMP;
11058ObTimeoutCtx ctx;
11059const int64_t DEFAULT_RETRY_TIMEOUT = GCONF.internal_sql_execute_timeout;
11060LOG_INFO("check majority and log in sync start",
11061K(to_stop_servers), K(skip_log_sync_check), K(DEFAULT_RETRY_TIMEOUT));
11062
11063if (OB_UNLIKELY(!inited_)) {
11064ret = OB_NOT_INIT;
11065LOG_WARN("not init", KR(ret));
11066} else if (OB_ISNULL(schema_service_)) {
11067ret = OB_ERR_UNEXPECTED;
11068LOG_WARN("schema_service is null", KR(ret));
11069} else if (OB_FAIL(ObShareUtil::set_default_timeout_ctx(ctx, DEFAULT_RETRY_TIMEOUT))) {
11070LOG_WARN("failed to set default timeout ctx", KR(ret), K(DEFAULT_RETRY_TIMEOUT));
11071} else {
11072abs_timeout_us = ctx.get_abs_timeout() - RESERVED_TIME;
11073if (OB_FAIL(ctx.set_abs_timeout(abs_timeout_us))) {
11074LOG_WARN("fail to set abs timeout", KR(ret), K(abs_timeout_us));
11075} else {
11076do {
11077if (need_retry) {
11078ob_usleep(CHECK_RETRY_INTERVAL);
11079}
11080if (OB_FAIL(ls_status_op.check_all_ls_has_majority_and_log_sync(
11081to_stop_servers,
11082skip_log_sync_check,
11083print_str,
11084*schema_service_,
11085sql_proxy_,
11086need_retry))) {
11087LOG_WARN("fail to get and check all ls_paxos_info", KR(ret),
11088K(to_stop_servers), K(skip_log_sync_check));
11089}
11090} while ((OB_OP_NOT_ALLOW == ret) && need_retry);
11091}
11092}
11093LOG_INFO("check majority and log in sync finish", K(to_stop_servers),
11094K(skip_log_sync_check), "cost_time", ObTimeUtility::current_time() - start_time);
11095return ret;
11096}
11097
11098int ObRootService::check_all_ls_has_leader(const char *print_str)
11099{
11100int ret = OB_SUCCESS;
11101ObLSStatusOperator ls_status_op;
11102const int64_t CHECK_RETRY_INTERVAL = 100 * 1000; // 100ms
11103const int64_t RESERVED_TIME = 500 * 1000; // 500ms
11104int64_t start_time = ObTimeUtility::current_time();
11105int64_t abs_timeout_us = OB_INVALID_TIMESTAMP;
11106bool has_ls_without_leader = false;
11107ObTimeoutCtx ctx;
11108const int64_t DEFAULT_RETRY_TIMEOUT = GCONF.internal_sql_execute_timeout;
11109ObSqlString last_error_msg;
11110
11111if (OB_UNLIKELY(!inited_)) {
11112ret = OB_NOT_INIT;
11113LOG_WARN("not init", KR(ret));
11114} else if (OB_FAIL(ObShareUtil::set_default_timeout_ctx(ctx, DEFAULT_RETRY_TIMEOUT))) {
11115LOG_WARN("failed to set default timeout ctx", KR(ret), K(DEFAULT_RETRY_TIMEOUT));
11116} else {
11117abs_timeout_us = ctx.get_abs_timeout() - RESERVED_TIME;
11118if (OB_FAIL(ctx.set_abs_timeout(abs_timeout_us))) {
11119LOG_WARN("fail to set abs timeout", KR(ret), K(abs_timeout_us));
11120} else {
11121do {
11122if (has_ls_without_leader) {
11123ob_usleep(CHECK_RETRY_INTERVAL);
11124}
11125if (OB_FAIL(ls_status_op.check_all_ls_has_leader(
11126sql_proxy_,
11127print_str,
11128has_ls_without_leader,
11129last_error_msg))) {
11130LOG_WARN("fail to check all ls has leader", KR(ret), K(print_str));
11131}
11132} while (OB_OP_NOT_ALLOW == ret && has_ls_without_leader);
11133}
11134}
11135if (OB_TIMEOUT == ret) {
11136ret = OB_OP_NOT_ALLOW;
11137if (!last_error_msg.empty()) {
11138LOG_USER_ERROR(OB_OP_NOT_ALLOW, last_error_msg.ptr());
11139} else {
11140LOG_WARN("fail to check all ls has leader because inner sql timeout", KR(ret), K(print_str));
11141char err_msg[OB_TMP_BUF_SIZE_256];
11142(void)snprintf(err_msg, sizeof(err_msg), "check leader for all LS timeout, %s", print_str);
11143LOG_USER_ERROR(OB_OP_NOT_ALLOW, err_msg);
11144}
11145}
11146LOG_INFO("check all ls has leader finish", KR(ret), K(abs_timeout_us), K(start_time),
11147"cost_time", ObTimeUtility::current_time() - start_time);
11148return ret;
11149}
11150
11151void ObRootService::update_cpu_quota_concurrency_in_memory_()
11152{
11153{
11154omt::ObTenantConfigGuard tenant_config(TENANT_CONF(OB_SYS_TENANT_ID));
11155tenant_config->cpu_quota_concurrency = MAX(10, tenant_config->cpu_quota_concurrency);
11156}
11157}
11158
11159int ObRootService::set_cpu_quota_concurrency_config_()
11160{
11161int64_t affected_rows = 0;
11162int ret = OB_SUCCESS;
11163if (OB_FAIL(sql_proxy_.write("ALTER SYSTEM SET cpu_quota_concurrency = 10;", affected_rows))) {
11164LOG_WARN("update cpu_quota_concurrency failed", K(ret));
11165} else if (OB_FAIL(check_config_result("cpu_quota_concurrency", "10"))) {
11166LOG_WARN("failed to check config same", K(ret));
11167}
11168return ret;
11169}
11170
11171int ObRootService::handle_recover_table(const obrpc::ObRecoverTableArg &arg)
11172{
11173int ret = OB_SUCCESS;
11174LOG_INFO("succeed received recover table arg", K(arg));
11175uint64_t data_version = 0;
11176if (!inited_) {
11177ret = OB_NOT_INIT;
11178LOG_WARN("not init", K(ret));
11179} else if (!arg.is_valid()) {
11180ret = OB_INVALID_ARGUMENT;
11181LOG_WARN("invalid argument", K(ret), K(arg));
11182} else if (GCTX.is_standby_cluster()) {
11183ret = OB_OP_NOT_ALLOW;
11184LOG_WARN("recover table in standby tenant is not allowed", K(ret), K(arg));
11185LOG_USER_ERROR(OB_OP_NOT_ALLOW, "recover table in standby tenant");
11186} else if (GCONF.in_upgrade_mode()) {
11187ret = OB_OP_NOT_ALLOW;
11188LOG_WARN("recover table in upgrade mode is not allowed", K(ret), K(arg));
11189LOG_USER_ERROR(OB_OP_NOT_ALLOW, "Cluster is in upgrade mode, recover table is");
11190} else if (OB_FAIL(ObRecoverTableUtil::check_compatible(arg.tenant_id_))) {
11191LOG_WARN("check recover table compatible failed", K(ret), K(arg));
11192} else {
11193ObRecoverTableInitiator initiator;
11194bool is_exist = false;
11195if (OB_FAIL(initiator.init(schema_service_, &sql_proxy_))) {
11196LOG_WARN("failed to init ObRecoverTableInitiator", K(ret));
11197} else if (ObRecoverTableArg::Action::INITIATE == arg.action_
11198&& OB_FAIL(initiator.is_recover_job_exist(arg.tenant_id_, is_exist))) {
11199LOG_WARN("failed to check recover job exist", K(ret), K(arg));
11200} else if (is_exist) {
11201ret = OB_OP_NOT_ALLOW;
11202LOG_WARN("recover job is exist", K(ret), K(arg));
11203LOG_USER_ERROR(OB_OP_NOT_ALLOW, "recover table when recover table job exists is");
11204} else if (OB_FAIL(initiator.initiate_recover_table(arg))) {
11205LOG_WARN("failed to initiate table recover", K(ret), K(arg));
11206} else {
11207LOG_INFO("[RECOVER_TABLE] initiate recover table succeed", K(arg));
11208}
11209}
11210return ret;
11211}
11212
11213int ObRootService::recompile_all_views_batch(const obrpc::ObRecompileAllViewsBatchArg &arg)
11214{
11215int ret = OB_SUCCESS;
11216int64_t start_time = ObTimeUtility::current_time();
11217if (!inited_) {
11218ret = OB_NOT_INIT;
11219LOG_WARN("not init", K(ret));
11220} else if (!arg.is_valid()) {
11221ret = OB_INVALID_ARGUMENT;
11222LOG_WARN("invalid arg", K(arg), K(ret));
11223} else if (OB_FAIL(ddl_service_.recompile_all_views_batch(arg.tenant_id_, arg.view_ids_))) {
11224LOG_WARN("failed to recompile all views", K(ret), K(arg.tenant_id_));
11225}
11226LOG_INFO("recompile all views batch finish", KR(ret), K(start_time),
11227"cost_time", ObTimeUtility::current_time() - start_time);
11228return ret;
11229}
11230
11231int ObRootService::try_add_dep_infos_for_synonym_batch(const obrpc::ObTryAddDepInofsForSynonymBatchArg &arg)
11232{
11233int ret = OB_SUCCESS;
11234int64_t start_time = ObTimeUtility::current_time();
11235if (!inited_) {
11236ret = OB_NOT_INIT;
11237LOG_WARN("not init", K(ret));
11238} else if (!arg.is_valid()) {
11239ret = OB_INVALID_ARGUMENT;
11240LOG_WARN("invalid arg", K(arg), K(ret));
11241} else if (OB_FAIL(ddl_service_.try_add_dep_info_for_all_synonyms_batch(arg.tenant_id_, arg.synonym_ids_))) {
11242LOG_WARN("failed to add synonym dep info", K(ret), K(arg.tenant_id_));
11243}
11244LOG_INFO("add dep infos for synonym batch finish", KR(ret), K(start_time),
11245"cost_time", ObTimeUtility::current_time() - start_time);
11246return ret;
11247}
11248
11249#ifdef OB_BUILD_TDE_SECURITY
11250int ObRootService::handle_get_root_key(const obrpc::ObRootKeyArg &arg,
11251obrpc::ObRootKeyResult &result)
11252{
11253int ret = OB_SUCCESS;
11254ObRootKey root_key;
11255if (!inited_) {
11256ret = OB_NOT_INIT;
11257LOG_WARN("not init", K(ret));
11258} else if (OB_UNLIKELY(arg.is_set_ || !arg.is_valid())) {
11259ret = OB_INVALID_ARGUMENT;
11260LOG_WARN("invalid arg", K(arg), K(ret));
11261} else if (OB_FAIL(ObMasterKeyGetter::instance().get_root_key(arg.tenant_id_, root_key))) {
11262LOG_WARN("failed to get root key", K(ret));
11263} else if (obrpc::RootKeyType::INVALID != root_key.key_type_) {
11264result.key_type_ = root_key.key_type_;
11265result.root_key_ = root_key.key_;
11266} else if (OB_FAIL(get_root_key_from_obs_(arg, result))) {
11267LOG_WARN("failed to get root key from obs", K(ret));
11268}
11269return ret;
11270}
11271
11272int ObRootService::get_root_key_from_obs_(const obrpc::ObRootKeyArg &arg,
11273obrpc::ObRootKeyResult &result)
11274{
11275int ret = OB_SUCCESS;
11276ObZone empty_zone;
11277ObArray<ObAddr> active_server_list;
11278const ObSimpleTenantSchema *simple_tenant = NULL;
11279ObSchemaGetterGuard guard;
11280const uint64_t tenant_id = arg.tenant_id_;
11281bool enable_default = false;
11282if (OB_ISNULL(schema_service_)) {
11283ret = OB_ERR_UNEXPECTED;
11284LOG_WARN("schema_serviece_ is null", KR(ret));
11285} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, guard))) {
11286LOG_WARN("fail to get sys schema guard", KR(ret));
11287} else if (OB_FAIL(guard.get_tenant_info(tenant_id, simple_tenant))) {
11288LOG_WARN("fail to get simple tenant schema", KR(ret), K(tenant_id));
11289} else if (OB_NOT_NULL(simple_tenant) && simple_tenant->is_normal()) {
11290enable_default = true;
11291}
11292if (OB_FAIL(ret)) {
11293} else if (OB_FAIL(SVR_TRACER.get_alive_servers(empty_zone, active_server_list))) {
11294LOG_WARN("get alive servers failed", KR(ret));
11295} else if (OB_FAIL(ObDDLService::notify_root_key(rpc_proxy_, arg, active_server_list, result,
11296enable_default, true/*skip_call_rs*/))) {
11297LOG_WARN("failed to notify root key", KR(ret));
11298}
11299return ret;
11300}
11301
11302int ObRootService::reload_master_key(const obrpc::ObReloadMasterKeyArg &arg,
11303obrpc::ObReloadMasterKeyResult &result)
11304{
11305int ret = OB_SUCCESS;
11306uint64_t max_version = 0;
11307if (!inited_) {
11308ret = OB_NOT_INIT;
11309LOG_WARN("not init", K(ret));
11310} else if (OB_UNLIKELY(!arg.is_valid())) {
11311ret = OB_INVALID_ARGUMENT;
11312LOG_WARN("invalid arg", K(arg), K(ret));
11313} else if (OB_FAIL(master_key_mgr_.reload_tenant_max_key_version(arg.tenant_id_, max_version))) {
11314LOG_WARN("failed to reload master key version", K(ret), K(arg));
11315} else {
11316result.tenant_id_ = arg.tenant_id_;
11317result.master_key_id_ = max_version;
11318}
11319return ret;
11320}
11321#endif
11322
11323} // end namespace rootserver
11324} // end namespace oceanbase
11325