/** * 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. */ #include "storage/ob_partition_component_factory.h" #include "storage/ob_partition_service.h" #include "storage/memtable/ob_memtable.h" #include "storage/replayengine/ob_log_replay_engine.h" #include "clog/ob_log_replay_engine_wrapper.h" #include "storage/ob_partition_migrator.h" #include "storage/ob_partition_base_data_ob_reader.h" #include "storage/ob_partition_base_data_restore_reader.h" #include "storage/ob_table_mgr.h" #include "storage/ob_replay_status.h" #include "storage/ob_partition_group.h" #include "storage/ob_partition_base_data_backup.h" #include "storage/ob_migrate_macro_block_writer.h" #include "storage/ob_partition_base_data_backup.h" #include "storage/ob_partition_base_data_ob_reader.h" #include "storage/ob_partition_backup.h" #include "share/allocator/ob_tenant_mutil_allocator.h" #include "lib/allocator/ob_pcounter.h" namespace oceanbase { using namespace oceanbase::common; using namespace oceanbase::clog; using namespace oceanbase::transaction; using namespace oceanbase::memtable; using namespace oceanbase::replayengine; using namespace oceanbase::election; namespace storage { ObMemtable* ObPartitionComponentFactory::get_memtable(const uint64_t tenant_id) { ObMemtable* obj = ObMemtableFactory::alloc(tenant_id); if (NULL != obj) { PC_ADD(MT, 1); } return obj; } ObSSTable* ObPartitionComponentFactory::get_sstable(const uint64_t tenant_id) { ObMemAttr memattr(tenant_id, ObModIds::OB_SSTABLE, ObCtxIds::SSTABLE_CTX_ID); return OB_NEW_ALIGN32(ObSSTable, memattr); } ObTransService* ObPartitionComponentFactory::get_trans_service() { return op_alloc(ObTransService); } ObICLogMgr* ObPartitionComponentFactory::get_clog_mgr() { return op_alloc(ObCLogMgr); } ObPartitionService* ObPartitionComponentFactory::get_partition_service() { return op_alloc(ObPartitionService); } ObPartitionStorage* ObPartitionComponentFactory::get_partition_storage(const uint64_t tenant_id) { ObMemAttr memattr(tenant_id, ObModIds::OB_PARTITION_STORAGE, ObCtxIds::STORAGE_LONG_TERM_META_CTX_ID); return OB_NEW_ALIGN32(ObPartitionStorage, memattr); } ObIPartitionGroup* ObPartitionComponentFactory::get_partition(const uint64_t tenant_id) { ObMemAttr memattr(tenant_id, ObModIds::OB_PARTITION, ObCtxIds::STORAGE_LONG_TERM_META_CTX_ID); ObIPartitionGroup* obj = OB_NEW_ALIGN32(ObPartitionGroup, memattr); if (!OB_ISNULL(obj)) { PC_ADD(PT, 1); } return obj; } ObReplayStatus* ObPartitionComponentFactory::get_replay_status(const uint64_t tenant_id) { ObMemAttr memattr(tenant_id, ObModIds::OB_REPLAY_STATUS, ObCtxIds::REPLAY_STATUS_CTX_ID); ObReplayStatus* obj = OB_NEW_ALIGN32(ObReplayStatus, memattr); if (!OB_ISNULL(obj)) { PC_ADD(RT, 1); } return obj; } ObILogReplayEngine* ObPartitionComponentFactory::get_replay_engine() { return op_alloc(ObLogReplayEngine); } ObIElectionMgr* ObPartitionComponentFactory::get_election_mgr() { return op_alloc(ObElectionMgr); } ObIPartitionLogService* ObPartitionComponentFactory::get_log_service(const uint64_t tenant_id) { common::ObILogAllocator* alloc_mgr = NULL; ObIPartitionLogService* ret_ptr = NULL; if (OB_SUCCESS == TMA_MGR_INSTANCE.get_tenant_log_allocator(tenant_id, alloc_mgr)) { ret_ptr = alloc_mgr->alloc_partition_log_service(); } return ret_ptr; } ObLogReplayEngineWrapper* ObPartitionComponentFactory::get_replay_engine_wrapper() { return op_alloc(ObLogReplayEngineWrapper); } ObWarmUpService* ObPartitionComponentFactory::get_warm_up_service() { return op_alloc(ObWarmUpService); } // ObMinorFreeze *ObPartitionComponentFactory::get_minor_freeze() // { // return op_alloc(ObMinorFreeze); // } ObMigrateCtx* ObPartitionComponentFactory::get_migrate_ctx() { return op_alloc(ObMigrateCtx); } ObPhysicalBaseMetaReader* ObPartitionComponentFactory::get_base_data_meta_ob_reader() { return op_alloc(ObPhysicalBaseMetaReader); } ObPartitionMacroBlockObReader* ObPartitionComponentFactory::get_macro_block_ob_reader() { return op_alloc(ObPartitionMacroBlockObReader); } ObPartGroupMigrationTask* ObPartitionComponentFactory::get_part_group_migration_task() { return op_alloc(ObPartGroupMigrationTask); } ObPhysicalBaseMetaRestoreReader* ObPartitionComponentFactory::get_base_data_meta_restore_reader() { return op_alloc(ObPhysicalBaseMetaRestoreReader); } ObPartitionMacroBlockRestoreReader* ObPartitionComponentFactory::get_macro_block_restore_reader() { return op_alloc(ObPartitionMacroBlockRestoreReader); } ObPartitionBaseDataMetaRestoreReader* ObPartitionComponentFactory::get_meta_restore_reader() { return op_alloc(ObPartitionBaseDataMetaRestoreReader); } ObPartitionBaseDataMetaObReader* ObPartitionComponentFactory::get_old_rpc_base_data_meta_reader() { return op_alloc(ObPartitionBaseDataMetaObReader); } ObPGPartitionBaseDataMetaObReader* ObPartitionComponentFactory::get_pg_info_reader() { return op_alloc(ObPGPartitionBaseDataMetaObReader); } ObPGPartitionBaseDataMetaRestorReader* ObPartitionComponentFactory::get_pg_info_restore_reader() { return op_alloc(ObPGPartitionBaseDataMetaRestorReader); } ObPartitionGroupMetaRestoreReader* ObPartitionComponentFactory::get_partition_group_meta_restore_reader() { return op_alloc(ObPartitionGroupMetaRestoreReader); } ObPartGroupBackupTask* ObPartitionComponentFactory::get_part_group_backup_task() { return op_alloc(ObPartGroupBackupTask); } ObPhysicalBaseMetaBackupReader* ObPartitionComponentFactory::get_base_data_meta_backup_reader() { return op_alloc(ObPhysicalBaseMetaBackupReader); } ObPartitionMacroBlockBackupReader* ObPartitionComponentFactory::get_macro_block_backup_reader() { return op_alloc(ObPartitionMacroBlockBackupReader); } ObPartitionBaseDataMetaBackupReader* ObPartitionComponentFactory::get_meta_backup_reader() { return op_alloc(ObPartitionBaseDataMetaBackupReader); } ObPGPartitionBaseDataMetaBackupReader* ObPartitionComponentFactory::get_pg_info_backup_reader() { return op_alloc(ObPGPartitionBaseDataMetaBackupReader); } ObPartitionGroupMetaBackupReader* ObPartitionComponentFactory::get_partition_group_meta_backup_reader() { return op_alloc(ObPartitionGroupMetaBackupReader); } ObPhysicalBaseMetaRestoreReaderV1* ObPartitionComponentFactory::get_base_data_meta_restore_reader_v1() { return op_alloc(ObPhysicalBaseMetaRestoreReaderV1); } ObPartitionMacroBlockRestoreReaderV1* ObPartitionComponentFactory::get_macro_block_restore_reader_v1() { return op_alloc(ObPartitionMacroBlockRestoreReaderV1); } ObPartitionMacroBlockRestoreReaderV2* ObPartitionComponentFactory::get_macro_block_restore_reader_v2() { return op_alloc(ObPartitionMacroBlockRestoreReaderV2); } ObPartitionBaseDataMetaRestoreReaderV1* ObPartitionComponentFactory::get_meta_restore_reader_v1() { return op_alloc(ObPartitionBaseDataMetaRestoreReaderV1); } ObPGPartitionBaseDataMetaRestoreReaderV1* ObPartitionComponentFactory::get_pg_info_restore_reader_v1() { return op_alloc(ObPGPartitionBaseDataMetaRestoreReaderV1); } ObPartitionGroupMetaRestoreReaderV1* ObPartitionComponentFactory::get_partition_group_meta_restore_reader_v1() { return op_alloc(ObPartitionGroupMetaRestoreReaderV1); } ObPartitionGroupMetaRestoreReaderV2* ObPartitionComponentFactory::get_partition_group_meta_restore_reader_v2() { return op_alloc(ObPartitionGroupMetaRestoreReaderV2); } ObPhysicalBaseMetaRestoreReaderV2* ObPartitionComponentFactory::get_base_data_meta_restore_reader_v2() { return op_alloc(ObPhysicalBaseMetaRestoreReaderV2); } ObPGPartitionBaseDataMetaRestoreReaderV2* ObPartitionComponentFactory::get_pg_info_restore_reader_v2() { return op_alloc(ObPGPartitionBaseDataMetaRestoreReaderV2); } ObPhyRestoreMacroIndexStore* ObPartitionComponentFactory::get_phy_restore_macro_index() { return op_alloc(ObPhyRestoreMacroIndexStore); } ObPhyRestoreMacroIndexStoreV2* ObPartitionComponentFactory::get_phy_restore_macro_index_v2() { return op_alloc(ObPhyRestoreMacroIndexStoreV2); } void ObPartitionComponentFactory::free(ObIPartitionGroup* partition) { if (NULL != partition) { OB_DELETE_ALIGN32(ObIPartitionGroup, unused, partition); partition = NULL; PC_ADD(PT, -1); } } void ObPartitionComponentFactory::free(ObReplayStatus* replay_status) { if (NULL != replay_status) { OB_DELETE_ALIGN32(ObReplayStatus, unused, replay_status); replay_status = NULL; PC_ADD(RT, -1); } } void ObPartitionComponentFactory::free(ObSSTable* sstable) { if (NULL != sstable) { OB_DELETE_ALIGN32(ObSSTable, unused, sstable); sstable = NULL; } } void ObPartitionComponentFactory::free(memtable::ObMemtable* memtable) { if (NULL != memtable) { PC_ADD(MT, -1); ObMemtableFactory::free(memtable); memtable = NULL; } } void ObPartitionComponentFactory::free(ObTransService* txs) { op_free(txs); txs = NULL; } void ObPartitionComponentFactory::free(ObICLogMgr* clog_mgr) { op_free(static_cast(clog_mgr)); clog_mgr = NULL; } void ObPartitionComponentFactory::free(ObPartitionService* ptt_service) { op_free(ptt_service); ptt_service = NULL; } void ObPartitionComponentFactory::free(ObPartitionStorage* ptt_storage) { if (NULL != ptt_storage) { OB_DELETE_ALIGN32(ObPartitionStorage, unused, ptt_storage); ptt_storage = NULL; } } void ObPartitionComponentFactory::free(ObILogReplayEngine* rp_eg) { op_free(static_cast(rp_eg)); rp_eg = NULL; } void ObPartitionComponentFactory::free(ObIElectionMgr* election_mgr) { op_free(static_cast(election_mgr)); election_mgr = NULL; } void ObPartitionComponentFactory::free(ObIPartitionLogService* log_service) { if (NULL != log_service) { common::ob_slice_free_partition_log_service(log_service); log_service = NULL; } } void ObPartitionComponentFactory::free(ObLogReplayEngineWrapper* rp_eg) { op_free(static_cast(rp_eg)); rp_eg = NULL; } void ObPartitionComponentFactory::free(ObWarmUpService* warm_up_service) { op_free(warm_up_service); warm_up_service = NULL; } // void ObPartitionComponentFactory::free(ObIPSFreezeCb *minor_freeze) // { // op_free(static_cast(minor_freeze)); // minor_freeze = NULL; // } void ObPartitionComponentFactory::free(ObMigrateCtx* ctx) { component_free(ctx); } void ObPartitionComponentFactory::free(ObIPhysicalBaseMetaReader* reader) { if (NULL != reader) { if (ObIPhysicalBaseMetaReader::BASE_DATA_META_OB_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPhysicalBaseMetaReader::BASE_DATA_META_RESTORE_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPhysicalBaseMetaReader::BASE_DATA_META_OB_COMPAT_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPhysicalBaseMetaReader::BASE_DATA_META_RESTORE_READER_V1 == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPhysicalBaseMetaReader::BASE_DATA_META_RESTORE_READER_V2 == reader->get_type()) { component_free(static_cast(reader)); } else { STORAGE_LOG(ERROR, "unknown reader type", "type", reader->get_type()); } } } void ObPartitionComponentFactory::free(ObIPartitionMacroBlockReader* reader) { if (NULL != reader) { if (ObIPartitionMacroBlockReader::MACRO_BLOCK_OB_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPartitionMacroBlockReader::MACRO_BLOCK_RESTORE_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPartitionMacroBlockReader::MACRO_BLOCK_BACKUP_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPartitionMacroBlockReader::MACRO_BLOCK_RESTORE_READER_V2 == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPartitionMacroBlockReader::MACRO_BLOCK_RESTORE_READER_V1 == reader->get_type()) { component_free(static_cast(reader)); } else { STORAGE_LOG(ERROR, "unknown reader type", "type", reader->get_type()); } } } void ObPartitionComponentFactory::free(ObPartGroupMigrationTask*& task) { component_free(task); task = NULL; } void ObPartitionComponentFactory::free(ObPartitionBaseDataMetaRestoreReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionBaseDataMetaObReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPGPartitionBaseDataMetaObReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPGPartitionBaseDataMetaRestorReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObIPGPartitionBaseDataMetaObReader* reader) { if (NULL != reader) { if (ObIPGPartitionBaseDataMetaObReader::BASE_DATA_META_OB_READER == reader->get_type()) { free(static_cast(reader)); } else if (ObIPGPartitionBaseDataMetaObReader::BASE_DATA_META_OB_RESTORE_READER == reader->get_type()) { free(static_cast(reader)); } else if (ObIPGPartitionBaseDataMetaObReader::BASE_DATA_META_OB_BACKUP_READER == reader->get_type()) { free(static_cast(reader)); } else if (ObIPGPartitionBaseDataMetaObReader::BASE_DATA_META_OB_RESTORE_READER_V1 == reader->get_type()) { free(static_cast(reader)); } else if (ObIPGPartitionBaseDataMetaObReader::BASE_DATA_META_OB_RESTORE_READER_V2 == reader->get_type()) { free(static_cast(reader)); } else { STORAGE_LOG(ERROR, "unknown reader type", "type", reader->get_type()); } } } void ObPartitionComponentFactory::free(ObPartitionGroupMetaRestoreReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartGroupBackupTask*& task) { component_free(task); task = NULL; } void ObPartitionComponentFactory::free(ObPartGroupTask*& task) { if (NULL != task) { if (ObPartGroupTask::PART_GROUP_MIGATION_TASK == task->get_task_type()) { ObPartGroupMigrationTask* tmp_task = static_cast(task); free(tmp_task); task = NULL; } else if (ObPartGroupTask::PART_GROUP_BACKUP_TASK == task->get_task_type()) { ObPartGroupBackupTask* tmp_task = static_cast(task); free(tmp_task); task = NULL; } else { STORAGE_LOG(ERROR, "unknown task type", "type", task->get_task_type()); } } } void ObPartitionComponentFactory::free(ObPhysicalBaseMetaBackupReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionMacroBlockBackupReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionBaseDataMetaBackupReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPGPartitionBaseDataMetaBackupReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionGroupMetaBackupReader* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPhysicalBaseMetaRestoreReaderV1* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionMacroBlockRestoreReaderV2* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionBaseDataMetaRestoreReaderV1* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPGPartitionBaseDataMetaRestoreReaderV1* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPartitionGroupMetaRestoreReaderV1* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObIPartitionGroupMetaRestoreReader* reader) { if (NULL != reader) { if (ObIPartitionGroupMetaRestoreReader::PG_META_RESTORE_READER == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPartitionGroupMetaRestoreReader::PG_META_RESTORE_READER_V1 == reader->get_type()) { component_free(static_cast(reader)); } else if (ObIPartitionGroupMetaRestoreReader::PG_META_RESTORE_READER_V2 == reader->get_type()) { component_free(static_cast(reader)); } else { STORAGE_LOG(ERROR, "unknown reader type", "type", reader->get_type()); } } } void ObPartitionComponentFactory::free(ObPartitionGroupMetaRestoreReaderV2* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPhysicalBaseMetaRestoreReaderV2* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObPGPartitionBaseDataMetaRestoreReaderV2* reader) { component_free(reader); } void ObPartitionComponentFactory::free(ObIPhyRestoreMacroIndexStore* macro_index) { if (NULL != macro_index) { if (ObIPhyRestoreMacroIndexStore::PHY_RESTORE_MACRO_INDEX_STORE_V1 == macro_index->get_type()) { component_free(static_cast(macro_index)); } else if (ObIPhyRestoreMacroIndexStore::PHY_RESTORE_MACRO_INDEX_STORE_V2 == macro_index->get_type()) { component_free(static_cast(macro_index)); } else { STORAGE_LOG(ERROR, "unknown macro index type", "type", macro_index->get_type()); } } } } // namespace storage } // namespace oceanbase