/** * 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 SHARE #include #include "lib/container/ob_array_array.h" #include "lib/container/ob_array_iterator.h" #define private public #include "share/backup/ob_backup_path.h" #include "share/backup/ob_log_archive_backup_info_mgr.h" #include "share/backup/ob_backup_struct.h" #undef private #include #include "lib/hash/ob_hashmap.h" using namespace oceanbase; using namespace common; using namespace share; TEST(ObBackupUtils, check_is_tmp_file) { bool is_tmp_file = false; ObString file_name_1 = "file_name.tmp.123456"; ASSERT_EQ(OB_SUCCESS, ObBackupUtils::check_is_tmp_file(file_name_1, is_tmp_file)); ASSERT_TRUE(is_tmp_file); ObString file_name_2 = "file_name.TMP.123456"; ASSERT_EQ(OB_SUCCESS, ObBackupUtils::check_is_tmp_file(file_name_2, is_tmp_file)); ASSERT_FALSE(is_tmp_file); ObString file_name_3 = "file_name.tmp"; ASSERT_EQ(OB_SUCCESS, ObBackupUtils::check_is_tmp_file(file_name_3, is_tmp_file)); ASSERT_FALSE(is_tmp_file); ObString file_name_4 = "file_name.tmp."; ASSERT_EQ(OB_SUCCESS, ObBackupUtils::check_is_tmp_file(file_name_4, is_tmp_file)); ASSERT_FALSE(is_tmp_file); ObString file_name_5 = "file_name"; ASSERT_EQ(OB_SUCCESS, ObBackupUtils::check_is_tmp_file(file_name_5, is_tmp_file)); ASSERT_FALSE(is_tmp_file); ObString file_name_6 = "file_name.123456"; ASSERT_EQ(OB_SUCCESS, ObBackupUtils::check_is_tmp_file(file_name_6, is_tmp_file)); ASSERT_FALSE(is_tmp_file); } TEST(ObSimpleBackupSetPath, simple_path_disk) { ObSimpleBackupSetPath simple_path; simple_path.backup_set_id_ = 1; simple_path.backup_dest_ = "file:///root_backup_dir"; LOG_INFO("simple_path", K(simple_path.get_simple_path()), K(simple_path.get_storage_info())); ASSERT_EQ(OB_SUCCESS, simple_path.get_simple_path().case_compare("file:///root_backup_dir")); ASSERT_EQ(OB_SUCCESS, simple_path.get_storage_info().case_compare("")); } TEST(ObSimpleBackupSetPath, simple_path_oss) { ObSimpleBackupSetPath simple_path; simple_path.backup_set_id_ = 1; simple_path.backup_dest_ = "oss://backup_dir/?host=http://oss-cn-hangzhou-zmf.aliyuncs.com&access_id=111&access_key=222"; LOG_INFO("simple_path", K(simple_path.get_simple_path()), K(simple_path.get_storage_info())); ASSERT_EQ(OB_SUCCESS, simple_path.get_simple_path().case_compare("oss://backup_dir/")); ASSERT_EQ(OB_SUCCESS, simple_path.get_storage_info().case_compare( "host=http://oss-cn-hangzhou-zmf.aliyuncs.com&access_id=111&access_key=222")); } TEST(ObBackupDest, disk) { const char* backup_test = "file:///root_backup_dir"; ObBackupDest dest; ASSERT_EQ(OB_SUCCESS, dest.set(backup_test)); LOG_INFO("dump backup dest", K(dest)); ASSERT_EQ(0, strcmp(dest.root_path_, "file:///root_backup_dir")); ASSERT_EQ(0, strcmp(dest.storage_info_, "")); } TEST(ObBackupDest, oss) { const char* backup_test = "oss://backup_dir/?host=http://oss-cn-hangzhou-zmf.aliyuncs.com&access_id=111&access_key=222"; ObBackupDest dest; ASSERT_EQ(OB_SUCCESS, dest.set(backup_test)); LOG_INFO("dump backup dest", K(dest)); ASSERT_EQ(0, strcmp(dest.root_path_, "oss://backup_dir/")); ASSERT_EQ(0, strcmp(dest.storage_info_, "host=http://oss-cn-hangzhou-zmf.aliyuncs.com&access_id=111&access_key=222")); } int check_backup_dest_opt(const ObBackupDestOpt& opt, int64_t log_archive_checkpoint_interval, int64_t recovery_window, int64_t piece_switch_interval, int64_t backup_copies, bool auto_delete_obsolete_backup, bool auto_touch_reserved_backup) { int ret = OB_SUCCESS; if (opt.log_archive_checkpoint_interval_ != log_archive_checkpoint_interval) { ret = OB_ERR_SYS; LOG_WARN("not match", K(log_archive_checkpoint_interval), K(opt)); } else if (opt.recovery_window_ != recovery_window) { ret = OB_ERR_SYS; LOG_WARN("not match", K(recovery_window), K(opt)); } else if (opt.piece_switch_interval_ != piece_switch_interval) { ret = OB_ERR_SYS; LOG_WARN("not match", K(piece_switch_interval), K(opt)); } else if (opt.backup_copies_ != backup_copies) { ret = OB_ERR_SYS; LOG_WARN("not match", K(backup_copies), K(opt)); } else if (opt.auto_delete_obsolete_backup_ != auto_delete_obsolete_backup) { ret = OB_ERR_SYS; LOG_WARN("not match", K(auto_delete_obsolete_backup), K(opt)); } else if (opt.auto_touch_reserved_backup_ != auto_touch_reserved_backup) { ret = OB_ERR_SYS; LOG_WARN("not match", K(auto_touch_reserved_backup), K(opt)); } return ret; } TEST(ObBackupDestOpt, normal) { const char* backup_dest_opt_str = "recovery_window=7d&auto_delete_obsolete_backup=true&backup_copies=2&log_archive_piece_switch_interval=1d"; const char* backup_backup_dest_opt_str = "recovery_window=14d&auto_delete_obsolete_backup=true"; ObBackupDestOpt backup_dest_opt; ObBackupDestOpt backup_backup_dest_opt; const bool global_auto_delete = false; const int64_t global_recovery_window = 0; const int64_t global_checkpoint_interval = 120 * 1000LL * 1000; // default config 120s const int64_t global_backup_checkpoint_interval = 0; ASSERT_EQ(OB_SUCCESS, backup_dest_opt.init(false /*is_backup_backup*/, backup_dest_opt_str, global_auto_delete, global_recovery_window, global_checkpoint_interval, false)); ASSERT_EQ(OB_SUCCESS, check_backup_dest_opt(backup_dest_opt, global_checkpoint_interval, 7 * 24 * 3600LL * 1000 * 1000 /*recovery_window*/, 1 * 24 * 3600LL * 1000 * 1000 /*piece_switch_interval*/, 2 /*backup_copies*/, true /*auto delete*/, false /*auto touch*/)); ASSERT_EQ(OB_SUCCESS, backup_backup_dest_opt.init(true /*is_backup_backup*/, backup_backup_dest_opt_str, global_auto_delete, global_recovery_window, global_backup_checkpoint_interval, false)); ASSERT_EQ(OB_SUCCESS, check_backup_dest_opt(backup_backup_dest_opt, 0, 14 * 24 * 3600LL * 1000 * 1000 /*recovery_window*/, 0 /*piece_switch_interval*/, 0 /*backup_copies*/, true /*auto delete*/, false /*auto touch*/)); } TEST(ObBackupDestOpt, backup_dest_all) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_SUCCESS, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d&auto_delete_obsolete_backup=true&log_archive_piece_" "switch_interval=3d&backup_copies=3", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); ASSERT_EQ(OB_SUCCESS, check_backup_dest_opt(backup_dest_opt, 10 * 60 * 1000LL * 1000LL /*global_checkpoint_interval*/, 30 * 24 * 3600LL * 1000 * 1000 /*recovery_window*/, 3 * 24 * 3600LL * 1000 * 1000 /*piece_switch_interval*/, 3 /*backup_copies*/, true /*auto delete*/, false /*auto touch*/)); } TEST(ObBackupDestOpt, backup_dest_empty) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_SUCCESS, backup_dest_opt.init(false /*is_backup_backup*/, "", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); ASSERT_EQ(OB_SUCCESS, check_backup_dest_opt(backup_dest_opt, 2 * 60 * 1000LL * 1000LL /*global_checkpoint_interval*/, 0 /*recovery_window*/, 0 /*piece_switch_interval*/, 0 /*backup_copies*/, 0 /*auto delete*/, false /*auto touch*/)); } TEST(ObBackupDestOpt, backup_dest_invalid_format) { ObBackupDestOpt backup_dest_opt; // invalid key checkpoint_interval ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(false /*is_backup_backup*/, "checkpoint_interval=10m&recovery_window=30d&auto_delete_obsolete_backup=true&log_archive_piece_switch_" "interval=3d&backup_copies=3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); // has blank space ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d " "&auto_delete_obsolete_backup=true&log_archive_piece_switch_interval=3d&backup_copies=3&auto_update_reserved_" "backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); // recovery_window has no value ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=&auto_delete_obsolete_backup=true&log_archive_piece_" "switch_interval=3d&backup_copies=3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); // recovery_window has invalid value ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=a&auto_delete_obsolete_backup=true&log_archive_piece_" "switch_interval=3d&backup_copies=3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); // auto_delete_obsolete_backup has invalid value ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=7d&auto_delete_obsolete_backup=a&log_archive_piece_" "switch_interval=3d&backup_copies=3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObBackupDestOpt, backup_dest_invalid_delete_and_touch) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_NOT_SUPPORTED, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d&auto_delete_obsolete_backup=true&log_archive_piece_" "switch_interval=3d&backup_copies=3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObBackupDestOpt, backup_dest_invalid_copies) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_NOT_SUPPORTED, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d&auto_delete_obsolete_backup=true&log_archive_piece_" "switch_interval=3d&backup_copies=-1", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObBackupDestOpt, backup_dest_invalid_recovery_window) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=-1d&log_archive_piece_switch_interval=3d&backup_copies=" "3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObBackupDestOpt, backup_dest_invalid_piece_switch) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_NOT_SUPPORTED, backup_dest_opt.init(false /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d&log_archive_piece_switch_interval=1s&backup_copies=" "3&auto_update_reserved_backup_timestamp=true", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObBackupDestOpt, backup_backup_dest_invalid_copies) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(true /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d&auto_delete_obsolete_backup=true&backup_copies=1", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObBackupDestOpt, backup_backup_dest_invalid_piece_switch) { ObBackupDestOpt backup_dest_opt; ASSERT_EQ(OB_INVALID_ARGUMENT, backup_dest_opt.init(true /*is_backup_backup*/, "log_archive_checkpoint_interval=10m&recovery_window=30d&auto_delete_obsolete_backup=true&log_archive_piece_" "switch_interval=3d&backup_copies=0", false /*global_auto_delete*/, 0 /*global_recovery_window*/, 120 * 1000LL * 1000LL /*global_checkpoint_interval*/, false)); } TEST(ObLogArchiveBackupInfoMgr, log_archive_info_cmp) { int ret = OB_SUCCESS; ObLogArchiveBackupInfoMgr::CompareBackupPieceInfo cmp(ret); ObBackupPieceInfo piece_info; ObArray piece_infos; ObArray piece_infos_copy1; ObArray piece_infos_copy2; ObArray piece_infos_copy3; ret = piece_info.backup_dest_.assign("file::///oceanbase/"); ASSERT_EQ(OB_SUCCESS, ret); piece_info.checkpoint_ts_ = 1621652028364222; piece_info.compatible_ = ObTenantLogArchiveStatus::COMPATIBLE_VERSION_2; piece_info.create_date_ = 20210523; piece_info.file_status_ = ObBackupFileStatus::BACKUP_FILE_AVAILABLE; piece_info.key_.tenant_id_ = 1; piece_info.max_ts_ = 1621652028364222; piece_info.start_piece_id_ = 0; piece_info.start_ts_ = 0; piece_info.status_ = ObBackupPieceStatus::BACKUP_PIECE_ACTIVE; //mock array with same incarnation, round, copy id for (int64_t i = 0; OB_SUCC(ret) && i < 10; ++i) { piece_info.key_.copy_id_ = 0; piece_info.key_.incarnation_ = 1; piece_info.key_.round_id_ = 1; piece_info.key_.backup_piece_id_ = i; ret = piece_infos.push_back(piece_info); ASSERT_EQ(OB_SUCCESS, ret); } std::sort(piece_infos.begin(), piece_infos.end(), cmp); for (int64_t i = 0; OB_SUCC(ret) && i < piece_infos.count(); ++i) { const ObBackupPieceInfo &tmp_piece_info = piece_infos.at(i); ASSERT_EQ(tmp_piece_info.key_.backup_piece_id_, i); } piece_infos.reset(); for (int64_t i = 0; OB_SUCC(ret) && i < 10; ++i) { piece_info.key_.copy_id_ = 1; piece_info.key_.incarnation_ = 1; piece_info.key_.round_id_ = 1+i; piece_info.key_.backup_piece_id_ = i; ret = piece_infos_copy1.push_back(piece_info); ASSERT_EQ(OB_SUCCESS, ret); } for (int64_t i = 0; OB_SUCC(ret) && i < 9; ++i) { piece_info.key_.copy_id_ = 2; piece_info.key_.incarnation_ = 1; piece_info.key_.round_id_ = 1+i; piece_info.key_.backup_piece_id_ = i; ret = piece_infos_copy2.push_back(piece_info); ASSERT_EQ(OB_SUCCESS, ret); } for (int64_t i = 0; OB_SUCC(ret) && i < 7; ++i) { piece_info.key_.copy_id_ = 3; piece_info.key_.incarnation_ = 1; piece_info.key_.round_id_ = 1+i; piece_info.key_.backup_piece_id_ = i; ret = piece_infos_copy3.push_back(piece_info); ASSERT_EQ(OB_SUCCESS, ret); } //add to piece infos for (int64_t i = 0; OB_SUCC(ret) && i < piece_infos_copy3.count(); ++i) { const ObBackupPieceInfo &tmp_piece_info = piece_infos_copy3.at(i); ret = piece_infos.push_back(tmp_piece_info); ASSERT_EQ(OB_SUCCESS, ret); } for (int64_t i = 0; OB_SUCC(ret) && i < piece_infos_copy1.count(); ++i) { const ObBackupPieceInfo &tmp_piece_info = piece_infos_copy1.at(i); ret = piece_infos.push_back(tmp_piece_info); ASSERT_EQ(OB_SUCCESS, ret); } for (int64_t i = 0; OB_SUCC(ret) && i < piece_infos_copy2.count(); ++i) { const ObBackupPieceInfo &tmp_piece_info = piece_infos_copy2.at(i); ret = piece_infos.push_back(tmp_piece_info); ASSERT_EQ(OB_SUCCESS, ret); } std::sort(piece_infos.begin(), piece_infos.end(), cmp); for (int64_t i = 0; OB_SUCC(ret) && i < 10; ++i) { const ObBackupPieceInfo &tmp_piece_info = piece_infos.at(i); ASSERT_EQ(tmp_piece_info.key_.backup_piece_id_, i); ASSERT_EQ(tmp_piece_info.key_.round_id_, i + 1); ASSERT_EQ(tmp_piece_info.key_.copy_id_, 1); } ret = piece_infos.push_back(piece_info); ASSERT_EQ(OB_SUCCESS, ret); std::sort(piece_infos.begin(), piece_infos.end(), cmp); ASSERT_EQ(OB_ERR_UNEXPECTED, ret); } int main(int argc, char **argv) { OB_LOGGER.set_log_level("INFO"); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }