diff --git a/mittest/mtlenv/mock_tenant_module_env.h b/mittest/mtlenv/mock_tenant_module_env.h index 15aa36ff02..28baadd31b 100644 --- a/mittest/mtlenv/mock_tenant_module_env.h +++ b/mittest/mtlenv/mock_tenant_module_env.h @@ -669,6 +669,7 @@ int MockTenantModuleEnv::init() MTL_BIND2(mtl_new_default, ObStorageLogger::mtl_init, ObStorageLogger::mtl_start, ObStorageLogger::mtl_stop, ObStorageLogger::mtl_wait, mtl_destroy_default); MTL_BIND2(ObTenantMetaMemMgr::mtl_new, mtl_init_default, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTransService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); + MTL_BIND2(mtl_new_default, logservice::ObGarbageCollector::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTimestampService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTransIDService::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObXAService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); @@ -748,7 +749,8 @@ int MockTenantModuleEnv::start_() STORAGE_LOG(ERROR, "fail to switch to sys tenant", K(ret)); } else { ObLogService *log_service = MTL(logservice::ObLogService*); - if (OB_ISNULL(log_service) || OB_ISNULL(log_service->palf_env_)) { + ObGarbageCollector *gc_svr = MTL(logservice::ObGarbageCollector*); + if (OB_ISNULL(log_service) || OB_ISNULL(log_service->palf_env_) || OB_ISNULL(gc_svr)) { ret = OB_ERR_UNEXPECTED; STORAGE_LOG(ERROR, "fail to switch to sys tenant", KP(log_service)); } else { @@ -756,6 +758,7 @@ int MockTenantModuleEnv::start_() palf::LogIOWorkerWrapper &log_iow_wrapper = palf_env_impl->log_io_worker_wrapper_; palf::LogIOWorkerConfig new_config; const int64_t mock_tenant_id = 1; + gc_svr->stop_create_new_gc_task_ = true; palf_env_impl->init_log_io_worker_config_(1, mock_tenant_id, new_config); new_config.io_worker_num_ = 4; log_iow_wrapper.destory_and_free_log_io_workers_(); diff --git a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h index 23622f86ec..eacab47100 100644 --- a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h +++ b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h @@ -27,7 +27,6 @@ #include "observer/omt/ob_tenant_node_balancer.h" #include "observer/ob_server_struct.h" #include "observer/ob_service.h" -#include "observer/ob_safe_destroy_thread.h" #include "share/ob_simple_mem_limit_getter.h" #include "share/scn.h" #include "mtlenv/mock_tenant_module_env.h" @@ -169,8 +168,6 @@ TestIndexBlockDataPrepare::~TestIndexBlockDataPrepare() void TestIndexBlockDataPrepare::SetUpTestCase() { EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; ObClockGenerator::init(); @@ -199,9 +196,6 @@ void TestIndexBlockDataPrepare::TearDownTestCase() ASSERT_EQ(OB_SUCCESS, MTL(ObLSService*)->remove_ls(ObLSID(ls_id_), false)); ObKVGlobalCache::get_instance().destroy(); OB_STORE_CACHE.destroy(); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/checkpoint/test_checkpoint_executor.cpp b/mittest/mtlenv/storage/checkpoint/test_checkpoint_executor.cpp index da4650eadb..059f700c0a 100644 --- a/mittest/mtlenv/storage/checkpoint/test_checkpoint_executor.cpp +++ b/mittest/mtlenv/storage/checkpoint/test_checkpoint_executor.cpp @@ -24,7 +24,6 @@ #include "storage/tx_storage/ob_ls_service.h" #include "storage/init_basic_struct.h" #include "storage/mock_ob_log_handler.h" -#include "observer/ob_safe_destroy_thread.h" #include "share/scn.h" using namespace oceanbase; @@ -227,16 +226,11 @@ void TestCheckpointExecutor::TearDown() void TestCheckpointExecutor::SetUpTestCase() { EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } void TestCheckpointExecutor::TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/checkpoint/test_data_checkpoint.cpp b/mittest/mtlenv/storage/checkpoint/test_data_checkpoint.cpp index a37fefc254..352134e722 100644 --- a/mittest/mtlenv/storage/checkpoint/test_data_checkpoint.cpp +++ b/mittest/mtlenv/storage/checkpoint/test_data_checkpoint.cpp @@ -23,7 +23,6 @@ #include "logservice/ob_log_base_type.h" #include "storage/init_basic_struct.h" #include "storage/mock_ob_log_handler.h" -#include "observer/ob_safe_destroy_thread.h" using namespace oceanbase; @@ -178,16 +177,11 @@ void TestDataCheckpoint::TearDown() void TestDataCheckpoint::SetUpTestCase() { EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } void TestDataCheckpoint::TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/checkpoint/test_lock_memtable_checkpoint.cpp b/mittest/mtlenv/storage/checkpoint/test_lock_memtable_checkpoint.cpp index a5bfe7c3ae..a6d170e619 100644 --- a/mittest/mtlenv/storage/checkpoint/test_lock_memtable_checkpoint.cpp +++ b/mittest/mtlenv/storage/checkpoint/test_lock_memtable_checkpoint.cpp @@ -21,7 +21,6 @@ #include "storage/tx_storage/ob_ls_service.h" #include "storage/init_basic_struct.h" #include "storage/tablelock/ob_lock_memtable.h" -#include "observer/ob_safe_destroy_thread.h" namespace oceanbase { @@ -85,17 +84,12 @@ void TestLockMemtableCheckpoint::SetUpTestCase() LOG_INFO("SetUpTestCase"); init_default_lock_test_value(); EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } void TestLockMemtableCheckpoint::TearDownTestCase() { LOG_INFO("TearDownTestCase"); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_lob_manager.cpp b/mittest/mtlenv/storage/test_lob_manager.cpp index 43c2467309..a546bad4aa 100644 --- a/mittest/mtlenv/storage/test_lob_manager.cpp +++ b/mittest/mtlenv/storage/test_lob_manager.cpp @@ -26,7 +26,6 @@ #include "storage/blocksstable/ob_tmp_file.h" #include "storage/lob/ob_lob_piece.h" #include "sql/engine/ob_exec_context.h" -#include "observer/ob_safe_destroy_thread.h" #include "lib/objectpool/ob_server_object_pool.h" namespace oceanbase @@ -52,15 +51,10 @@ public: EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); MTL(transaction::ObTransService*)->tx_desc_mgr_.tx_id_allocator_ = [](transaction::ObTransID &tx_id) { tx_id = transaction::ObTransID(1001); return OB_SUCCESS; }; - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } static void TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } virtual void SetUp() diff --git a/mittest/mtlenv/storage/test_ls_migration_param.cpp b/mittest/mtlenv/storage/test_ls_migration_param.cpp index f2f251b655..2af2ff373e 100644 --- a/mittest/mtlenv/storage/test_ls_migration_param.cpp +++ b/mittest/mtlenv/storage/test_ls_migration_param.cpp @@ -29,7 +29,6 @@ #include "storage/tx_storage/ob_ls_service.h" #include "mtlenv/mock_tenant_module_env.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" using namespace oceanbase::common; using namespace oceanbase::share; @@ -68,8 +67,6 @@ void TestLSMigrationParam::SetUpTestCase() int ret = OB_SUCCESS; ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -84,10 +81,6 @@ void TestLSMigrationParam::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - // tenant need destroy after safe to destroy - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_ls_restore_task_mgr.cpp b/mittest/mtlenv/storage/test_ls_restore_task_mgr.cpp index 5216209017..03c3f5f11d 100644 --- a/mittest/mtlenv/storage/test_ls_restore_task_mgr.cpp +++ b/mittest/mtlenv/storage/test_ls_restore_task_mgr.cpp @@ -20,7 +20,6 @@ #include "mtlenv/mock_tenant_module_env.h" #include "storage/init_basic_struct.h" #include "storage/tablet/ob_tablet_iterator.h" -#include "observer/ob_safe_destroy_thread.h" #include "share/partition_table/fake_part_property_getter.h" #include "share/ob_define.h" @@ -208,15 +207,10 @@ public: virtual ~TestLSRestoreHandler() = default; static void SetUpTestCase() { - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } static void TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_ls_service.cpp b/mittest/mtlenv/storage/test_ls_service.cpp index 73881be51a..794f204969 100644 --- a/mittest/mtlenv/storage/test_ls_service.cpp +++ b/mittest/mtlenv/storage/test_ls_service.cpp @@ -26,7 +26,6 @@ #include "mtlenv/mock_tenant_module_env.h" #include "storage/init_basic_struct.h" #include "storage/test_tablet_helper.h" -#include "observer/ob_safe_destroy_thread.h" namespace oceanbase { @@ -63,16 +62,11 @@ using namespace oceanbase::obsys; void TestLSService::SetUpTestCase() { EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } void TestLSService::TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_ls_tablet_info_writer_and_reader.cpp b/mittest/mtlenv/storage/test_ls_tablet_info_writer_and_reader.cpp index 22efd8c84b..1c29e0e594 100644 --- a/mittest/mtlenv/storage/test_ls_tablet_info_writer_and_reader.cpp +++ b/mittest/mtlenv/storage/test_ls_tablet_info_writer_and_reader.cpp @@ -29,7 +29,6 @@ #include "storage/tx_storage/ob_ls_service.h" #include "mtlenv/mock_tenant_module_env.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/backup/ob_backup_extern_info_mgr.h" #include "share/backup/ob_backup_io_adapter.h" @@ -94,8 +93,6 @@ void TestLSTabletInfoWR::SetUpTestCase() int ret = OB_SUCCESS; ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -110,10 +107,6 @@ void TestLSTabletInfoWR::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - // tenant need destroy after safe to destroy - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_ls_tablet_service.cpp b/mittest/mtlenv/storage/test_ls_tablet_service.cpp index 082a9ec182..7384a36327 100644 --- a/mittest/mtlenv/storage/test_ls_tablet_service.cpp +++ b/mittest/mtlenv/storage/test_ls_tablet_service.cpp @@ -36,7 +36,6 @@ #include "mtlenv/mock_tenant_module_env.h" #include "storage/test_dml_common.h" #include "storage/test_tablet_helper.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/tablet/ob_tablet_persister.h" #include "unittest/storage/slog/simple_ob_storage_redo_module.h" @@ -94,8 +93,6 @@ void TestLSTabletService::SetUpTestCase() LOG_INFO("TestLSTabletService::SetUpTestCase"); ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; ObIOManager::get_instance().add_tenant_io_manager( @@ -141,9 +138,6 @@ void TestLSTabletService::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_medium_info_reader.cpp b/mittest/mtlenv/storage/test_medium_info_reader.cpp index e9318f6fd0..47cf179e47 100644 --- a/mittest/mtlenv/storage/test_medium_info_reader.cpp +++ b/mittest/mtlenv/storage/test_medium_info_reader.cpp @@ -31,7 +31,6 @@ #include "storage/tablet/ob_tablet_persister.h" #include "storage/multi_data_source/mds_table_handler.h" #include "storage/multi_data_source/runtime_utility/mds_factory.h" -#include "observer/ob_safe_destroy_thread.h" using namespace oceanbase::common; using namespace oceanbase::share; @@ -124,8 +123,6 @@ void TestMediumInfoReader::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -142,10 +139,6 @@ void TestMediumInfoReader::TearDownTestCase() ret = remove_ls(LS_ID); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); - MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_memtable_v2.cpp b/mittest/mtlenv/storage/test_memtable_v2.cpp index 862958be72..9c1b525b89 100644 --- a/mittest/mtlenv/storage/test_memtable_v2.cpp +++ b/mittest/mtlenv/storage/test_memtable_v2.cpp @@ -20,7 +20,6 @@ #include "storage/tx_table/ob_tx_table.h" #include "storage/memtable/mvcc/ob_mvcc_row.h" #include "storage/init_basic_struct.h" -#include "observer/ob_safe_destroy_thread.h" #include "share/ob_master_key_getter.h" namespace oceanbase @@ -199,8 +198,6 @@ public: { TRANS_LOG(INFO, "SetUpTestCase"); EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -217,9 +214,6 @@ public: ObLSID ls_id(1001); ASSERT_EQ(OB_SUCCESS, MTL(ObLSService*)->remove_ls(ls_id, false)); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); TRANS_LOG(INFO, "TearDownTestCase"); } diff --git a/mittest/mtlenv/storage/test_table_scan_pure_data_table.cpp b/mittest/mtlenv/storage/test_table_scan_pure_data_table.cpp index 4a93328715..08e31da2c5 100644 --- a/mittest/mtlenv/storage/test_table_scan_pure_data_table.cpp +++ b/mittest/mtlenv/storage/test_table_scan_pure_data_table.cpp @@ -17,7 +17,6 @@ #define protected public #include "storage/test_dml_common.h" #include "share/schema/ob_table_dml_param.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/test_tablet_helper.h" namespace oceanbase @@ -73,16 +72,11 @@ void TestTableScanPureDataTable::SetUpTestCase() ASSERT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); // MTL(transaction::ObTransService*)->tx_desc_mgr_.tx_id_allocator_ = // [](transaction::ObTransID &tx_id) { tx_id = transaction::ObTransID(1001); return OB_SUCCESS; }; - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } void TestTableScanPureDataTable::TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_tablet_create_delete_helper.cpp b/mittest/mtlenv/storage/test_tablet_create_delete_helper.cpp index fc6b862974..893cf6a9fa 100644 --- a/mittest/mtlenv/storage/test_tablet_create_delete_helper.cpp +++ b/mittest/mtlenv/storage/test_tablet_create_delete_helper.cpp @@ -25,7 +25,6 @@ #include "mtlenv/mock_tenant_module_env.h" #include "storage/schema_utils.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/init_basic_struct.h" #include "share/scn.h" #include "storage/memtable/ob_memtable.h" @@ -115,8 +114,6 @@ void TestTabletCreateDeleteHelper::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -139,10 +136,6 @@ void TestTabletCreateDeleteHelper::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); - MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_tablet_member_load_and_free.cpp b/mittest/mtlenv/storage/test_tablet_member_load_and_free.cpp index 58fbf6d14b..85cb237d67 100644 --- a/mittest/mtlenv/storage/test_tablet_member_load_and_free.cpp +++ b/mittest/mtlenv/storage/test_tablet_member_load_and_free.cpp @@ -30,7 +30,6 @@ #include "unittest/storage/test_tablet_helper.h" #include "unittest/storage/test_dml_common.h" #include "unittest/storage/schema_utils.h" -#include "observer/ob_safe_destroy_thread.h" using namespace oceanbase::share; using namespace oceanbase::common; @@ -81,8 +80,6 @@ void TestTabletMemberLoadAndFree::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -99,10 +96,6 @@ void TestTabletMemberLoadAndFree::TearDownTestCase() ret = remove_ls(LS_ID); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); - MockTenantModuleEnv::get_instance().destroy(); } @@ -202,4 +195,4 @@ int main(int argc, char **argv) OB_LOGGER.set_log_level("INFO"); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); -} \ No newline at end of file +} diff --git a/mittest/mtlenv/storage/test_tablet_status.cpp b/mittest/mtlenv/storage/test_tablet_status.cpp index fd7546c129..c3f8744cda 100644 --- a/mittest/mtlenv/storage/test_tablet_status.cpp +++ b/mittest/mtlenv/storage/test_tablet_status.cpp @@ -28,7 +28,6 @@ #include "mtlenv/mock_tenant_module_env.h" #include "storage/schema_utils.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" #include "share/scn.h" #include "logservice/palf/log_define.h" #include "storage/tablet/ob_tablet_table_store_flag.h" @@ -100,8 +99,6 @@ void TestTabletStatus::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -124,10 +121,6 @@ void TestTabletStatus::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); - MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_tablet_status_cache.cpp b/mittest/mtlenv/storage/test_tablet_status_cache.cpp index 408e8ef096..c65f49e5f6 100644 --- a/mittest/mtlenv/storage/test_tablet_status_cache.cpp +++ b/mittest/mtlenv/storage/test_tablet_status_cache.cpp @@ -27,7 +27,6 @@ #include "storage/multi_data_source/mds_ctx.h" #include "storage/tablet/ob_tablet_create_delete_mds_user_data.h" #include "storage/tx/ob_trans_define.h" -#include "observer/ob_safe_destroy_thread.h" using namespace oceanbase::common; @@ -73,8 +72,6 @@ void TestTabletStatusCache::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -91,10 +88,6 @@ void TestTabletStatusCache::TearDownTestCase() ret = remove_ls(LS_ID); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); - MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp b/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp index b1c9001199..7667c1dfd1 100644 --- a/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp +++ b/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp @@ -29,7 +29,6 @@ #include "storage/tablet/ob_tablet_status.h" #include "mtlenv/mock_tenant_module_env.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" namespace oceanbase { @@ -126,8 +125,6 @@ void TestTenantMetaMemMgr::SetUpTestCase() int ret = OB_SUCCESS; ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; ObClockGenerator::init(); @@ -156,9 +153,6 @@ void TestTenantMetaMemMgr::TearDownTestCase() int ret = OB_SUCCESS; ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_trans.cpp b/mittest/mtlenv/storage/test_trans.cpp index e0b61e443c..9a980829b1 100644 --- a/mittest/mtlenv/storage/test_trans.cpp +++ b/mittest/mtlenv/storage/test_trans.cpp @@ -18,7 +18,6 @@ #include "storage/init_basic_struct.h" #include "storage/test_tablet_helper.h" #include "share/schema/ob_table_dml_param.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/ob_dml_running_ctx.h" #include "storage/tx/ob_trans_part_ctx.h" @@ -105,16 +104,11 @@ public: ObClusterVersion::get_instance().tenant_config_mgr_ = &omt::ObTenantConfigMgr::get_instance(); ASSERT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } static void TearDownTestCase() { LOG_INFO("TearDownTestCase"); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/storage/test_write_tablet_slog.cpp b/mittest/mtlenv/storage/test_write_tablet_slog.cpp index b06d914e1a..537c0f51bc 100644 --- a/mittest/mtlenv/storage/test_write_tablet_slog.cpp +++ b/mittest/mtlenv/storage/test_write_tablet_slog.cpp @@ -27,7 +27,6 @@ #include "storage/init_basic_struct.h" #include "storage/test_tablet_helper.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" #include "observer/ob_server_startup_task_handler.h" #include "lib/oblog/ob_log.h" @@ -66,8 +65,6 @@ void TestWriteTabletSlog::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; ASSERT_EQ(OB_SUCCESS, SERVER_STARTUP_TASK_HANDLER.init()); ASSERT_EQ(OB_SUCCESS, SERVER_STARTUP_TASK_HANDLER.start()); @@ -84,11 +81,7 @@ void TestWriteTabletSlog::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); SERVER_STARTUP_TASK_HANDLER.destroy(); - MockTenantModuleEnv::get_instance().destroy(); } diff --git a/mittest/mtlenv/tablelock/test_table_lock_flush.cpp b/mittest/mtlenv/tablelock/test_table_lock_flush.cpp index ec133f2788..225d98c1cb 100644 --- a/mittest/mtlenv/tablelock/test_table_lock_flush.cpp +++ b/mittest/mtlenv/tablelock/test_table_lock_flush.cpp @@ -16,7 +16,6 @@ #define protected public #define private public #include "mtlenv/mock_tenant_module_env.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/tx/ob_trans_part_ctx.h" #include "storage/ls/ob_ls.h" #include "storage/ls/ob_ls_tx_service.h" @@ -86,16 +85,11 @@ void TestTableLockFlush::TearDown() void TestTableLockFlush::SetUpTestCase() { EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; } void TestTableLockFlush::TearDownTestCase() { - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/src/logservice/ob_garbage_collector.cpp b/src/logservice/ob_garbage_collector.cpp index e97259b14f..9e2764ef3b 100644 --- a/src/logservice/ob_garbage_collector.cpp +++ b/src/logservice/ob_garbage_collector.cpp @@ -1011,7 +1011,9 @@ ObGarbageCollector::ObGarbageCollector() : is_inited_(false), rpc_proxy_(NULL), sql_proxy_(NULL), self_addr_(), - seq_(1) + seq_(1), + safe_destroy_handler_(), + stop_create_new_gc_task_(true) { } @@ -1042,6 +1044,8 @@ int ObGarbageCollector::init(ObLSService *ls_service, || OB_ISNULL(sql_proxy) || !self_addr.is_valid()) { ret = OB_INVALID_ARGUMENT; CLOG_LOG(WARN, "invalid arguments", K(ret), KP(ls_service), KP(rpc_proxy), KP(sql_proxy), K(self_addr)); + } else if (OB_FAIL(safe_destroy_handler_.init())) { + CLOG_LOG(WARN, "safe destroy handler init failed", K(ret)); } else { ls_service_ = ls_service; rpc_proxy_ = rpc_proxy; @@ -1063,8 +1067,11 @@ int ObGarbageCollector::start() CLOG_LOG(WARN, "ObGarbageCollector is not inited", K(ret)); } else if (OB_FAIL(ObThreadPool::start())) { CLOG_LOG(ERROR, "ObGarbageCollector thread failed to start", K(ret)); + } else if (OB_FAIL(safe_destroy_handler_.start())) { + CLOG_LOG(ERROR, "safe destroy handler failed to start", K(ret)); } else { // do nothing + stop_create_new_gc_task_ = false; } return ret; @@ -1072,12 +1079,19 @@ int ObGarbageCollector::start() void ObGarbageCollector::stop() { - ObThreadPool::stop(); - CLOG_LOG(INFO, "ObGarbageCollector stop"); + int ret = OB_SUCCESS; + if (OB_FAIL(safe_destroy_handler_.stop())) { + CLOG_LOG(WARN, "safe destroy handler stop failed", K(ret)); + } else { + stop_create_new_gc_task_ = true; + CLOG_LOG(INFO, "ObGarbageCollector stop"); + } } void ObGarbageCollector::wait() { + safe_destroy_handler_.wait(); + ObThreadPool::stop(); ObThreadPool::wait(); CLOG_LOG(INFO, "ObGarbageCollector wait"); } @@ -1091,6 +1105,7 @@ void ObGarbageCollector::destroy() rpc_proxy_ = NULL; sql_proxy_ = NULL; self_addr_.reset(); + safe_destroy_handler_.destroy(); } void ObGarbageCollector::run1() @@ -1099,17 +1114,21 @@ void ObGarbageCollector::run1() lib::set_thread_name("GCCollector"); while (!has_set_stop()) { - ObGCCandidateArray gc_candidates; - int64_t gc_interval = GC_INTERVAL; - CLOG_LOG(INFO, "Garbage Collector is running", K(seq_), K(gc_interval)); - gc_candidates.reset(); - (void)gc_check_member_list_(gc_candidates); - (void)execute_gc_(gc_candidates); - gc_candidates.reset(); - (void)gc_check_ls_status_(gc_candidates); - (void)execute_gc_(gc_candidates); - ob_usleep(gc_interval); - seq_++; + if (!stop_create_new_gc_task_) { + ObGCCandidateArray gc_candidates; + int64_t gc_interval = GC_INTERVAL; + CLOG_LOG(INFO, "Garbage Collector is running", K(seq_), K(gc_interval)); + gc_candidates.reset(); + (void)gc_check_member_list_(gc_candidates); + (void)execute_gc_(gc_candidates); + gc_candidates.reset(); + (void)gc_check_ls_status_(gc_candidates); + (void)execute_gc_(gc_candidates); + ob_usleep(gc_interval); + seq_++; + } + // safe destroy task + (void) safe_destroy_handler_.handle(); } } @@ -1131,6 +1150,15 @@ int ObGarbageCollector::get_ls_status_from_table(const ObLSID &ls_id, return ret; } +int ObGarbageCollector::add_safe_destroy_task(ObSafeDestroyTask &task) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(safe_destroy_handler_.push(task))) { + CLOG_LOG(WARN, "failed to add safe destroy task", K(ret), K(task)); + } + return ret; +} + bool ObGarbageCollector::is_ls_dropping_ls_status(const LSStatus &status) { return LSStatus::LS_DROPPING == status; diff --git a/src/logservice/ob_garbage_collector.h b/src/logservice/ob_garbage_collector.h index 9e9059fa4b..dfbd8f95da 100644 --- a/src/logservice/ob_garbage_collector.h +++ b/src/logservice/ob_garbage_collector.h @@ -21,6 +21,7 @@ #include "share/ob_thread_pool.h" #include "share/ob_ls_id.h" #include "share/ls/ob_ls_status_operator.h" +#include "storage/tx_storage/ob_safe_destroy_handler.h" #include "logservice/ob_log_base_header.h" #include "logservice/ob_append_callback.h" @@ -185,6 +186,12 @@ public: static bool is_tenant_dropping_ls_status(const LSStatus &status); int get_ls_status_from_table(const share::ObLSID &ls_id, share::ObLSStatus &ls_status); + int add_safe_destroy_task(storage::ObSafeDestroyTask &task); + template + int safe_destroy_task_for_each(Function &fn) + { + return safe_destroy_handler_.for_each(fn); + } private: bool is_valid_ls_status_(const LSStatus &status); bool is_need_gc_ls_status_(const LSStatus &status); @@ -216,6 +223,9 @@ private: common::ObMySQLProxy *sql_proxy_; common::ObAddr self_addr_; int64_t seq_; + storage::ObSafeDestroyHandler safe_destroy_handler_; + // stop push task, but will process the left task. + bool stop_create_new_gc_task_; private: DISALLOW_COPY_AND_ASSIGN(ObGarbageCollector); }; diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index fa47b78ece..a5d1c9f8de 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -20,7 +20,6 @@ ob_set_subtarget(ob_server common ob_rpc_extra_payload.cpp ob_rpc_intrusion_detect.cpp ob_rpc_processor_simple.cpp - ob_safe_destroy_thread.cpp ob_server_event_history_table_operator.cpp ob_server_reload_config.cpp ob_server_schema_updater.cpp diff --git a/src/observer/ob_server.cpp b/src/observer/ob_server.cpp index 7860c21fb7..5ed0c326d6 100644 --- a/src/observer/ob_server.cpp +++ b/src/observer/ob_server.cpp @@ -35,7 +35,6 @@ #include "lib/thread/thread_mgr.h" #include "observer/ob_server_utils.h" #include "observer/ob_rpc_extra_payload.h" -#include "observer/ob_safe_destroy_thread.h" #include "observer/omt/ob_tenant_timezone_mgr.h" #include "observer/omt/ob_tenant_srs_mgr.h" #include "observer/table/ob_table_rpc_processor.h" @@ -377,8 +376,6 @@ int ObServer::init(const ObServerOptions &opts, const ObPLogWriterCfg &log_cfg) } else if (FALSE_IT(common::occam::ObThreadHungDetector::get_instance())) { } else if (OB_FAIL(palf::election::GLOBAL_INIT_ELECTION_MODULE())) { LOG_ERROR("init election module failed", KR(ret)); - } else if (OB_FAIL(SAFE_DESTROY_INSTANCE.init())) { - LOG_ERROR("init safe to destroy instance failed", K(ret)); } else if (OB_FAIL(init_multi_tenant())) { LOG_ERROR("init multi tenant failed", KR(ret)); } else if (OB_FAIL(init_ctas_clean_up_task())) { @@ -672,10 +669,6 @@ void ObServer::destroy() multi_tenant_.destroy(); FLOG_INFO("wait destroy multi tenant success"); - FLOG_INFO("begin to destroy safe destroy instance"); - SAFE_DESTROY_INSTANCE.destroy(); - FLOG_INFO("wait destroy safe destroy instance success"); - FLOG_INFO("begin to destroy query retry ctrl"); ObQueryRetryCtrl::destroy(); FLOG_INFO("query retry ctrl destroy"); @@ -789,13 +782,6 @@ int ObServer::start() FLOG_INFO("success to start io manager"); } - // safe destroy instance should start before multi tenant - if (FAILEDx(SAFE_DESTROY_INSTANCE.start())) { - LOG_ERROR("fail to start safe destroy thread", KR(ret)); - } else { - FLOG_INFO("success to start safe destroy thread"); - } - if (FAILEDx(multi_tenant_.start())) { LOG_ERROR("fail to start multi tenant", KR(ret)); } else { @@ -1291,12 +1277,6 @@ int ObServer::stop() ob_service_.stop(); FLOG_INFO("ob_service stopped"); - // safe destroy instance should stop after multi_tenant_ - FLOG_INFO("begin to stop safe destroy instance"); - SAFE_DESTROY_INSTANCE.stop(); - FLOG_INFO("safe destroy instance stopped"); - - FLOG_INFO("begin to stop slogger manager"); SLOGGERMGR.destroy(); FLOG_INFO("slogger manager stopped"); @@ -1509,12 +1489,6 @@ int ObServer::wait() multi_tenant_.wait(); FLOG_INFO("wait multi tenant success"); - // safe to destroy - FLOG_INFO("begin to wait for safe destroy instance"); - SAFE_DESTROY_INSTANCE.wait(); - FLOG_INFO("wait for safe destroy instance success"); - - FLOG_INFO("begin to wait ratelimit manager"); rl_mgr_.wait(); FLOG_INFO("wait ratelimit manager success"); diff --git a/src/observer/omt/ob_multi_tenant.cpp b/src/observer/omt/ob_multi_tenant.cpp index 56405e1ae1..95fb149b50 100644 --- a/src/observer/omt/ob_multi_tenant.cpp +++ b/src/observer/omt/ob_multi_tenant.cpp @@ -409,6 +409,7 @@ int ObMultiTenant::init(ObAddr myaddr, MTL_BIND2(ObTenantMetaMemMgr::mtl_new, mtl_init_default, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTransService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObLogService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); + MTL_BIND2(mtl_new_default, logservice::ObGarbageCollector::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObLSService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTenantCheckpointSlogHandler::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); @@ -426,7 +427,6 @@ int ObMultiTenant::init(ObAddr myaddr, MTL_BIND2(mtl_new_default, share::ObDagWarningHistoryManager::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, compaction::ObScheduleSuspectInfoMgr::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, memtable::ObLockWaitMgr::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); - MTL_BIND2(mtl_new_default, logservice::ObGarbageCollector::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTableLockService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, rootserver::ObPrimaryMajorFreezeService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, rootserver::ObRestoreMajorFreezeService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); diff --git a/src/share/rc/ob_tenant_base.h b/src/share/rc/ob_tenant_base.h index e45006e7e5..c4d1571513 100755 --- a/src/share/rc/ob_tenant_base.h +++ b/src/share/rc/ob_tenant_base.h @@ -208,13 +208,13 @@ using ObTableScanIteratorObjPool = common::ObServerObjectPooladd_safe_destroy_task(*task))) { if (REACH_TIME_INTERVAL(1_min)) { // every minute LOG_WARN("add safe destroy task failed, retry", K(ret), KPC(task)); } @@ -910,10 +915,14 @@ int ObLSService::remove_ls( abs_timeout_ts))) { LOG_WARN("get timeout ts failed", KR(ret)); } else { + ObGarbageCollector *gc_service = MTL(logservice::ObGarbageCollector *); ObMutexGuardWithTimeout change_guard(change_lock_, abs_timeout_ts); if (OB_FAIL(change_guard.get_ret())) { LOG_WARN("lock failed, try again later", K(ret)); ret = OB_EAGAIN; + } else if (OB_ISNULL(gc_service)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("gc service is null", K(ret)); } else if (OB_FAIL(get_ls(ls_id, handle, ObLSGetMod::TXSTORAGE_MOD))) { if (ret == OB_LS_NOT_EXIST) { ret = OB_SUCCESS; @@ -951,7 +960,7 @@ int ObLSService::remove_ls( } else { remove_ls_(ls); // try until success. - while (OB_FAIL(SAFE_DESTROY_INSTANCE.push(*task))) { + while (OB_FAIL(gc_service->add_safe_destroy_task(*task))) { if (REACH_TIME_INTERVAL(1_min)) { // every minute LOG_WARN("add safe destroy task failed, retry", K(ret), KPC(task)); } @@ -1196,8 +1205,12 @@ int ObLSService::check_ls_waiting_safe_destroy(const share::ObLSID &ls_id, bool } else if (ATOMIC_LOAD(&safe_ls_destroy_task_cnt_) == 0) { // there is no ls waiting safe destroy } else { + ObGarbageCollector *gc_service = MTL(logservice::ObGarbageCollector *); ObSafeDestroyCheckLSExist fn(ls_id); - if (OB_FAIL(SAFE_DESTROY_INSTANCE.for_each(fn))) { + if (OB_ISNULL(gc_service)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("gc service is null", K(ret)); + } else if (OB_FAIL(gc_service->safe_destroy_task_for_each(fn))) { LOG_WARN("check ls waiting safe destroy failed", K(ret), K(ls_id)); } else if (OB_FAIL(fn.get_ret_code())) { LOG_WARN("the check process failed", K(ret), K(ls_id)); diff --git a/src/observer/ob_safe_destroy_thread.cpp b/src/storage/tx_storage/ob_safe_destroy_handler.cpp similarity index 82% rename from src/observer/ob_safe_destroy_thread.cpp rename to src/storage/tx_storage/ob_safe_destroy_handler.cpp index 67570d4555..da79e9b0b5 100644 --- a/src/observer/ob_safe_destroy_thread.cpp +++ b/src/storage/tx_storage/ob_safe_destroy_handler.cpp @@ -11,11 +11,11 @@ */ #define USING_LOG_PREFIX SERVER -#include "observer/ob_safe_destroy_thread.h" +#include "storage/tx_storage/ob_safe_destroy_handler.h" namespace oceanbase { -namespace observer +namespace storage { void ObSafeDestroyTask::set_receive_timestamp(const int64_t receive_timestamp) @@ -148,53 +148,45 @@ void ObSafeDestroyTaskQueue::destroy() looping_ = false; } -ObSafeDestroyThread::ObSafeDestroyThread() +ObSafeDestroyHandler::ObSafeDestroyHandler() : is_inited_(false), queue_(), - timer_(), - check_task_(queue_) + last_process_timestamp_(0) {} -ObSafeDestroyThread::~ObSafeDestroyThread() +ObSafeDestroyHandler::~ObSafeDestroyHandler() { destroy(); } -int ObSafeDestroyThread::init() +int ObSafeDestroyHandler::init() { int ret = OB_SUCCESS; if (IS_INIT) { ret = OB_INIT_TWICE; LOG_WARN("safe destroy thread init twice.", K(ret)); - } else if (OB_FAIL(timer_.init("SafeDestroy"))) { - LOG_WARN("timer init failed", K(ret)); } else if (OB_FAIL(queue_.init())) { LOG_WARN("queue init failed", K(ret)); } else { + last_process_timestamp_ = ObTimeUtility::current_time(); is_inited_ = true; } return ret; } -int ObSafeDestroyThread::start() +int ObSafeDestroyHandler::start() { int ret = OB_SUCCESS; if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("safe destroy thread not inited", K(ret)); - } else if (OB_FAIL(timer_.start())) { - LOG_WARN("timer start failed", K(ret)); - } else if (OB_FAIL(timer_.schedule(check_task_, - TASK_SCHEDULER_INTERVAL, /* repeat interval*/ - true /* repeat */))) { - LOG_WARN("schedule timer check task failed", K(ret)); } else { - LOG_INFO("ObSafeDestroyThread start"); + LOG_INFO("ObSafeDestroyHandler start"); } return ret; } -int ObSafeDestroyThread::stop() +int ObSafeDestroyHandler::stop() { int ret = OB_SUCCESS; if (IS_NOT_INIT) { @@ -204,12 +196,12 @@ int ObSafeDestroyThread::stop() queue_.stop(); // we only stop the queue to prevent push task into the queue. // the timer will be stop at the wait function. - LOG_INFO("ObSafeDestroyThread stopped"); + LOG_INFO("ObSafeDestroyHandler stopped"); } return ret; } -void ObSafeDestroyThread::wait() +void ObSafeDestroyHandler::wait() { static const int64_t SLEEP_TS = 100 * 1000; // 100_ms int64_t start_ts = ObTimeUtility::current_time(); @@ -220,19 +212,34 @@ void ObSafeDestroyThread::wait() } ob_usleep(SLEEP_TS); } - timer_.stop(); - timer_.wait(); } -void ObSafeDestroyThread::destroy() +void ObSafeDestroyHandler::destroy() { - LOG_INFO("ObSafeDestroyThread::destroy"); + LOG_INFO("ObSafeDestroyHandler::destroy"); is_inited_ = false; + last_process_timestamp_ = 0; queue_.destroy(); - timer_.destroy(); } -int ObSafeDestroyThread::push(ObSafeDestroyTask &task) +int ObSafeDestroyHandler::handle() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + LOG_WARN("safe destroy thread not inited", K(ret)); + } else { + int64_t curr_time = ObTimeUtility::current_time(); + if (curr_time - last_process_timestamp_ >= TASK_SCHEDULER_INTERVAL) { + LOG_INFO("ObSafeDestroyHandler start process"); + queue_.loop(); + last_process_timestamp_ = ObTimeUtility::current_time(); + } + } + return ret; +} + +int ObSafeDestroyHandler::push(ObSafeDestroyTask &task) { int ret = OB_SUCCESS; if (IS_NOT_INIT) { diff --git a/src/observer/ob_safe_destroy_thread.h b/src/storage/tx_storage/ob_safe_destroy_handler.h similarity index 87% rename from src/observer/ob_safe_destroy_thread.h rename to src/storage/tx_storage/ob_safe_destroy_handler.h index 8a64d99e96..aa204e9c0e 100644 --- a/src/observer/ob_safe_destroy_thread.h +++ b/src/storage/tx_storage/ob_safe_destroy_handler.h @@ -22,7 +22,7 @@ namespace oceanbase { -namespace observer +namespace storage { class ObSafeDestroyTask { @@ -154,51 +154,37 @@ int ObSafeDestroyTaskQueue::for_each(Function &fn) return ret; } -class ObSafeDestroyThread +class ObSafeDestroyHandler { const static int64_t TASK_SCHEDULER_INTERVAL = 2 * 1000 * 1000; // 2_s public: - ObSafeDestroyThread(); - ~ObSafeDestroyThread(); + ObSafeDestroyHandler(); + ~ObSafeDestroyHandler(); int init(); int start(); int stop(); void wait(); void destroy(); + int handle(); // add a task into the thread // task will be execute every TASK_SCHEDULER_INTERVAL int push(ObSafeDestroyTask &task); - static OB_INLINE ObSafeDestroyThread &get_instance(); + static OB_INLINE ObSafeDestroyHandler &get_instance(); // For each. // Call fn on every element of this task queue. // fn: bool operator()(const Task &task); // If operator() returns false, for_each() would stop immediately. template int for_each(Function &fn); - - class SafeDestroyTimerTask : public common::ObTimerTask - { - public: - SafeDestroyTimerTask(ObSafeDestroyTaskQueue &queue) - : queue_(queue) - {} - void runTimerTask() - { queue_.loop(); } - private: - ObSafeDestroyTaskQueue &queue_; - }; private: bool is_inited_; // push the safe destroy task into the queue. ObSafeDestroyTaskQueue queue_; - // timer used to process the check task - common::ObTimer timer_; - // process the safe to destroy task at queue_; - SafeDestroyTimerTask check_task_; + int64_t last_process_timestamp_; }; template -int ObSafeDestroyThread::for_each(Function &fn) +int ObSafeDestroyHandler::for_each(Function &fn) { int ret = OB_SUCCESS; if (IS_NOT_INIT) { @@ -212,13 +198,6 @@ int ObSafeDestroyThread::for_each(Function &fn) return ret; } -OB_INLINE ObSafeDestroyThread &ObSafeDestroyThread::get_instance() -{ - static ObSafeDestroyThread instance; - return instance; -} - -#define SAFE_DESTROY_INSTANCE (::oceanbase::observer::ObSafeDestroyThread::get_instance()) } // observer } // oceanbase diff --git a/unittest/storage/blocksstable/ob_multi_version_sstable_test.h b/unittest/storage/blocksstable/ob_multi_version_sstable_test.h index 274e09ac8a..504a1f8f10 100644 --- a/unittest/storage/blocksstable/ob_multi_version_sstable_test.h +++ b/unittest/storage/blocksstable/ob_multi_version_sstable_test.h @@ -33,7 +33,6 @@ #include "storage/tx_storage/ob_tenant_freezer.h" #include "mtlenv/mock_tenant_module_env.h" #include "storage/test_dml_common.h" -#include "observer/ob_safe_destroy_thread.h" #include "share/ob_simple_mem_limit_getter.h" #include "../mockcontainer/mock_ob_iterator.h" #include "storage/tablet/ob_tablet_create_sstable_param.h" @@ -226,8 +225,6 @@ void ObMultiVersionSSTableTest::SetUpTestCase() int ret = OB_SUCCESS; ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); ObServerCheckpointSlogHandler::get_instance().is_started_ = true; //OK(init_io_device("multi_version_test")); @@ -247,9 +244,6 @@ void ObMultiVersionSSTableTest::TearDownTestCase() //ObIODeviceWrapper::get_instance().destroy(); OB_STORE_CACHE.destroy(); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); MockTenantModuleEnv::get_instance().destroy(); } diff --git a/unittest/storage/test_compaction_policy.cpp b/unittest/storage/test_compaction_policy.cpp index fb9d15673c..3a77008886 100644 --- a/unittest/storage/test_compaction_policy.cpp +++ b/unittest/storage/test_compaction_policy.cpp @@ -27,7 +27,6 @@ #include "storage/compaction/ob_partition_merge_policy.h" #include "storage/meta_mem/ob_tenant_meta_mem_mgr.h" #include "mtlenv/mock_tenant_module_env.h" -#include "observer/ob_safe_destroy_thread.h" #include "storage/tablet/ob_tablet_create_delete_helper.h" #include "storage/tablet/ob_tablet_table_store_flag.h" #include "storage/test_dml_common.h" @@ -222,9 +221,6 @@ void TestCompactionPolicy::SetUpTestCase() ret = MockTenantModuleEnv::get_instance().init(); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.init(); - SAFE_DESTROY_INSTANCE.start(); - // ls service cannot service before ObServerCheckpointSlogHandler starts running ObServerCheckpointSlogHandler::get_instance().is_started_ = true; // create ls @@ -249,10 +245,6 @@ void TestCompactionPolicy::TearDownTestCase() ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); - SAFE_DESTROY_INSTANCE.stop(); - SAFE_DESTROY_INSTANCE.wait(); - SAFE_DESTROY_INSTANCE.destroy(); - MockTenantModuleEnv::get_instance().destroy(); }