oceanbase
522 строки · 24.7 Кб
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 "ob_recover_table_initiator.h"
16#include "lib/hash/ob_hashset.h"
17#include "lib/charset/ob_charset.h"
18#include "share/ob_rpc_struct.h"
19#include "share/backup/ob_backup_data_table_operator.h"
20#include "rootserver/ob_rs_event_history_table_operator.h"
21#include "ob_restore_util.h"
22#include "share/restore/ob_recover_table_persist_helper.h"
23#include "sql/parser/parse_node.h"
24#include "rootserver/ddl_task/ob_ddl_task.h"
25#include "share/restore/ob_import_table_persist_helper.h"
26
27using namespace oceanbase;
28using namespace share::schema;
29using namespace common;
30using namespace obrpc;
31using namespace rootserver;
32using namespace share;
33
34int ObRecoverTableInitiator::init(
35share::schema::ObMultiVersionSchemaService *schema_service, common::ObMySQLProxy *sql_proxy)
36{
37int ret = OB_SUCCESS;
38if (IS_INIT) {
39ret = OB_INIT_TWICE;
40LOG_WARN("ObRecoverTableInitiator init twice", K(ret));
41} else if (OB_ISNULL(schema_service) || OB_ISNULL(schema_service)) {
42ret = OB_INVALID_ARGUMENT;
43LOG_WARN("schema service and sql prxoy must not be null", K(ret));
44} else {
45schema_service_ = schema_service;
46sql_proxy_ = sql_proxy;
47is_inited_ = true;
48}
49return ret;
50}
51
52int ObRecoverTableInitiator::initiate_recover_table(const obrpc::ObRecoverTableArg &arg)
53{
54int ret = OB_SUCCESS;
55if (IS_NOT_INIT) {
56ret = OB_NOT_INIT;
57LOG_WARN("ObRecoverTableInitiator is not init", K(ret));
58} else if (!arg.is_valid()) {
59ret = OB_INVALID_ARGUMENT;
60LOG_WARN("invalid ObRecoverTableArg", K(ret), K(arg));
61} else if (OB_FAIL(check_before_initiate_(arg))) {
62LOG_WARN("failed to check before initiate", K(ret));
63} else if (obrpc::ObRecoverTableArg::Action::INITIATE == arg.action_) {
64if (OB_FAIL(start_recover_table_(arg))) {
65LOG_WARN("failed to start recover table", K(ret), K(arg));
66}
67} else if (obrpc::ObRecoverTableArg::Action::CANCEL == arg.action_) {
68if (OB_FAIL(cancel_recover_table_(arg))) {
69LOG_WARN("failed to cancel recover table", K(ret), K(arg));
70}
71}
72return ret;
73}
74
75int ObRecoverTableInitiator::is_recover_job_exist(const uint64_t target_tenant_id, bool &is_exist) const
76{
77int ret = OB_SUCCESS;
78share::ObRecoverTablePersistHelper table_op;
79if (IS_NOT_INIT) {
80ret = OB_NOT_INIT;
81LOG_WARN("ObRecoverTableInitiator is not init", K(ret));
82} else if (!is_user_tenant(target_tenant_id)) {
83ret = OB_INVALID_ARGUMENT;
84LOG_WARN("invalid target_tenant_id", K(ret), K(target_tenant_id));
85} else if (OB_FAIL(table_op.init(OB_SYS_TENANT_ID))) {
86LOG_WARN("failed to init sys table op", K(ret));
87} else if (OB_FAIL(table_op.is_recover_table_job_exist(*sql_proxy_, target_tenant_id, is_exist))) {
88LOG_WARN("failed to check recover table job exist", K(ret), K(target_tenant_id));
89}
90return ret;
91}
92
93int ObRecoverTableInitiator::start_recover_table_(const obrpc::ObRecoverTableArg &arg)
94{
95int ret = OB_SUCCESS;
96share::ObRecoverTableJob job;
97ObPhysicalRestoreJob physical_restore_job;
98if (OB_FALSE_IT(job.set_status(share::ObRecoverTableStatus::PREPARE))) {
99} else if (OB_FAIL(job.set_target_tenant_name(arg.tenant_name_))) {
100LOG_WARN("failed to set traget tenant name", K(ret));
101} else if (OB_FALSE_IT(job.set_target_tenant_id(arg.tenant_id_))) {
102} else if (OB_FAIL(job.set_description(arg.restore_tenant_arg_.description_))) {
103LOG_WARN("failed to set description", K(ret));
104} else if (OB_FAIL(fill_aux_tenant_restore_info_(arg, job, physical_restore_job))) {
105LOG_WARN("failed to fill aux tenant resetore info", K(ret), K(arg));
106} else if (OB_FAIL(fill_recover_table_arg_(arg, job))) {
107LOG_WARN("failed to fill recover table arg", K(ret));
108} else if (OB_FAIL(insert_sys_job_(job, physical_restore_job))) {
109LOG_WARN("failed to insert sys recover table job", K(ret));
110} else {
111LOG_INFO("initiate recover table succeed", K(ret), K(job));
112}
113uint64_t tenant_id = arg.tenant_id_;
114int64_t job_id = job.get_job_id();
115share::ObTaskId trace_id(*ObCurTraceId::get_trace_id());
116ROOTSERVICE_EVENT_ADD("recover_table", "start_recover_table", K(tenant_id), K(job_id), K(ret), K(trace_id));
117return ret;
118}
119int ObRecoverTableInitiator::cancel_recover_table_(const obrpc::ObRecoverTableArg &arg)
120{
121int ret = OB_SUCCESS;
122ObMySQLTransaction trans;
123share::ObRecoverTablePersistHelper recover_helper;
124share::ObImportTableJobPersistHelper import_helper;
125uint64_t exec_tenant_id = gen_meta_tenant_id(arg.tenant_id_);
126if (OB_FAIL(recover_helper.init(arg.tenant_id_))) {
127LOG_WARN("failed to init helper", K(ret), K(arg));
128} else if (OB_FAIL(import_helper.init(arg.tenant_id_))) {
129LOG_WARN("failed to init helper", K(ret), K(arg));
130} else if (OB_FAIL(trans.start(sql_proxy_, exec_tenant_id))) {
131LOG_WARN("failed to start trans", K(ret), K(exec_tenant_id));
132} else if (OB_FAIL(import_helper.force_cancel_import_job(trans))) {
133LOG_WARN("failed to force cancel import job", K(ret), K(arg));
134} else if (OB_FAIL(recover_helper.force_cancel_recover_job(trans))) {
135LOG_WARN("failed to force cancel recover job", K(ret), K(arg));
136}
137if (trans.is_started()) {
138int tmp_ret = OB_SUCCESS;
139if (OB_TMP_FAIL(trans.end(OB_SUCC(ret)))) {
140ret = OB_SUCC(ret) ? tmp_ret : ret;
141LOG_WARN("failed to end trans", K(ret));
142}
143}
144
145ROOTSERVICE_EVENT_ADD("recover_table", "cancel_recover_table", "tenant_id", arg.tenant_id_, "result", ret);
146return ret;
147}
148
149int ObRecoverTableInitiator::insert_sys_job_(
150share::ObRecoverTableJob &job, share::ObPhysicalRestoreJob &physical_restore_job)
151{
152int ret = OB_SUCCESS;
153ObMySQLTransaction trans;
154int64_t job_id = -1;
155if (OB_FAIL(trans.start(sql_proxy_, OB_SYS_TENANT_ID))) {
156LOG_WARN("failed to start trans", K(ret));
157} else {
158share::ObRecoverTablePersistHelper helper;
159if (OB_FAIL(ObLSBackupInfoOperator::get_next_job_id(trans, OB_SYS_TENANT_ID, job_id))) {
160LOG_WARN("failed to get next job_id", K(ret));
161} else if (OB_FALSE_IT(job.set_tenant_id(OB_SYS_TENANT_ID))) {
162} else if (OB_FALSE_IT(job.set_initiator_tenant_id(OB_SYS_TENANT_ID))) {
163} else if (OB_FALSE_IT(job.set_job_id(job_id))) {
164} else if (OB_FALSE_IT(job.set_initiator_job_id(0/*sys job default value*/))) {
165} else if (OB_FALSE_IT(job.set_start_ts(ObTimeUtility::current_time()))) {
166} else if (OB_FAIL(helper.init(OB_SYS_TENANT_ID))) {
167LOG_WARN("failed to init sys table op", K(ret));
168} else if (OB_FAIL(helper.insert_recover_table_job(trans, job))) {
169LOG_WARN("failed to insert initital recover table job", K(ret), K(job));
170}
171
172if (FAILEDx(RS_JOB_CREATE_EXT(job_id, RESTORE_TENANT, trans, "sql_text", "restore aux tenant"))) {
173LOG_WARN("failed to get job id", K(ret));
174} else if (OB_FALSE_IT(physical_restore_job.init_restore_key(OB_SYS_TENANT_ID, job_id))) {
175} else if (OB_FALSE_IT(physical_restore_job.set_restore_start_ts(ObTimeUtility::current_time()))) {
176} else if (OB_FALSE_IT(physical_restore_job.set_initiator_job_id(job.get_job_id()))) {
177} else if (OB_FALSE_IT(physical_restore_job.set_initiator_tenant_id(OB_SYS_TENANT_ID))) {
178} else if (OB_FALSE_IT(physical_restore_job.set_recover_table(true))) {
179} else if (OB_FAIL(ObRestoreUtil::record_physical_restore_job(trans, physical_restore_job))) {
180LOG_WARN("failed to record physical restore job", K(ret));
181}
182if (OB_SUCC(ret)) {
183if (OB_FAIL(trans.end(true))) {
184LOG_WARN("failed to commit trans", K(ret));
185}
186} else {
187int tmp_ret = OB_SUCCESS;
188if (OB_SUCCESS != (tmp_ret = trans.end(false))) {
189LOG_WARN("failed to rollback trans", K(tmp_ret));
190}
191}
192}
193return ret;
194}
195
196int ObRecoverTableInitiator::check_before_initiate_(const obrpc::ObRecoverTableArg &arg)
197{
198int ret = OB_SUCCESS;
199schema::ObSchemaGetterGuard guard;
200uint64_t target_tenant_id = 0;
201if (!is_user_tenant(arg.tenant_id_)) {
202ret = OB_INVALID_ARGUMENT;
203LOG_USER_ERROR(OB_INVALID_ARGUMENT, "TENANT, it must be user tenant");
204LOG_WARN("invlaid tenant id, it must be user tenant", K(ret), K(arg.tenant_id_));
205} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, guard))) {
206LOG_WARN("failed to get sys schema guard", K(ret));
207} else if (OB_FAIL(guard.get_tenant_id(arg.tenant_name_, target_tenant_id))) {
208LOG_WARN("failed to get tenant id", K(ret), K(arg.tenant_name_));
209} else if (arg.tenant_id_ != target_tenant_id) {
210ret = OB_ERR_UNEXPECTED;
211LOG_WARN("arg tenant id and tenant name must be couple", K(ret), K(arg));
212}
213return ret;
214}
215
216int ObRecoverTableInitiator::fill_aux_tenant_name_(share::ObRecoverTableJob &job)
217{
218int ret = OB_SUCCESS;
219char aux_tenant_name[OB_MAX_TENANT_NAME_LENGTH] = "";
220if (OB_FAIL(databuff_printf(aux_tenant_name, OB_MAX_TENANT_NAME_LENGTH, "AUX_RECOVER$%ld", ObTimeUtility::current_time()))) {
221LOG_WARN("failed to generate aux tenant name", K(ret));
222} else if (OB_FAIL(job.set_aux_tenant_name(ObString(aux_tenant_name)))) {
223LOG_WARN("failed to set aux tenant name", K(ret), K(aux_tenant_name));
224}
225return ret;
226}
227
228int ObRecoverTableInitiator::fill_aux_tenant_restore_info_(
229const obrpc::ObRecoverTableArg &arg, share::ObRecoverTableJob &job, share::ObPhysicalRestoreJob &physical_restore_job)
230{
231int ret = OB_SUCCESS;
232obrpc::ObPhysicalRestoreTenantArg tenant_restore_arg;
233if (OB_FAIL(fill_aux_tenant_name_(job))) {
234LOG_WARN("failed to fill aux tenant name", K(ret));
235} else if (OB_FAIL(tenant_restore_arg.assign(arg.restore_tenant_arg_))) {
236LOG_WARN("failed to assign tenant restore arg", K(ret), K(arg.restore_tenant_arg_));
237} else if (OB_FALSE_IT(tenant_restore_arg.tenant_name_ = job.get_aux_tenant_name())) {
238} else if (OB_FAIL(ObRestoreUtil::fill_physical_restore_job(1/*fake job id*/, tenant_restore_arg, physical_restore_job))) {
239LOG_WARN("failed to fill physical restore job", K(ret), K(tenant_restore_arg));
240} else if (OB_FALSE_IT(job.set_restore_scn(physical_restore_job.get_restore_scn()))) {
241} else if (OB_FAIL(job.set_restore_option(physical_restore_job.get_restore_option()))) {
242LOG_WARN("failed to set restore option", K(ret));
243} else if (OB_FAIL(job.set_backup_dest(physical_restore_job.get_backup_dest()))) {
244LOG_WARN("failed to set backup dest", K(ret));
245} else if (OB_FAIL(job.set_external_kms_info(physical_restore_job.get_kms_info()))) {
246LOG_WARN("failed to set kms info", K(ret));
247} else if (OB_FAIL(job.set_backup_passwd(physical_restore_job.get_passwd_array()))) {
248LOG_WARN("failed to set backup passwd", K(ret));
249} else if (OB_FAIL(job.get_multi_restore_path_list().assign(physical_restore_job.get_multi_restore_path_list()))) {
250LOG_WARN("faield to assign multi restore path", K(ret));
251}
252return ret;
253}
254
255int ObRecoverTableInitiator::fill_recover_database(
256const share::ObImportArg &import_arg,
257share::ObImportTableArg &import_table_arg)
258{
259//TODO(zeyong) move duplicate item checking logic to ObImportArg internal later.
260int ret = OB_SUCCESS;
261const share::ObImportDatabaseArray &db_array = import_arg.get_import_database_array();
262ARRAY_FOREACH(db_array.get_items(), i) {
263const share::ObImportDatabaseItem db_item = db_array.get_items().at(i);
264if (OB_FAIL(import_table_arg.add_database(db_item))) {
265LOG_WARN("failed to add database", K(ret));
266}
267}
268if (OB_SUCC(ret)) {
269LOG_INFO("succeed fill recover database", K(import_arg), K(db_array), K(import_table_arg.get_import_database_array()));
270}
271return ret;
272}
273
274int ObRecoverTableInitiator::fill_recover_table(
275const share::ObImportArg &import_arg,
276share::ObImportTableArg &import_table_arg)
277{
278int ret = OB_SUCCESS;
279const share::ObImportTableArray &table_array = import_arg.get_import_table_array();
280bool is_dup = false;
281ObSqlString dup_item_str;
282ARRAY_FOREACH(table_array.get_items(), i) {
283const share::ObImportTableItem table_item = table_array.get_items().at(i);
284share::ObImportDatabaseItem db_item(table_item.mode_, table_item.database_name_.ptr(), table_item.database_name_.length());
285if (OB_FAIL(import_table_arg.check_database_dup(db_item, is_dup, dup_item_str))) {
286LOG_WARN("failed to check database dup", K(ret));
287} else if (is_dup) {
288ret = OB_NOT_SUPPORTED;
289LOG_WARN("duplicate database", K(table_item));
290LOG_USER_ERROR(OB_NOT_SUPPORTED, dup_item_str.ptr());
291} else if (OB_FAIL(import_table_arg.add_table(table_item))) {
292LOG_WARN("failed to add table", K(ret));
293}
294}
295if (OB_SUCC(ret)) {
296LOG_INFO("succeed fill recover table", K(import_arg), K(table_array), K(import_table_arg.get_import_table_array()));
297}
298return ret;
299}
300
301int ObRecoverTableInitiator::fill_recover_partition(
302const share::ObImportArg &import_arg,
303share::ObImportTableArg &import_table_arg)
304{
305int ret = OB_SUCCESS;
306bool is_dup = true;
307ObSqlString dup_item_str;
308const share::ObImportPartitionArray &partition_array = import_arg.get_import_partition_array();
309ARRAY_FOREACH(partition_array.get_items(), i) {
310const share::ObImportPartitionItem partition_item = partition_array.get_items().at(i);
311share::ObImportDatabaseItem db_item(partition_item.mode_,
312partition_item.database_name_.ptr(),
313partition_item.database_name_.length());
314share::ObImportTableItem table_item(partition_item.mode_,
315partition_item.database_name_.ptr(),
316partition_item.database_name_.length(),
317partition_item.table_name_.ptr(),
318partition_item.table_name_.length());
319if (OB_FAIL(import_table_arg.check_database_dup(db_item, is_dup, dup_item_str))) {
320LOG_WARN("failed to check database dup", K(ret));
321} else if (is_dup) {
322ret = OB_NOT_SUPPORTED;
323LOG_WARN("duplicate database", K(table_item));
324LOG_USER_ERROR(OB_NOT_SUPPORTED, dup_item_str.ptr());
325} else if (OB_FAIL(import_table_arg.check_table_dup(table_item, is_dup, dup_item_str))) {
326LOG_WARN("failed to check table dup", K(ret));
327} else if (is_dup) {
328ret = OB_NOT_SUPPORTED;
329LOG_WARN("duplicate table", K(table_item));
330LOG_USER_ERROR(OB_NOT_SUPPORTED, dup_item_str.ptr());
331} else if (OB_FAIL(import_table_arg.add_partition(partition_item))) {
332LOG_WARN("failed to add partition", K(ret));
333}
334}
335if (OB_SUCC(ret)) {
336LOG_INFO("succeed fill recover partition", K(import_arg), K(partition_array), K(import_table_arg.get_import_partition_array()));
337}
338return ret;
339}
340
341int ObRecoverTableInitiator::fill_remap_database(
342const share::ObImportArg &import_arg,
343const share::ObImportTableArg &import_table_arg,
344share::ObImportRemapArg &import_remap_arg)
345{
346int ret = OB_SUCCESS;
347bool is_dup = true;
348ObSqlString dup_item_str;
349const share::ObRemapDatabaseArray &remap_db_array = import_arg.get_remap_database_array();
350ARRAY_FOREACH(remap_db_array.get_remap_items(), i) {
351const share::ObRemapDatabaseItem remap_db_item = remap_db_array.get_remap_items().at(i);
352const share::ObImportDatabaseItem src_db_item(remap_db_item.src_.mode_,
353remap_db_item.src_.name_.ptr(),
354remap_db_item.src_.name_.length());
355const share::ObImportDatabaseItem target_db_item(remap_db_item.target_.mode_,
356remap_db_item.target_.name_.ptr(),
357remap_db_item.target_.name_.length());
358if (OB_FAIL(import_table_arg.check_database_dup(src_db_item, is_dup, dup_item_str))) {
359LOG_WARN("failed to check database dup", K(ret));
360} else if (!is_dup) {
361ret = OB_NOT_SUPPORTED;
362LOG_WARN("remap not exist database", K(src_db_item));
363LOG_USER_ERROR(OB_NOT_SUPPORTED, "remap not exist recover database");
364} else if (OB_FAIL(import_table_arg.check_database_dup(target_db_item, is_dup, dup_item_str))) {
365LOG_WARN("failed to check dup", K(ret));
366} else if (is_dup) {
367ret = OB_NOT_SUPPORTED;
368LOG_WARN("remap exist database", K(src_db_item));
369LOG_USER_ERROR(OB_NOT_SUPPORTED, dup_item_str.ptr());
370} else if (OB_FAIL(import_remap_arg.add_remap_database(remap_db_item))) {
371LOG_WARN("failed to add database", K(ret));
372}
373}
374if (OB_SUCC(ret)) {
375LOG_INFO("succeed fill remap database", K(import_arg), K(remap_db_array), K(import_remap_arg.get_remap_database_array()));
376}
377return ret;
378}
379
380int ObRecoverTableInitiator::fill_remap_table(
381const share::ObImportArg &import_arg,
382const share::ObImportTableArg &import_table_arg,
383share::ObImportRemapArg &import_remap_arg)
384{
385int ret = OB_SUCCESS;
386bool is_dup = true;
387ObSqlString dup_item_str;
388const share::ObRemapTableArray &remap_table_array = import_arg.get_remap_table_array();
389ARRAY_FOREACH(remap_table_array.get_remap_items(), i) {
390const share::ObRemapTableItem remap_table_item = remap_table_array.get_remap_items().at(i);
391const share::ObImportTableItem src_table_item(remap_table_item.src_.mode_,
392remap_table_item.src_.database_name_.ptr(),
393remap_table_item.src_.database_name_.length(),
394remap_table_item.src_.table_name_.ptr(),
395remap_table_item.src_.table_name_.length());
396const share::ObImportTableItem target_table_item(remap_table_item.target_.mode_,
397remap_table_item.target_.database_name_.ptr(),
398remap_table_item.target_.database_name_.length(),
399remap_table_item.target_.table_name_.ptr(),
400remap_table_item.target_.table_name_.length());
401if (OB_FAIL(import_table_arg.check_table_dup(src_table_item, is_dup, dup_item_str))) {
402LOG_WARN("failed to check table dup", K(ret));
403} else if (!is_dup) {
404ret = OB_NOT_SUPPORTED;
405LOG_WARN("remap not exist table", K(src_table_item));
406LOG_USER_ERROR(OB_NOT_SUPPORTED, "remap not exist recover table");
407} else if (OB_FAIL(import_table_arg.check_table_dup(target_table_item, is_dup, dup_item_str))) {
408} else if (is_dup) {
409ret = OB_NOT_SUPPORTED;
410LOG_WARN("remap exist table", K(target_table_item));
411LOG_USER_ERROR(OB_NOT_SUPPORTED, dup_item_str.ptr());
412} else if (OB_FAIL(import_remap_arg.add_remap_table(remap_table_item))) {
413LOG_WARN("failed to add remap table", K(ret));
414}
415}
416if (OB_SUCC(ret)) {
417LOG_INFO("succeed fill remap table", K(import_arg), K(remap_table_array), K(import_remap_arg.get_remap_table_array()));
418}
419return ret;
420}
421
422int ObRecoverTableInitiator::fill_remap_partition(
423const share::ObImportArg &import_arg,
424const share::ObImportTableArg &import_table_arg,
425share::ObImportRemapArg &import_remap_arg)
426{
427int ret = OB_SUCCESS;
428bool is_dup = true;
429ObSqlString dup_item_str;
430const share::ObRemapPartitionArray &remap_partition_array = import_arg.get_remap_partition_array();
431ARRAY_FOREACH(remap_partition_array.get_remap_items(), i) {
432const share::ObRemapPartitionItem remap_part_item = remap_partition_array.get_remap_items().at(i);
433const share::ObImportPartitionItem src_part_item(remap_part_item.src_.mode_,
434remap_part_item.src_.database_name_.ptr(),
435remap_part_item.src_.database_name_.length(),
436remap_part_item.src_.table_name_.ptr(),
437remap_part_item.src_.table_name_.length(),
438remap_part_item.src_.partition_name_.ptr(),
439remap_part_item.src_.partition_name_.length());
440const share::ObImportTableItem target_table_item(remap_part_item.target_.mode_,
441remap_part_item.target_.database_name_.ptr(),
442remap_part_item.target_.database_name_.length(),
443remap_part_item.target_.table_name_.ptr(),
444remap_part_item.target_.table_name_.length());
445if (OB_FAIL(import_table_arg.check_partion_dup(src_part_item, is_dup, dup_item_str))) {
446LOG_WARN("failed to check dup", K(ret));
447} else if (!is_dup) {
448ret = OB_NOT_SUPPORTED;
449LOG_WARN("remap not exist partition", K(src_part_item));
450LOG_USER_ERROR(OB_NOT_SUPPORTED, "remap not exist recover partition");
451} else if (OB_FAIL(import_table_arg.check_table_dup(target_table_item, is_dup, dup_item_str))) {
452LOG_WARN("failed to check dup", K(ret));
453} else if (is_dup) {
454ret = OB_NOT_SUPPORTED;
455LOG_WARN("remap exist partition", K(target_table_item));
456LOG_USER_ERROR(OB_NOT_SUPPORTED, dup_item_str.ptr());
457} else if (OB_FAIL(import_remap_arg.add_remap_parition(remap_part_item))) {
458LOG_WARN("failed to add remap partition", K(ret));
459}
460}
461return ret;
462}
463
464int ObRecoverTableInitiator::fill_remap_tablespace(
465const share::ObImportArg &import_arg,
466share::ObImportRemapArg &import_remap_arg)
467{
468int ret = OB_SUCCESS;
469const share::ObRemapTablespaceArray &remap_tablespace_array = import_arg.get_remap_tablespace_array();
470ARRAY_FOREACH(remap_tablespace_array.get_remap_items(), i) {
471const share::ObRemapTablespaceItem remap_tablespace_item = remap_tablespace_array.get_remap_items().at(i);
472if (OB_FAIL(import_remap_arg.add_remap_tablespace(remap_tablespace_item))) {
473LOG_WARN("failed to add tablespace", K(ret));
474}
475}
476return ret;
477}
478
479int ObRecoverTableInitiator::fill_remap_tablegroup(
480const share::ObImportArg &import_arg,
481share::ObImportRemapArg &import_remap_arg)
482{
483int ret = OB_SUCCESS;
484const share::ObRemapTablegroupArray &remap_tablegroup_array = import_arg.get_remap_tablegroup_array();
485ARRAY_FOREACH(remap_tablegroup_array.get_remap_items(), i) {
486const share::ObRemapTablegroupItem remap_tablegroup_item = remap_tablegroup_array.get_remap_items().at(i);
487if (OB_FAIL(import_remap_arg.add_remap_tablegroup(remap_tablegroup_item))) {
488LOG_WARN("failed to add tablespace", K(ret));
489}
490}
491return ret;
492}
493
494
495int ObRecoverTableInitiator::fill_recover_table_arg_(
496const obrpc::ObRecoverTableArg &arg, share::ObRecoverTableJob &job)
497{
498int ret = OB_SUCCESS;
499share::ObImportTableArg &import_table_arg = job.get_import_arg().get_import_table_arg();
500share::ObImportRemapArg &import_remap_arg = job.get_import_arg().get_remap_table_arg();
501LOG_INFO("succeed fill arg", K(arg), K(import_table_arg), K(import_remap_arg));
502if (arg.import_arg_.get_import_table_arg().is_import_all()) {
503import_table_arg.set_import_all();
504} else if (OB_FAIL(fill_recover_database(arg.import_arg_, import_table_arg))) {
505LOG_WARN("failed to recover database", K(ret), K(arg.import_arg_));
506} else if (OB_FAIL(fill_recover_table(arg.import_arg_, import_table_arg))) {
507LOG_WARN("failed to recover table", K(ret), K(arg.import_arg_));
508} else if (OB_FAIL(fill_recover_partition(arg.import_arg_, import_table_arg))) {
509LOG_WARN("failed to recover partition", K(ret), K(arg.import_arg_));
510} else if (OB_FAIL(fill_remap_database(arg.import_arg_, import_table_arg, import_remap_arg))) {
511LOG_WARN("failed to remap database", K(ret), K(arg.import_arg_));
512} else if (OB_FAIL(fill_remap_table(arg.import_arg_, import_table_arg, import_remap_arg))) {
513LOG_WARN("failed to remap table", K(ret), K(arg.import_arg_));
514} else if (OB_FAIL(fill_remap_partition(arg.import_arg_, import_table_arg, import_remap_arg))) {
515LOG_WARN("failed to remap partition", K(ret), K(arg.import_arg_));
516} else if (OB_FAIL(fill_remap_tablespace(arg.import_arg_, import_remap_arg))) {
517LOG_WARN("failed to remap tablespace", K(ret), K(arg.import_arg_));
518} else if (OB_FAIL(fill_remap_tablegroup(arg.import_arg_, import_remap_arg))) {
519LOG_WARN("failed to remap tablegroup", K(ret), K(arg.import_arg_));
520}
521return ret;
522}