diff --git a/src/rootserver/backup/ob_backup_schedule_task.cpp b/src/rootserver/backup/ob_backup_schedule_task.cpp index af07e76cb..e5dcc77ef 100644 --- a/src/rootserver/backup/ob_backup_schedule_task.cpp +++ b/src/rootserver/backup/ob_backup_schedule_task.cpp @@ -13,6 +13,7 @@ #define USING_LOG_PREFIX RS #include "ob_backup_task_scheduler.h" +#include "share/location_cache/ob_location_service.h" #include "share/backup/ob_backup_data_table_operator.h" #include "share/backup/ob_backup_clean_operator.h" #include "share/ob_srv_rpc_proxy.h" @@ -931,7 +932,7 @@ int64_t ObBackupCleanLSTask::get_deep_copy_size() const bool ObBackupCleanLSTask::can_execute_on_any_server() const { - return true; + return false; } int ObBackupCleanLSTask::do_update_dst_and_doing_status_(common::ObMySQLProxy &sql_proxy, common::ObAddr &dst, share::ObTaskId &trace_id) @@ -944,6 +945,50 @@ int ObBackupCleanLSTask::do_update_dst_and_doing_status_(common::ObMySQLProxy &s return ret; } + +int ObBackupCleanLSTask::set_optional_servers_() +{ + int ret = OB_SUCCESS; + ObArray servers; + uint64_t tenant_id = get_tenant_id(); + share::ObLocationService *location_service = GCTX.location_service_; + int64_t cluster_id = GCONF.cluster_id; + share::ObLSID ls_id(share::ObLSID::SYS_LS_ID); + share::ObLSLocation location; + bool is_cache_hit = false; + + if (OB_ISNULL(location_service)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("location_service ptr is null", K(ret)); + } else if (OB_FAIL(location_service->get(cluster_id, tenant_id, ls_id, INT64_MAX/*expire_renew_time*/, + is_cache_hit, location))) { + LOG_WARN("failed to get location", K(ret), K(cluster_id), K(tenant_id), K(ls_id)); + } else { + const common::ObIArray &replica_array = location.get_replica_locations(); + for (int i = 0; OB_SUCC(ret) && i < replica_array.count(); ++i) { + const ObLSReplicaLocation &replica = replica_array.at(i); + if (replica.is_valid()) { + ObBackupServer server; + server.set(replica.get_server(), 1/*high priority*/); + if (OB_FAIL(servers.push_back(server))) { + LOG_WARN("failed to push server", K(ret), K(server)); + } + } + } + if (OB_SUCC(ret) && servers.empty()) { + ret = OB_EAGAIN; + LOG_WARN("no optional servers, retry_later", K(ret), K(*this)); + } + } + + if (OB_SUCC(ret) && OB_FAIL(set_optional_servers(servers))) { + LOG_WARN("failed to optional servers", K(ret)); + } else { + FLOG_INFO("task optional servers are:", K(*this), K(servers)); + } + return ret; +} + int ObBackupCleanLSTask::execute(obrpc::ObSrvRpcProxy &rpc_proxy) const { int ret = OB_SUCCESS; @@ -1008,7 +1053,9 @@ int ObBackupCleanLSTask::build(const ObBackupCleanTaskAttr &task_attr, const ObB LOG_WARN("failed to assign backup path", K(ret), K(task_attr.backup_path_)); } else if (OB_FAIL(task_attr.get_backup_clean_id(id_))) { LOG_WARN("failed to get task id", K(ret), K(task_attr)); - } + } else if (OB_FAIL(set_optional_servers_())) { + LOG_WARN("failed to set optional servers", K(ret), K(task_attr)); + } } return ret; } diff --git a/src/rootserver/backup/ob_backup_schedule_task.h b/src/rootserver/backup/ob_backup_schedule_task.h index f6014ccfc..4c9058b63 100644 --- a/src/rootserver/backup/ob_backup_schedule_task.h +++ b/src/rootserver/backup/ob_backup_schedule_task.h @@ -385,6 +385,7 @@ public: virtual int cancel(obrpc::ObSrvRpcProxy &rpc_proxy) const override; private: virtual int do_update_dst_and_doing_status_(common::ObMySQLProxy &sql_proxy, common::ObAddr &dst, share::ObTaskId &trace_id) override; + int set_optional_servers_(); public: int build(const share::ObBackupCleanTaskAttr &task_attr, const share::ObBackupCleanLSTaskAttr &ls_attr); INHERIT_TO_STRING_KV("ObBackupScheduleTask", ObBackupScheduleTask, K_(job_id), K_(incarnation_id), K_(id), K_(round_id), diff --git a/src/share/backup/ob_backup_struct.cpp b/src/share/backup/ob_backup_struct.cpp index b5f72305b..958435486 100644 --- a/src/share/backup/ob_backup_struct.cpp +++ b/src/share/backup/ob_backup_struct.cpp @@ -30,10 +30,6 @@ using namespace lib; using namespace common; using namespace share; -bool share::has_independ_inc_backup_set(const int64_t version) -{ - return version >= OB_BACKUP_COMPATIBLE_VERSION_V2 && version < OB_BACKUP_COMPATIBLE_VERSION_MAX; -} bool share::is_valid_backup_inner_table_version(const ObBackupInnerTableVersion &version) { return version > 0 && version < OB_BACKUP_INNER_TABLE_VMAX; diff --git a/src/share/backup/ob_backup_struct.h b/src/share/backup/ob_backup_struct.h index f0dd7f283..429f8fe0c 100644 --- a/src/share/backup/ob_backup_struct.h +++ b/src/share/backup/ob_backup_struct.h @@ -33,16 +33,6 @@ namespace oceanbase namespace share { -enum ObBackupCompatibleVersion // used for data backup TODO(chongrong): delete it? -{ - OB_BACKUP_COMPATIBLE_VERSION_V1 = 1, // since 2.2.60 - OB_BACKUP_COMPATIBLE_VERSION_V2 = 2, // since 2.2.77 - OB_BACKUP_COMPATIBLE_VERSION_V3 = 3, // since 3.1 - OB_BACKUP_COMPATIBLE_VERSION_V4 = 4, // since 4.0 - OB_BACKUP_COMPATIBLE_VERSION_MAX, -}; - -bool has_independ_inc_backup_set(const int64_t version); // for log archive and data backup, exclude backup lease service inner table enum ObBackupInnerTableVersion { OB_BACKUP_INNER_TABLE_V1 = 1, // since 2.2.60 diff --git a/src/storage/backup/ob_ls_backup_clean_mgr.cpp b/src/storage/backup/ob_ls_backup_clean_mgr.cpp index d0c498542..69b5b31f8 100644 --- a/src/storage/backup/ob_ls_backup_clean_mgr.cpp +++ b/src/storage/backup/ob_ls_backup_clean_mgr.cpp @@ -33,21 +33,23 @@ int ObLSBackupCleanScheduler::schedule_backup_clean_dag(const obrpc::ObLSBackupC int ret = OB_SUCCESS; ObLSBackupCleanDagNetInitParam param; ObLSBackupCleanDagNet *clean_dag_net = nullptr; - ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler *); - if (OB_ISNULL(scheduler)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null MTL scheduler", K(ret), K(scheduler)); - } else if (OB_FAIL(param.set(args))) { - LOG_WARN("failed to set ls backup clean net init param",K(ret), K(args)); - } else if (OB_FAIL(scheduler->create_and_add_dag_net(¶m, clean_dag_net))) { - if (OB_TASK_EXIST == ret) { - ret = OB_SUCCESS; - LOG_INFO("[BACKUP_CLEAN]alreadly have log stream backup dag net in DagScheduler", K(ret)); + MTL_SWITCH(args.tenant_id_) { + ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler *); + if (OB_ISNULL(scheduler)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null MTL scheduler", K(ret), K(scheduler)); + } else if (OB_FAIL(param.set(args))) { + LOG_WARN("failed to set ls backup clean net init param",K(ret), K(args)); + } else if (OB_FAIL(scheduler->create_and_add_dag_net(¶m, clean_dag_net))) { + if (OB_TASK_EXIST == ret) { + ret = OB_SUCCESS; + LOG_INFO("[BACKUP_CLEAN]alreadly have log stream backup dag net in DagScheduler", K(ret)); + } else { + LOG_WARN("failed to create log stream backup dag net", K(ret)); + } } else { - LOG_WARN("failed to create log stream backup dag net", K(ret)); + LOG_INFO("[BACKUP_CLEAN]success to create log stream backup dag net", K(ret), K(param)); } - } else { - LOG_INFO("[BACKUP_CLEAN]success to create log stream backup dag net", K(ret), K(param)); } return ret;