From 7203787e74bf79f291f366cf0775eca794635703 Mon Sep 17 00:00:00 2001 From: gaishun Date: Tue, 6 Feb 2024 04:47:14 +0000 Subject: [PATCH] modify error code for buf_not_enough before deep copy ddl_kvs in tablet deserialization. --- .../ob_tenant_storage_checkpoint_writer.cpp | 16 ++++++++++++++-- src/storage/tablet/ob_tablet.cpp | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/storage/slog_ckpt/ob_tenant_storage_checkpoint_writer.cpp b/src/storage/slog_ckpt/ob_tenant_storage_checkpoint_writer.cpp index 366567674b..cb7e39e04c 100644 --- a/src/storage/slog_ckpt/ob_tenant_storage_checkpoint_writer.cpp +++ b/src/storage/slog_ckpt/ob_tenant_storage_checkpoint_writer.cpp @@ -588,7 +588,7 @@ int ObTenantStorageCheckpointWriter::batch_compare_and_swap_tablet(const bool is bool ObTenantStorageCheckpointWriter::ignore_ret(int ret) { - return OB_ALLOCATE_MEMORY_FAILED == ret || OB_DISK_HUNG == ret || OB_TIMEOUT == ret; + return OB_ALLOCATE_MEMORY_FAILED == ret || OB_DISK_HUNG == ret || OB_TIMEOUT == ret || OB_BUF_NOT_ENOUGH == ret; } int ObTenantStorageCheckpointWriter::rollback() @@ -641,6 +641,7 @@ int ObTenantStorageCheckpointWriter::get_tablet_with_addr( int64_t buf_len; char *buf = nullptr; read_info.addr_ = addr_info.new_addr_; + ObTabletPoolType tablet_pool_type = addr_info.tablet_pool_type_; // only need load first-level meta if (addr_info.new_addr_.is_raw_block()) { if (addr_info.new_addr_.size() > ObTabletCommon::MAX_TABLET_FIRST_LEVEL_META_SIZE) { @@ -653,7 +654,7 @@ int ObTenantStorageCheckpointWriter::get_tablet_with_addr( ObSharedBlockReadHandle block_handle(allocator); int64_t pos = 0; if (OB_FAIL(MTL(ObTenantMetaMemMgr*)->acquire_tablet_from_pool( - addr_info.tablet_pool_type_, + tablet_pool_type, WashTabletPriority::WTP_LOW, addr_info.tablet_key_, tablet_handle))) { @@ -671,6 +672,17 @@ int ObTenantStorageCheckpointWriter::get_tablet_with_addr( } else if (OB_FAIL(tablet_handle.get_obj()->deserialize(buf, buf_len, pos))) { LOG_WARN("fail to deserialize tiny tablet", K(ret), K(block_handle), K(addr_info), K(pos)); } + + if (OB_FAIL(ret)) { + if ((OB_BUF_NOT_ENOUGH == ret) && (ObTabletPoolType::TP_NORMAL == tablet_pool_type)) { + tablet_pool_type = ObTabletPoolType::TP_LARGE; + } else if ((OB_BUF_NOT_ENOUGH == ret) && (ObTabletPoolType::TP_NORMAL != tablet_pool_type)) { + ret = OB_ERR_UNEXPECTED; + } else { + // do nothing + } + } + } while (ignore_ret(ret)); return ret; diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 02b439bac8..10b54ee468 100644 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -1986,7 +1986,7 @@ int ObTablet::deserialize( if (OB_NOT_NULL(ddl_kvs_addr)) { const int64_t ddl_kv_size = sizeof(ObDDLKV *) * DDL_KV_ARRAY_SIZE; if (remain < ddl_kv_size) { - ret = OB_ERR_UNEXPECTED; + ret = OB_BUF_NOT_ENOUGH; LOG_WARN("fail to deep copy ddl kv to tablet", K(ret), K(remain), K(ddl_kv_size), K(ddl_kv_count)); } else { ddl_kv_count_ = ddl_kv_count;