Co-authored-by: nroskill <nroskill@gmail.com> Co-authored-by: akaError <lzg020616@163.com> Co-authored-by: yinyj17 <yinyijun92@gmail.com>
1288 lines
51 KiB
C++
1288 lines
51 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX RS
|
|
#include "ob_backup_clean_task_mgr.h"
|
|
#include "ob_backup_clean_ls_task_mgr.h"
|
|
#include "storage/ls/ob_ls.h"
|
|
#include "storage/backup/ob_backup_data_store.h"
|
|
#include "share/backup/ob_backup_path.h"
|
|
#include "share/backup/ob_backup_struct.h"
|
|
#include "share/backup/ob_backup_clean_struct.h"
|
|
#include "share/backup/ob_backup_clean_operator.h"
|
|
#include "share/backup/ob_archive_persist_helper.h"
|
|
#include "share/backup/ob_backup_clean_util.h"
|
|
#include "lib/utility/utility.h"
|
|
#include "share/backup/ob_backup_io_adapter.h"
|
|
#include "share/backup/ob_archive_path.h"
|
|
#include "share/backup/ob_archive_store.h"
|
|
#include "share/backup/ob_backup_connectivity.h"
|
|
#include "share/ob_debug_sync_point.h"
|
|
#include "lib/utility/ob_tracepoint.h"
|
|
|
|
using namespace oceanbase;
|
|
using namespace rootserver;
|
|
using namespace share;
|
|
|
|
|
|
//****************************ObBackupCleanTaskMgr**********************
|
|
ObBackupCleanTaskMgr::ObBackupCleanTaskMgr()
|
|
: is_inited_(false),
|
|
tenant_id_(OB_INVALID_TENANT_ID),
|
|
backup_set_info_(),
|
|
backup_piece_info_(),
|
|
task_attr_(),
|
|
backup_dest_(),
|
|
job_attr_(nullptr),
|
|
sql_proxy_(nullptr),
|
|
rpc_proxy_(nullptr),
|
|
task_scheduler_(nullptr),
|
|
backup_service_(nullptr)
|
|
{
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::init(
|
|
const uint64_t tenant_id,
|
|
const int64_t task_id,
|
|
ObBackupCleanJobAttr &job_attr,
|
|
common::ObISQLClient &sql_proxy,
|
|
obrpc::ObSrvRpcProxy &rpc_proxy,
|
|
ObBackupTaskScheduler &task_scheduler,
|
|
ObBackupCleanService &backup_service)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (IS_INIT) {
|
|
ret = OB_INIT_TWICE;
|
|
LOG_WARN("init twice", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::get_backup_clean_task(sql_proxy, task_id, job_attr.tenant_id_, false/* need_lock */, task_attr_))) {
|
|
LOG_WARN("failed to get backup task", K(ret), "job_id", job_attr.job_id_, "tenant_id", job_attr.tenant_id_);
|
|
} else if (!task_attr_.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid argument", K(ret), K(task_attr_));
|
|
} else if (task_attr_.is_delete_backup_set_task()) {
|
|
if (OB_FAIL(ObBackupSetFileOperator::get_backup_set_file(sql_proxy, false/* need_lock */, task_attr_.backup_set_id_,
|
|
task_attr_.incarnation_id_, task_attr_.tenant_id_, task_attr_.dest_id_, backup_set_info_))) {
|
|
LOG_WARN("failed to get backup set file", K(ret), K(task_attr_));
|
|
} else if (!backup_set_info_.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid argument", K(ret), K(task_attr_));
|
|
} else if (OB_FAIL(ObBackupStorageInfoOperator::get_backup_dest(sql_proxy, job_attr.tenant_id_, backup_set_info_.backup_path_, backup_dest_))) {
|
|
LOG_WARN("failed to get backup dest", K(ret), K(backup_set_info_));
|
|
}
|
|
} else if (task_attr_.is_delete_backup_piece_task()) {
|
|
ObArchivePersistHelper archive_table_op;
|
|
if (OB_FAIL(archive_table_op.init(job_attr.tenant_id_))) {
|
|
LOG_WARN("failed to init archive piece attr", K(ret));
|
|
} else if (OB_FAIL(archive_table_op.get_piece(sql_proxy, task_attr_.dest_id_, task_attr_.round_id_,
|
|
task_attr_.backup_piece_id_, false/* need_lock */, backup_piece_info_))) {
|
|
LOG_WARN("failed to get backup piece", K(ret), K(task_attr_));
|
|
} else if(!backup_piece_info_.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid argument", K(ret), K(task_attr_));
|
|
} else if (OB_FAIL(ObBackupStorageInfoOperator::get_backup_dest(sql_proxy, job_attr.tenant_id_, backup_piece_info_.path_, backup_dest_))) {
|
|
LOG_WARN("failed to get backup dest", K(ret), K(backup_piece_info_));
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
tenant_id_ = tenant_id;
|
|
job_attr_ = &job_attr;
|
|
sql_proxy_ = &sql_proxy;
|
|
rpc_proxy_ = &rpc_proxy;
|
|
task_scheduler_ = &task_scheduler;
|
|
backup_service_ = &backup_service;
|
|
is_inited_ = true;
|
|
}
|
|
// TODO(wenjinyu.wjy): integrate sql_proxy and lease_service 4.3
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::advance_task_status_(
|
|
common::ObISQLClient &sql_proxy,
|
|
const ObBackupCleanStatus &next_status,
|
|
const int result,
|
|
const int64_t end_ts)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(backup_service_->check_leader())) {
|
|
LOG_WARN("failed to check leader", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::advance_task_status(sql_proxy, task_attr_, next_status, result, end_ts))) {
|
|
LOG_WARN("failed to advance set status", K(ret), K(task_attr_), K(next_status));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::mark_backup_set_files_deleting_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupFileStatus::STATUS file_status = ObBackupFileStatus::STATUS::BACKUP_FILE_DELETING;
|
|
if (!backup_set_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup set info is valid", K(ret));
|
|
} else if (backup_set_info_.file_status_ == file_status) {
|
|
// do nothing
|
|
} else if (OB_FAIL(ObBackupFileStatus::check_can_change_status(backup_set_info_.file_status_, file_status))) {
|
|
LOG_WARN("failed to check can change status", K(ret));
|
|
} else if (FALSE_IT(backup_set_info_.file_status_ = file_status)) {
|
|
} else if (OB_FAIL(ObBackupSetFileOperator::update_backup_set_file_status(*sql_proxy_, backup_set_info_))) {
|
|
LOG_WARN("failed to update backup set file_status", K(ret), K(file_status));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::mark_backup_set_files_deleted_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupFileStatus::STATUS file_status = ObBackupFileStatus::STATUS::BACKUP_FILE_DELETED;
|
|
if (!backup_set_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup set info is valid", K(ret));
|
|
} else if (OB_FAIL(ObBackupFileStatus::check_can_change_status(backup_set_info_.file_status_, file_status))) {
|
|
LOG_WARN("failed to check can change status", K(ret));
|
|
} else if (FALSE_IT(backup_set_info_.file_status_ = file_status)) {
|
|
} else if (OB_FAIL(ObBackupSetFileOperator::update_backup_set_file_status(*sql_proxy_, backup_set_info_))) {
|
|
LOG_WARN("failed to update backup set file", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::mark_backup_piece_files_deleting_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObArchivePersistHelper archive_table_op;
|
|
ObBackupFileStatus::STATUS file_status = ObBackupFileStatus::STATUS::BACKUP_FILE_DELETING;
|
|
if (!backup_piece_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup piece info is valid", K(ret));
|
|
} else if (backup_piece_info_.file_status_ == file_status) {
|
|
// do nothing
|
|
} else if (OB_FAIL(archive_table_op.init(task_attr_.tenant_id_))) {
|
|
LOG_WARN("failed to init archive piece attr", K(ret));
|
|
} else if (OB_FAIL(ObBackupFileStatus::check_can_change_status(backup_piece_info_.file_status_, file_status))) {
|
|
LOG_WARN("failed to check can change status", K(ret));
|
|
} else if (OB_FAIL(archive_table_op.mark_new_piece_file_status(*sql_proxy_, backup_piece_info_.key_.dest_id_,
|
|
backup_piece_info_.key_.round_id_, backup_piece_info_.key_.piece_id_, file_status))) {
|
|
LOG_WARN("failed to update backup piece file status", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::mark_backup_piece_files_deleted_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObArchivePersistHelper archive_table_op;
|
|
ObBackupFileStatus::STATUS file_status = ObBackupFileStatus::STATUS::BACKUP_FILE_DELETED;
|
|
if (!backup_piece_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup piece info is valid", K(ret));
|
|
} else if (OB_FAIL(archive_table_op.init(task_attr_.tenant_id_))) {
|
|
LOG_WARN("failed to init archive piece attr", K(ret));
|
|
} else if (OB_FAIL(ObBackupFileStatus::check_can_change_status(backup_piece_info_.file_status_, file_status))) {
|
|
LOG_WARN("failed to check can change status", K(ret));
|
|
} else if (FALSE_IT(backup_piece_info_.file_status_ = file_status)) {
|
|
} else if (OB_FAIL(archive_table_op.mark_new_piece_file_status(*sql_proxy_, backup_piece_info_.key_.dest_id_,
|
|
backup_piece_info_.key_.round_id_, backup_piece_info_.key_.piece_id_, file_status))) {
|
|
LOG_WARN("failed to update backup piece file status", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::mark_backup_files_deleted_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (task_attr_.is_delete_backup_set_task()) {
|
|
if (OB_FAIL(mark_backup_set_files_deleted_())) {
|
|
LOG_WARN("failed to mark backup set files deleted", K(ret));
|
|
}
|
|
} else if (task_attr_.is_delete_backup_piece_task()) {
|
|
if (OB_FAIL(mark_backup_piece_files_deleted_())) {
|
|
LOG_WARN("failed to mark backup piece files deleted", K(ret));
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::mark_backup_files_deleting_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (task_attr_.is_delete_backup_set_task()) {
|
|
if (OB_FAIL(mark_backup_set_files_deleting_())) {
|
|
LOG_WARN("failed to mark backup set files deleting", K(ret), K_(backup_set_info));
|
|
}
|
|
} else if (task_attr_.is_delete_backup_piece_task()) {
|
|
if (OB_FAIL(mark_backup_piece_files_deleting_())) {
|
|
LOG_WARN("failed to mark backup piece files deleting", K(ret), K_(backup_piece_info));
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
// file:///backup/backup_sets/backup_set_xx_xxx_xxxx_end_xxx.obbak
|
|
int ObBackupCleanTaskMgr::try_delete_extern_set_end_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath end_path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (!backup_set_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup set info is valid", K(ret));
|
|
} else if (OB_SUCCESS == backup_set_info_.result_) {
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_placeholder_end_success_path(
|
|
backup_dest_, desc, backup_set_info_.min_restore_scn_, end_path))) {
|
|
LOG_WARN("failed to get backup set end placeholder path", K(ret));
|
|
}
|
|
} else {
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_placeholder_end_failed_path(
|
|
backup_dest_, desc, backup_set_info_.min_restore_scn_, end_path))) {
|
|
LOG_WARN("failed to get backup set end placeholder path", K(ret));
|
|
}
|
|
}
|
|
if (OB_FAIL(ret)) {
|
|
} else if (OB_FAIL(ObBackupCleanUtil::delete_backup_file(end_path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::try_delete_extern_piece_end_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath end_path;
|
|
if (!backup_piece_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup piece info is invalid", K(ret), K_(backup_piece_info));
|
|
} else if (OB_FAIL(ObArchivePathUtil::get_piece_end_file_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, backup_piece_info_.checkpoint_scn_, end_path))) {
|
|
LOG_WARN("failed to get backup set end placeholder path", K(ret), K_(backup_piece_info));
|
|
} else if (OB_FAIL(ObBackupCleanUtil::delete_backup_file(end_path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K_(task_attr), K(end_path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::try_delete_extern_end_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (task_attr_.is_delete_backup_set_task()) {
|
|
if (OB_FAIL(try_delete_extern_set_end_file_())) {
|
|
LOG_WARN("failed to try delete extern set end file", K(ret));
|
|
}
|
|
} else if (task_attr_.is_delete_backup_piece_task()) {
|
|
if (OB_FAIL(try_delete_extern_piece_end_file_())) {
|
|
LOG_WARN("failed to try delete extern piece end file", K(ret));
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
bool ObBackupCleanTaskMgr::is_can_retry_(const int error)
|
|
{
|
|
return job_attr_->can_retry_ && job_attr_->retry_count_ < OB_MAX_RETRY_TIMES && ObBackupUtils::is_need_retry_error(error);
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::prepare_backup_clean_task_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
#ifdef ERRSIM
|
|
ret = OB_E(EventTable::EN_BACKUP_DELETE_MARK_DELETING) OB_SUCCESS;
|
|
#endif
|
|
if (OB_FAIL(ret)) {
|
|
} else if (OB_FAIL(mark_backup_files_deleting_())) {
|
|
LOG_WARN("failed to mark backup file deleting", K(ret));
|
|
} else if (OB_FAIL(try_delete_extern_end_file_())) {
|
|
LOG_WARN("failed to try delete extern end file", K(ret));
|
|
} else if (OB_FAIL(persist_ls_tasks_())) {
|
|
LOG_WARN("failed to persist log stream task", K(ret), K(task_attr_));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::process()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
FLOG_INFO("[BACKUP_CLEAN]schedule backup clean set task", K(task_attr_));
|
|
|
|
if (IS_NOT_INIT) {
|
|
ret = OB_NOT_INIT;
|
|
LOG_WARN("tenant backup data scheduler not init", K(ret));
|
|
} else {
|
|
ObBackupCleanStatus::Status status = task_attr_.status_.status_;
|
|
switch (status) {
|
|
case ObBackupCleanStatus::Status::INIT: {
|
|
if (OB_FAIL(prepare_backup_clean_task_())) {
|
|
LOG_WARN("failed to persist backup clean ls task", K(ret), K(task_attr_));
|
|
}
|
|
break;
|
|
}
|
|
case ObBackupCleanStatus::Status::DOING: {
|
|
DEBUG_SYNC(BACKUP_DELETE_TASK_STATUS_DOING);
|
|
if (OB_FAIL(backup_clean_ls_tasks_())) {
|
|
LOG_WARN("failed to backup clean ls task", K(ret), K(task_attr_));
|
|
}
|
|
break;
|
|
}
|
|
case ObBackupCleanStatus::Status::COMPLETED:
|
|
case ObBackupCleanStatus::Status::FAILED:
|
|
case ObBackupCleanStatus::Status::CANCELED: {
|
|
if (OB_FAIL(do_cleanup())) {
|
|
LOG_WARN("failed to move history", K(ret), K(task_attr_));
|
|
}
|
|
break;
|
|
}
|
|
case ObBackupCleanStatus::Status::CANCELING: {
|
|
if (OB_FAIL(do_cancel_())) {
|
|
LOG_WARN("failed to cancel backup", K(ret), K(task_attr_));
|
|
}
|
|
break;
|
|
}
|
|
default: {
|
|
ret = OB_ERR_SYS;
|
|
LOG_ERROR("unknown backup clean status", K(ret), K(task_attr_));
|
|
}
|
|
}
|
|
if (OB_FAIL(ret) && !is_can_retry_(ret)) {
|
|
if (ObBackupCleanStatus::Status::INIT == task_attr_.status_.status_
|
|
|| ObBackupCleanStatus::Status::DOING == task_attr_.status_.status_) {
|
|
int tmp_ret = OB_SUCCESS;
|
|
if (OB_SUCCESS != (tmp_ret = deal_failed_task(ret))) {
|
|
LOG_WARN("failed to advance task status", K(tmp_ret), K(ret), K(task_attr_.status_));
|
|
}
|
|
ret = (OB_SUCCESS != tmp_ret) ? tmp_ret : ret;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::persist_ls_tasks_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObArray<ObLSID> ls_ids;
|
|
ObBackupCleanStatus next_status;
|
|
ObMySQLTransaction trans;
|
|
next_status.status_ = ObBackupCleanStatus::Status::DOING;
|
|
if (OB_FAIL(get_ls_ids_(ls_ids))) {
|
|
LOG_WARN("failed to get ls ids", K(ret));
|
|
} else if (OB_FAIL(trans.start(sql_proxy_, gen_meta_tenant_id(tenant_id_)))) {
|
|
LOG_WARN("failed to start trans", K(ret));
|
|
} else {
|
|
if (0 != ls_ids.count()) {
|
|
ObBackupCleanLSTaskAttr new_ls_attr;
|
|
for (int i = 0; OB_SUCC(ret) && i < ls_ids.count(); ++i) {
|
|
const ObLSID &ls_id = ls_ids.at(i);
|
|
new_ls_attr.reset();
|
|
if (OB_FAIL(generate_ls_task_(ls_id, new_ls_attr))) {
|
|
LOG_WARN("failed to generate log stream tasks", K(ret), K(ls_ids));
|
|
} else if (OB_FAIL(backup_service_->check_leader())) {
|
|
LOG_WARN("failed to check leader", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanLSTaskOperator::insert_ls_task(trans, new_ls_attr))) {
|
|
LOG_WARN("failed to insert backup log stream task", K(ret), K(new_ls_attr));
|
|
}
|
|
}
|
|
}
|
|
if (OB_FAIL(ret)) {
|
|
} else if (FALSE_IT(task_attr_.total_ls_count_ = ls_ids.count())) {
|
|
} else if (OB_FAIL(advance_task_status_(trans, next_status, task_attr_.result_, task_attr_.end_ts_))) {
|
|
LOG_WARN("failed to advance status to DOING", K(ret), K(ls_ids));
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::update_ls_count(trans, task_attr_, true/*is_total*/))) {
|
|
LOG_WARN("failed to update ls task count", K(ret), K(task_attr_.total_ls_count_), K(ls_ids));
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
if (OB_FAIL(trans.end(true))) {
|
|
LOG_WARN("failed to commit trans", K(ret));
|
|
}
|
|
} else {
|
|
int tmp_ret = OB_SUCCESS;
|
|
if (OB_SUCCESS != (tmp_ret = trans.end(false))) {
|
|
LOG_WARN("failed to roll back status", K(ret), K(tmp_ret));
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::get_set_ls_ids_from_traverse_(ObIArray<ObLSID> &ls_ids)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = task_attr_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_dir_path(
|
|
backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get tenant data backup set dir path", K(ret), K_(backup_set_info));
|
|
} else if (OB_FAIL(get_ls_ids_from_traverse_(path, ls_ids))) {
|
|
LOG_WARN("failed to get set ls ids from traverse", K(ret), K(path));
|
|
} else {
|
|
LOG_INFO("[BACKUP_CLEAN]success get set ls ids from traverse", K(path), K(ls_ids));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::get_set_ls_ids_(ObIArray<ObLSID> &ls_ids)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupDataStore store;
|
|
share::ObBackupSetDesc desc;
|
|
ObBackupDataLSAttrDesc ls_attr;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(store.init(backup_dest_, desc))) {
|
|
LOG_WARN("faield to init backup data extern mgr", K(ret));
|
|
} else if (OB_FAIL(store.read_ls_attr_info(ls_attr))) {
|
|
if (OB_BACKUP_FILE_NOT_EXIST == ret) {
|
|
if (OB_FAIL(get_set_ls_ids_from_traverse_(ls_ids))) {
|
|
LOG_WARN("failed to get set ls ids from traverse", K(ret));
|
|
}
|
|
} else {
|
|
LOG_WARN("failed to read log stream info", K(ret));
|
|
}
|
|
} else if (!ls_attr.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid ls info", K(ret), K(ls_attr));
|
|
} else {
|
|
for (int i = 0; OB_SUCC(ret) && i < ls_attr.ls_attr_array_.count(); ++i) {
|
|
const ObLSID &ls_id = ls_attr.ls_attr_array_.at(i).get_ls_id();
|
|
if (!ls_id.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid ls info", K(ret), K(ls_id));
|
|
} else if (OB_FAIL(ls_ids.push_back(ls_id))) {
|
|
LOG_WARN("failed to push back ls_id", K(ret), K(ls_id));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::get_piece_ls_ids_from_traverse_(ObIArray<ObLSID> &ls_ids)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_piece_dir_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, path))) {
|
|
LOG_WARN("failed to get piece dir path", K(ret), K_(backup_piece_info));
|
|
} else if (OB_FAIL(get_ls_ids_from_traverse_(path, ls_ids))) {
|
|
LOG_WARN("failed to get ls ids from traverse", K(ret), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::get_piece_ls_ids_(ObIArray<ObLSID> &ls_ids)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObArchiveStore store;
|
|
ObPieceInfoDesc desc;
|
|
if (OB_FAIL(store.init(backup_dest_))) {
|
|
LOG_WARN("failed to init store", K(ret), K_(task_attr));
|
|
} else if (OB_FAIL(store.read_piece_info(backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, desc))) {
|
|
if (OB_BACKUP_FILE_NOT_EXIST == ret) {
|
|
if (OB_FAIL(get_piece_ls_ids_from_traverse_(ls_ids))) {
|
|
LOG_WARN("failed to get piece ls ids from traverse", K(ret));
|
|
}
|
|
} else {
|
|
LOG_WARN("failed to read piece info", K(ret), K_(task_attr), K(backup_piece_info_));
|
|
}
|
|
} else if (!desc.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid ls info", K(ret), K(desc));
|
|
} else {
|
|
for (int i = 0; OB_SUCC(ret) && i < desc.filelist_.count(); ++i) {
|
|
const ObLSID &ls_id = desc.filelist_.at(i).ls_id_;
|
|
if (!ls_id.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid ls info", K(ret), K(ls_id));
|
|
} else if (OB_FAIL(ls_ids.push_back(ls_id))) {
|
|
LOG_WARN("failed to push back ls_id", K(ret), K(ls_id));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::get_ls_ids_(ObIArray<ObLSID> &ls_ids)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (task_attr_.is_delete_backup_set_task()) {
|
|
if (OB_FAIL(get_set_ls_ids_(ls_ids))) {
|
|
LOG_WARN("failed to get set ls ids", K(ret), K_(task_attr), K_(backup_set_info));
|
|
}
|
|
} else if (task_attr_.is_delete_backup_piece_task()) {
|
|
if (OB_FAIL(get_piece_ls_ids_(ls_ids))) {
|
|
LOG_WARN("failed to piece ls ids", K(ret), K_(task_attr), K_(backup_piece_info));
|
|
}
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("clean task type is invalid", K(ret), K_(task_attr));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::parse_int_(const char *str, int64_t &val)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
bool is_valid = true;
|
|
val = 0;
|
|
if (OB_ISNULL(str)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), KP(str));
|
|
} else {
|
|
char *p_end = NULL;
|
|
if ('\0' == str[0]) {
|
|
is_valid = false;
|
|
} else if (OB_FAIL(ob_strtoll(str, p_end, val))) {
|
|
LOG_WARN("failed to get value from string", K(ret), K(str));
|
|
} else if ('\0' == *p_end) {
|
|
is_valid = true;
|
|
} else {
|
|
is_valid = false;
|
|
LOG_WARN("set int error", K(str), K(is_valid));
|
|
}
|
|
|
|
if (!is_valid) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid int str", K(ret), K(str));
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::parse_ls_id_(const char *dir_name, int64_t &id_val)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
id_val = 0;
|
|
const char *LOGSTREAM = "logstream";
|
|
char *token = NULL;
|
|
char *saved_ptr = NULL;
|
|
char tmp_name[OB_MAX_URI_LENGTH] = { 0 };
|
|
if (OB_ISNULL(dir_name)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), KP(dir_name));
|
|
} else if (OB_FAIL(databuff_printf(tmp_name, sizeof(tmp_name), "%s", dir_name))) {
|
|
LOG_WARN("failed to set dir name", K(ret), KP(dir_name));
|
|
} else {
|
|
token = tmp_name;
|
|
for (char *str = token; OB_SUCC(ret); str = NULL) {
|
|
token = ::strtok_r(str, "_", &saved_ptr);
|
|
if (NULL == token) {
|
|
break;
|
|
} else if (0 == strncmp(LOGSTREAM, token, strlen(LOGSTREAM))) {
|
|
continue;
|
|
} else if (OB_FAIL(parse_int_(token, id_val))){
|
|
LOG_WARN("invalid number", K(token), K(id_val));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::get_ls_ids_from_traverse_(const ObBackupPath &path, ObIArray<ObLSID> &ls_ids)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupIoAdapter util;
|
|
ObArray<ObIODirentEntry> d_entrys;
|
|
ObDirPrefixEntryNameFilter prefix_op(d_entrys);
|
|
char logstream_prefix[OB_BACKUP_DIR_PREFIX_LENGTH] = { 0 };
|
|
if (OB_FAIL(databuff_printf(logstream_prefix, sizeof(logstream_prefix), "%s", "logstream_"))) {
|
|
LOG_WARN("failed to set log stream prefix", K(ret));
|
|
} else if (OB_FAIL(prefix_op.init(logstream_prefix, strlen(logstream_prefix)))) {
|
|
LOG_WARN("failed to init dir prefix", K(ret), K(logstream_prefix));
|
|
// TODO(wenjinyu.wjy) iterate dir sequentially 4.3
|
|
} else if (OB_FAIL(util.list_directories(path.get_obstr(), backup_dest_.get_storage_info(), prefix_op))) {
|
|
LOG_WARN("failed to list files", K(ret));
|
|
} else {
|
|
ObIODirentEntry tmp_entry;
|
|
ObLSID ls_id;
|
|
for (int64_t i = 0; OB_SUCC(ret) && i < d_entrys.count(); ++i) {
|
|
int64_t id_val = 0;
|
|
tmp_entry = d_entrys.at(i);
|
|
if (OB_ISNULL(tmp_entry.name_)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("file name is null", K(ret));
|
|
} else if (OB_FAIL(parse_ls_id_(tmp_entry.name_, id_val))) {
|
|
LOG_WARN("failed to parse ls id", K(ret));
|
|
} else if (FALSE_IT(ls_id = id_val)) {
|
|
} else if (OB_FAIL(ls_ids.push_back(ls_id))) {
|
|
LOG_WARN("failed to push back ls_ids", K(ret));
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
int ObBackupCleanTaskMgr::generate_ls_task_(const share::ObLSID &ls_id, share::ObBackupCleanLSTaskAttr &new_ls_attr)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (!ls_id.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("ls id is invalid", K(ret), K(ls_id));
|
|
} else {
|
|
new_ls_attr.task_id_ = task_attr_.task_id_;
|
|
new_ls_attr.tenant_id_ = task_attr_.tenant_id_;
|
|
new_ls_attr.ls_id_ = ls_id;
|
|
new_ls_attr.job_id_ = task_attr_.job_id_;
|
|
new_ls_attr.backup_set_id_ = task_attr_.backup_set_id_;
|
|
new_ls_attr.backup_piece_id_ = task_attr_.backup_piece_id_;
|
|
new_ls_attr.round_id_ = backup_piece_info_.key_.round_id_ != 0 ? backup_piece_info_.key_.round_id_ : 0;
|
|
new_ls_attr.task_type_ = task_attr_.task_type_;
|
|
new_ls_attr.status_.status_ = ObBackupTaskStatus::Status::INIT;
|
|
const int64_t current_time = ObTimeUtility::current_time();
|
|
new_ls_attr.start_ts_ = current_time;
|
|
new_ls_attr.end_ts_ = 0;
|
|
new_ls_attr.result_ = OB_SUCCESS;
|
|
}
|
|
return ret;
|
|
}
|
|
// file:///obbackup/backup_set_1_full/infos/locality_info.obbak
|
|
int ObBackupCleanTaskMgr::delete_tenant_locality_info_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_locality_info_path(backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get tenant locality path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/infos/diagnose_info.obbak
|
|
int ObBackupCleanTaskMgr::delete_tenant_diagnose_info_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_diagnose_info_path(backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get tenant locality path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/infos/meta_info/
|
|
int ObBackupCleanTaskMgr::delete_meta_info_dir_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_tenant_meta_info_dir_path(backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get tenant locality path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_dir_files(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/infos/major_data_info_turn_X/
|
|
int ObBackupCleanTaskMgr::delete_major_data_info_dir_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
share::ObBackupDataType backup_data_type;
|
|
backup_data_type.set_major_data_backup();
|
|
if (OB_FAIL(ObBackupPathUtil::get_ls_info_data_info_dir_path(backup_dest_, desc, backup_data_type,
|
|
backup_set_info_.major_turn_id_, path))) {
|
|
LOG_WARN("failed to get ls info data info", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_dir_files(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/infos/minor_data_info_turn_X/
|
|
int ObBackupCleanTaskMgr::delete_minor_data_info_dir_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
share::ObBackupDataType backup_data_type;
|
|
backup_data_type.set_minor_data_backup();
|
|
if (OB_FAIL(ObBackupPathUtil::get_ls_info_data_info_dir_path(backup_dest_, desc,
|
|
backup_data_type, backup_set_info_.minor_turn_id_, path))) {
|
|
LOG_WARN("failed to get ls info data info path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_dir_files(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/single_backup_set_info.obbak
|
|
int ObBackupCleanTaskMgr::delete_single_backup_set_info_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_info_path(backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get tenant locality path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::delete_data_info_turn_files_(const ObBackupPath &infos_path)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupIoAdapter util;
|
|
ObArray<ObIODirentEntry> d_entrys;
|
|
const char info_turn_prefix[OB_BACKUP_DIR_PREFIX_LENGTH] = "data_info_turn_";
|
|
ObDirPrefixEntryNameFilter prefix_op(d_entrys);
|
|
if (OB_FAIL(prefix_op.init(info_turn_prefix, strlen(info_turn_prefix)))) {
|
|
LOG_WARN("failed to init dir prefix", K(ret), K(info_turn_prefix));
|
|
// TODO(wenjinyu.wjy) iterate dir sequentially 4.3
|
|
} else if (OB_FAIL(util.list_directories(infos_path.get_obstr(), backup_dest_.get_storage_info(), prefix_op))) {
|
|
LOG_WARN("failed to list directories", K(ret));
|
|
} else {
|
|
ObIODirentEntry tmp_entry;
|
|
ObBackupPath info_path;
|
|
for (int64_t i = 0; OB_SUCC(ret) && i < d_entrys.count(); ++i) {
|
|
ObIODirentEntry tmp_entry = d_entrys.at(i);
|
|
info_path.reset();
|
|
if (OB_ISNULL(tmp_entry.name_)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("file name is null", K(ret));
|
|
} else if (OB_FAIL(info_path.init(infos_path.get_ptr()))) {
|
|
LOG_WARN("failed to init major path", K(ret), K(info_path));
|
|
} else if (OB_FAIL(info_path.join(tmp_entry.name_, ObBackupFileSuffix::NONE))) {
|
|
LOG_WARN("failed to join major path", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanUtil::delete_backup_dir_files(info_path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup log stream dir files", K(ret), K(info_path));
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::delete_backup_dir_(const share::ObBackupPath &path)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(ObBackupCleanUtil::delete_backup_dir_files(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete info turn files", K(ret), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/
|
|
int ObBackupCleanTaskMgr::delete_backup_set_dir_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath set_path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_dir_path(backup_dest_, desc, set_path))) {
|
|
LOG_WARN("failed to get tenant data backup set dir", K(ret), K_(backup_dest), K_(task_attr));
|
|
} else if (OB_FAIL(delete_backup_dir_(set_path))) {
|
|
LOG_WARN("failed to delete backup dir", K(ret), K(set_path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///backup/backup_sets/backup_set_xx_xxx_start
|
|
int ObBackupCleanTaskMgr::delete_backup_set_start_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath start_path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_placeholder_start_path(backup_dest_, desc, start_path))) {
|
|
LOG_WARN("failed to get backup set end placeholder path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(start_path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(start_path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// file:///obbackup/backup_set_1_full/backup_set_1_full_xxxx_xxxxx
|
|
int ObBackupCleanTaskMgr::delete_backup_set_inner_placeholder_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
char placeholder_prefix[OB_MAX_BACKUP_CHECK_FILE_NAME_LENGTH] = { 0 };
|
|
ObBackupIoAdapter util;
|
|
ObBackupPrefixDeleteFileOp prefix_delete_op;
|
|
if (OB_FAIL(ObBackupPathUtil::get_backup_set_dir_path(backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get tenant data backup set dir", K(ret), K_(backup_dest));
|
|
} else if (OB_FAIL(ObBackupPathUtil::get_backup_set_inner_placeholder_prefix(desc, placeholder_prefix, sizeof(placeholder_prefix)))) {
|
|
LOG_WARN("failed to get backup set inner placeholder prefix", K(ret));
|
|
} else if (OB_FAIL(prefix_delete_op.init(placeholder_prefix, strlen(placeholder_prefix), path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to init prefix delete", K(ret), K(placeholder_prefix));
|
|
} else if (OB_FAIL(util.list_files(path.get_obstr(), backup_dest_.get_storage_info(), prefix_delete_op))) {
|
|
LOG_WARN("failed to list files", K(ret), K(path), K(placeholder_prefix));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://backup/backup_set_xx_xxx_xxxxx/infos/tenant_backup_set_infos
|
|
int ObBackupCleanTaskMgr::delete_tenant_backup_set_infos_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (OB_FAIL(ObBackupPathUtil::get_tenant_backup_set_infos_path(backup_dest_, desc, path))) {
|
|
LOG_WARN("failed to get backup set end placeholder path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::delete_backup_set_meta_info_files_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath infos_path;
|
|
ObBackupSetDesc desc;
|
|
desc.backup_set_id_ = backup_set_info_.backup_set_id_;
|
|
desc.backup_type_ = backup_set_info_.backup_type_;
|
|
if (!backup_set_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup set info is valid", K(ret));
|
|
} else if (OB_FAIL(delete_meta_info_dir_())) { // first deleted meta file on infos dir
|
|
LOG_WARN("failed to delete ls attr info file", K(ret));
|
|
} else if (OB_FAIL(delete_major_data_info_dir_())) {
|
|
LOG_WARN("failed to delete major data info file", K(ret));
|
|
} else if (OB_FAIL(delete_minor_data_info_dir_())) {
|
|
LOG_WARN("failed to delete minor data info file", K(ret));
|
|
} else if (OB_FAIL(ObBackupPathUtil::get_ls_info_dir_path(backup_dest_, desc, infos_path))) {
|
|
LOG_WARN("failed to get backup log stream info path", K(ret));
|
|
} else if (OB_FAIL(delete_data_info_turn_files_(infos_path))) {
|
|
LOG_WARN("failed to delete tenant info turn ", K(ret));
|
|
} else if (OB_FAIL(delete_tenant_locality_info_())) {
|
|
LOG_WARN("failed to delete tenant locality info", K(ret));
|
|
} else if (OB_FAIL(delete_tenant_diagnose_info_())) {
|
|
LOG_WARN("failed to delete tenant diagnose info", K(ret));
|
|
} else if (OB_FAIL(delete_backup_dir_(infos_path))) {
|
|
LOG_WARN("failed to delete backup infos dir", K(ret));
|
|
} else if (OB_FAIL(delete_single_backup_set_info_())) {
|
|
LOG_WARN("failed to delete backup set file", K(ret));
|
|
} else if (OB_FAIL(delete_tenant_backup_set_infos_())) {
|
|
LOG_WARN("failed to delete tenant backup set infos", K(ret));
|
|
} else if (OB_FAIL(delete_backup_set_inner_placeholder_())) {
|
|
LOG_WARN("failed to delete backup set inner placeholder", K(ret));
|
|
} else if (OB_FAIL(delete_backup_set_dir_())) {
|
|
LOG_WARN("failed to delete backup set dir", K(ret));
|
|
} else if (OB_FAIL(delete_backup_set_start_file_())) {
|
|
LOG_WARN("failed to delete backup set start file", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://archive/pieces/piece_[dest_id]_[round_id]_[piece_id]_[create_timestamp]_start
|
|
int ObBackupCleanTaskMgr::delete_backup_piece_start_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_piece_start_file_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, backup_piece_info_.start_scn_, path))) {
|
|
LOG_WARN("failed to get piece start file path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://archive/[dest_id]_[round_id]_[piece_id]/single_piece_info.obarc
|
|
int ObBackupCleanTaskMgr::delete_single_piece_info_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_single_piece_file_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, path))) {
|
|
LOG_WARN("failed to get single piece file path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://archive/piece_d[dest_id]r[round_id]p[piece_id]/tenant_archive_piece_infos.obarc
|
|
int ObBackupCleanTaskMgr::delete_tenant_archive_piece_infos()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_tenant_archive_piece_infos_file_path(backup_dest_, backup_piece_info_.key_.dest_id_,
|
|
backup_piece_info_.key_.round_id_, backup_piece_info_.key_.piece_id_, path))) {
|
|
LOG_WARN("failed to get tenant archive piece infos path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://archive/[dest_id]_[round_id]_[piece_id]/file_info.obarc
|
|
int ObBackupCleanTaskMgr::delete_piece_info_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_piece_info_file_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, path))) {
|
|
LOG_WARN("failed to get piece info file path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://archive/[dest_id]_[round_id]_[piece_id]/piece_[dest_id]_[round_id]_[piece_id]_[start_ts]_[end_ts]
|
|
int ObBackupCleanTaskMgr::delete_piece_inner_placeholder_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_piece_inner_placeholder_file_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, backup_piece_info_.start_scn_, backup_piece_info_.checkpoint_scn_, path))) {
|
|
LOG_WARN("failed to get piece inner placeholder file path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_file(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// oss://archive/[dest_id]_[round_id]_[piece_id]/checkpoint
|
|
int ObBackupCleanTaskMgr::delete_piece_checkpoint_file_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (OB_FAIL(ObArchivePathUtil::get_piece_checkpoint_dir_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, path))) {
|
|
LOG_WARN("failed to get piece checkpoint dir path", K(ret));
|
|
} else if (OB_FAIL(share::ObBackupCleanUtil::delete_backup_dir_files(path, backup_dest_.get_storage_info()))) {
|
|
LOG_WARN("failed to delete backup file", K(ret), K(task_attr_), K(path));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::delete_backup_piece_meta_info_files_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObBackupPath path;
|
|
if (!backup_piece_info_.is_valid()) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("backup piece info is valid", K(ret));
|
|
} else if (OB_FAIL(delete_single_piece_info_())) {
|
|
LOG_WARN("failed to delete single piece info file", K(ret), K(backup_piece_info_));
|
|
} else if (OB_FAIL(delete_piece_info_file_())) {
|
|
LOG_WARN("failed to delete info file", K(ret), K(backup_piece_info_));
|
|
} else if (OB_FAIL(delete_tenant_archive_piece_infos())) {
|
|
LOG_WARN("failed to delete info file", K(ret), K(backup_piece_info_));
|
|
} else if (OB_FAIL(delete_piece_inner_placeholder_file_())) {
|
|
LOG_WARN("failed to delete piece inner placeholder file", K(ret), K(backup_piece_info_));
|
|
} else if (OB_FAIL(delete_piece_checkpoint_file_())) {
|
|
LOG_WARN("failed to delete checkpoint file", K(ret), K(backup_piece_info_));
|
|
} else if (OB_FAIL(ObArchivePathUtil::get_piece_dir_path(
|
|
backup_dest_, backup_piece_info_.key_.dest_id_, backup_piece_info_.key_.round_id_,
|
|
backup_piece_info_.key_.piece_id_, path))) {
|
|
LOG_WARN("failed to get tenant backup piece dir path", K(ret));
|
|
} else if (OB_FAIL(delete_backup_dir_(path))) {
|
|
LOG_WARN("failed to delete backup infos dir", K(ret));
|
|
} else if (OB_FAIL(delete_backup_piece_start_file_())) {
|
|
LOG_WARN("failed to delete backup set start file", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::delete_backup_meta_info_files_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (task_attr_.is_delete_backup_set_task()) {
|
|
if (OB_FAIL(delete_backup_set_meta_info_files_())) {
|
|
LOG_WARN("failed to delete set meta info files", K(ret));
|
|
}
|
|
} else if (task_attr_.is_delete_backup_piece_task()) {
|
|
if (OB_FAIL(delete_backup_piece_meta_info_files_())) {
|
|
LOG_WARN("failed to delete piece meta info files", K(ret));
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::backup_clean_ls_tasks_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObArray<ObBackupCleanLSTaskAttr> ls_tasks;
|
|
int64_t finish_cnt = 0;
|
|
bool need_do_ls_task = true;
|
|
int tmp_ret = OB_SUCCESS;
|
|
ObBackupCleanStatus next_status;
|
|
if (OB_FAIL(ObBackupCleanLSTaskOperator::get_ls_tasks_from_task_id(*sql_proxy_, task_attr_.task_id_, task_attr_.tenant_id_, false/*update*/, ls_tasks))) {
|
|
LOG_WARN("failed to get log stream tasks", K(ret));
|
|
} else if (ls_tasks.count() != task_attr_.total_ls_count_) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("ls task count error", K(ret), K(ls_tasks.count()), K(task_attr_.total_ls_count_));
|
|
} else if (ls_tasks.empty() && task_attr_.total_ls_count_ == 0) {
|
|
// do nothing, allow no log stream tasks
|
|
} else if (OB_FAIL(do_backup_clean_ls_tasks_(ls_tasks, finish_cnt))) {
|
|
LOG_WARN("failed to do backup ls task", K(ret), K_(task_attr));
|
|
}
|
|
if (OB_FAIL(ret)) {
|
|
} else if (ls_tasks.count() == finish_cnt) {
|
|
if (OB_FAIL(delete_backup_meta_info_files_())) {
|
|
LOG_WARN("failed to delete meta info files ", K(ret));
|
|
} else if (OB_FAIL(mark_backup_files_deleted_())) {
|
|
LOG_WARN("failed to mark backup files deleted", K(ret));
|
|
}
|
|
|
|
if (OB_FAIL(ret)) {
|
|
} else {
|
|
task_attr_.end_ts_ = ObTimeUtil::current_time();
|
|
task_attr_.status_.status_ = ObBackupCleanStatus::Status::COMPLETED;
|
|
if (OB_FAIL(advance_task_status_(*sql_proxy_, task_attr_.status_, OB_SUCCESS, task_attr_.end_ts_))) {
|
|
LOG_WARN("failed to advance task status", K(ret), K_(task_attr));
|
|
}
|
|
}
|
|
}
|
|
task_attr_.finish_ls_count_ = finish_cnt;
|
|
if (OB_FAIL(ret)) {
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::update_ls_count(*sql_proxy_, task_attr_, false/*is_total*/))) {
|
|
LOG_WARN("failed to update finish ls count", K(ret), K_(task_attr));
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::do_backup_clean_ls_tasks_(
|
|
ObArray<ObBackupCleanLSTaskAttr> &ls_tasks,
|
|
int64_t &finish_cnt)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
finish_cnt = 0;
|
|
int retry_count = 0;
|
|
if (ls_tasks.empty()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid argument", K(ret), K(ls_tasks));
|
|
} else {
|
|
for (int i = 0; OB_SUCC(ret) && i < ls_tasks.count(); ++i) {
|
|
ObBackupCleanLSTaskAttr &ls_attr = ls_tasks.at(i);
|
|
ObBackupCleanLSTaskMgr ls_task_mgr;
|
|
#ifdef ERRSIM
|
|
const int64_t OB_ERRSIM_BACKUP_MAX_RETRY_TIMES = 4;
|
|
if (ls_attr.retry_id_ >= OB_ERRSIM_BACKUP_MAX_RETRY_TIMES && OB_SUCCESS != ls_attr.result_) {
|
|
#else
|
|
if (ls_attr.retry_id_ >= OB_BACKUP_MAX_RETRY_TIMES && OB_SUCCESS != ls_attr.result_) {
|
|
#endif
|
|
job_attr_->can_retry_ = false;
|
|
ret = ls_attr.result_;
|
|
LOG_WARN("retry times exceeds the limit", K(ret), K(ls_attr.retry_id_), K(ls_attr.ls_id_), K(task_attr_), K(job_attr_->can_retry_));
|
|
} else if (OB_FAIL(ls_task_mgr.init(task_attr_, ls_attr, *task_scheduler_, *sql_proxy_, *backup_service_))) {
|
|
LOG_WARN("failed to init task advancer", K(ret), K(ls_attr));
|
|
} else if (OB_FAIL(ls_task_mgr.process(finish_cnt))) {
|
|
LOG_WARN("failed to process log stream task", K(ret));
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::deal_failed_task(const int error)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObArray<ObBackupCleanLSTaskAttr> ls_tasks;
|
|
int result = OB_SUCCESS;
|
|
ObMySQLTransaction trans;
|
|
int64_t success_ls_count = 0;
|
|
const bool for_update = true;
|
|
if (IS_NOT_INIT) {
|
|
ret = OB_NOT_INIT;
|
|
LOG_WARN("ObBackupCleanTaskMgr not init", K(ret));
|
|
} else if (OB_FAIL(trans.start(sql_proxy_, gen_meta_tenant_id(tenant_id_)))) {
|
|
LOG_WARN("failed to start trans", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanLSTaskOperator::get_ls_tasks_from_task_id(trans,
|
|
task_attr_.task_id_, task_attr_.tenant_id_, for_update, ls_tasks))) {
|
|
LOG_WARN("failed to get log stream tasks", K(ret));
|
|
} else {
|
|
if (OB_FAIL(do_failed_ls_task_(trans, ls_tasks, success_ls_count, result))) {
|
|
LOG_WARN("failed to do failed backup task", K(ret), K(ls_tasks));
|
|
}
|
|
result = (OB_SUCCESS == result) ? error : result;
|
|
if (OB_SUCC(ret)) {
|
|
ObBackupCleanStatus next_status;
|
|
if (OB_SUCCESS == result) {
|
|
next_status.status_ = ObBackupCleanStatus::Status::CANCELED;
|
|
result = OB_CANCELED;
|
|
} else {
|
|
next_status.status_ = ObBackupCleanStatus::Status::FAILED;
|
|
}
|
|
int64_t end_ts = ObTimeUtil::current_time();
|
|
task_attr_.finish_ls_count_ = success_ls_count;
|
|
if (OB_FAIL(advance_task_status_(trans, next_status, result, end_ts))) {
|
|
LOG_WARN("failed to advance task status to finish", K(ret), K_(task_attr));
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::update_ls_count(trans, task_attr_, false/*is_total*/))) {
|
|
LOG_WARN("failed to update finish ls count", K(ret), K_(task_attr));
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
if (OB_FAIL(trans.end(true))) {
|
|
LOG_WARN("failed to commit trans", K(ret));
|
|
}
|
|
} else {
|
|
int tmp_ret = OB_SUCCESS;
|
|
if (OB_SUCCESS != (tmp_ret = trans.end(false))) {
|
|
LOG_WARN("failed to roll back status", K(ret), K(tmp_ret));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::do_failed_ls_task_(
|
|
common::ObISQLClient &sql_proxy,
|
|
ObIArray<ObBackupCleanLSTaskAttr> &ls_tasks,
|
|
int64_t &success_ls_count,
|
|
int &result)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t finish_cnt = 0;
|
|
ObBackupTaskStatus next_status;
|
|
next_status.status_ = ObBackupTaskStatus::Status::FINISH;
|
|
result = OB_SUCCESS;
|
|
if (ls_tasks.empty()) {
|
|
LOG_INFO("ls tasks is empty", K(ls_tasks));
|
|
// do nothing
|
|
} else {
|
|
for (int i = 0; OB_SUCC(ret) && i < ls_tasks.count(); ++i) {
|
|
ObBackupCleanLSTaskAttr &ls_attr = ls_tasks.at(i);
|
|
ObBackupCleanLSTaskMgr ls_task_mgr;
|
|
if (ObBackupTaskStatus::Status::FINISH == ls_attr.status_.status_) {
|
|
if (OB_SUCCESS == ls_attr.result_) {
|
|
success_ls_count++;
|
|
} else if (OB_SUCCESS == result) {
|
|
result = ls_attr.result_;
|
|
}
|
|
} else if (OB_FAIL(ls_task_mgr.init(task_attr_, ls_attr, *task_scheduler_, sql_proxy, *backup_service_))) {
|
|
LOG_WARN("failed to init task mgr", K(ret), K(ls_attr));
|
|
} else if (OB_FAIL(ls_task_mgr.cancel(finish_cnt))) {
|
|
LOG_WARN("failed to cancel task", K(ret));
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::do_cleanup()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (IS_NOT_INIT) {
|
|
ret = OB_NOT_INIT;
|
|
LOG_WARN("ObBackupCleanTaskMgr not init", K(ret));
|
|
} else if (OB_FAIL(move_task_to_history_())) {
|
|
LOG_WARN("failed to move task to his", K(ret), K_(task_attr));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::move_task_to_history_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(backup_service_->check_leader())) {
|
|
LOG_WARN("failed to check leader", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanLSTaskOperator::move_ls_to_his(*sql_proxy_, task_attr_.tenant_id_, task_attr_.task_id_))) {
|
|
LOG_WARN("failed to move ls task to history", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::move_task_to_history(*sql_proxy_, task_attr_.tenant_id_, task_attr_.task_id_))) {
|
|
LOG_WARN("failed to move task to history", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObBackupCleanTaskMgr::do_cancel_()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t finish_cnt = 0;
|
|
int64_t success_ls_count = 0;
|
|
ObArray<ObBackupCleanLSTaskAttr> ls_task;
|
|
ObMySQLTransaction trans;
|
|
const bool for_update = true;
|
|
if (OB_FAIL(trans.start(sql_proxy_, gen_meta_tenant_id(tenant_id_)))) {
|
|
LOG_WARN("failed to start trans", K(ret));
|
|
} else {
|
|
if (OB_FAIL(ObBackupCleanLSTaskOperator::get_ls_tasks_from_task_id(trans, task_attr_.task_id_, job_attr_->tenant_id_, for_update, ls_task))) {
|
|
LOG_WARN("failed to get log stream tasks", K(ret));
|
|
} else if (ls_task.empty()) {
|
|
// do nothing
|
|
} else {
|
|
for (int i = 0; OB_SUCC(ret) && i < ls_task.count(); ++i) {
|
|
ObBackupCleanLSTaskMgr task_mgr;
|
|
ObBackupCleanLSTaskAttr &ls_attr = ls_task.at(i);
|
|
if (ObBackupTaskStatus::Status::FINISH == ls_attr.status_.status_) {
|
|
++finish_cnt;
|
|
if (OB_SUCCESS == ls_attr.result_) {
|
|
success_ls_count++;
|
|
}
|
|
} else if (OB_FAIL(task_mgr.init(task_attr_, ls_attr, *task_scheduler_, trans, *backup_service_))) {
|
|
LOG_WARN("failed to init task mgr", K(ret), K(ls_attr));
|
|
} else if (OB_FAIL(task_mgr.cancel(finish_cnt))) {
|
|
LOG_WARN("failed to cancel task", K(ret));
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret) && ls_task.count() == finish_cnt) {
|
|
ObBackupCleanStatus next_status;
|
|
next_status.status_ = ObBackupCleanStatus::Status::CANCELED;
|
|
int64_t end_ts = ObTimeUtil::current_time();
|
|
task_attr_.finish_ls_count_ = success_ls_count;
|
|
if (OB_FAIL(advance_task_status_(trans, next_status, OB_CANCELED, end_ts))) {
|
|
LOG_WARN("failed to advance set task status to CANCELED", K(ret));
|
|
} else if (OB_FAIL(ObBackupCleanTaskOperator::update_ls_count(trans, task_attr_, false/*is_total*/))) {
|
|
LOG_WARN("failed to update finish ls count", K(ret), K_(task_attr));
|
|
} else {
|
|
FLOG_INFO("[BACKUP_CLEAN]advance set status CANCELED success", K(next_status));
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
if (OB_FAIL(trans.end(true))) {
|
|
LOG_WARN("failed to commit trans", K(ret));
|
|
}
|
|
} else {
|
|
int tmp_ret = OB_SUCCESS;
|
|
if (OB_SUCCESS != (tmp_ret = trans.end(false))) {
|
|
LOG_WARN("failed to roll back status", K(ret), K(tmp_ret));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|