diff --git a/src/storage/ddl/ob_ddl_merge_task.cpp b/src/storage/ddl/ob_ddl_merge_task.cpp index ff15b3662e..bbe939717b 100755 --- a/src/storage/ddl/ob_ddl_merge_task.cpp +++ b/src/storage/ddl/ob_ddl_merge_task.cpp @@ -539,6 +539,31 @@ int ObTabletDDLUtil::prepare_index_data_desc(ObTablet &tablet, return ret; } +int ObTabletDDLUtil::try_get_first_ddl_sstable(ObTablet &tablet, + blocksstable::ObSSTable *&first_sstable) +{ + int ret = OB_SUCCESS; + first_sstable = nullptr; + ObTableStoreIterator ddl_table_iter; + + ObITable *first_ddl_sstable = nullptr; + if (OB_FAIL(tablet.get_ddl_sstables(ddl_table_iter))) { + LOG_WARN("get ddl sstable handles failed", K(ret)); + } else if (ddl_table_iter.count() > 0) { + if (OB_FAIL(ddl_table_iter.get_boundary_table(false/*is_last*/, first_ddl_sstable))) { + LOG_WARN("failed to get boundary table", K(ret)); + } else if (OB_ISNULL(first_ddl_sstable)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("first_ddl_sstable must not null", K(ret)); + } + } + + if (OB_NOT_NULL(first_ddl_sstable)) { + first_sstable = static_cast(first_ddl_sstable); + } + return ret; +} + int ObTabletDDLUtil::create_ddl_sstable(ObTablet &tablet, const ObTabletDDLParam &ddl_param, const ObIArray &meta_array, diff --git a/src/storage/ddl/ob_ddl_merge_task.h b/src/storage/ddl/ob_ddl_merge_task.h index 2b3e68982e..811484e480 100755 --- a/src/storage/ddl/ob_ddl_merge_task.h +++ b/src/storage/ddl/ob_ddl_merge_task.h @@ -150,7 +150,8 @@ public: const int64_t ddl_format_version, const blocksstable::ObSSTable *first_ddl_sstable, blocksstable::ObDataStoreDesc &data_desc); - + static int try_get_first_ddl_sstable(ObTablet &tablet, + blocksstable::ObSSTable *&first_sstable); static int create_ddl_sstable(ObTablet &tablet, const ObTabletDDLParam &ddl_param, const ObIArray &meta_array, diff --git a/src/storage/ddl/ob_tablet_ddl_kv.cpp b/src/storage/ddl/ob_tablet_ddl_kv.cpp index 2d29ee50ee..0539d5736d 100755 --- a/src/storage/ddl/ob_tablet_ddl_kv.cpp +++ b/src/storage/ddl/ob_tablet_ddl_kv.cpp @@ -688,8 +688,11 @@ int ObDDLKV::close(ObTablet &tablet) ddl_param.start_scn_ = ddl_start_scn_; ddl_param.snapshot_version_ = snapshot_version_; ddl_param.data_format_version_ = data_format_version_; - if (OB_FAIL(ObTabletDDLUtil::create_ddl_sstable(tablet, ddl_param, meta_array, nullptr/*first_ddl_sstable*/, allocator, sstable))) { - LOG_WARN("create ddl sstable failed", K(ret), K(ddl_param)); + ObSSTable *first_sstable = nullptr; + if (OB_FAIL(ObTabletDDLUtil::try_get_first_ddl_sstable(tablet, first_sstable))) { + LOG_WARN("fail to get first sstable", K(ret), K(tablet)); + } else if (OB_FAIL(ObTabletDDLUtil::create_ddl_sstable(tablet, ddl_param, meta_array, first_sstable, allocator, sstable))) { + LOG_WARN("create ddl sstable failed", K(ret), K(ddl_param), KP(first_sstable)); } else if (OB_FAIL(ObTabletDDLUtil::update_ddl_table_store(tablet, ddl_param, allocator, sstable))) { LOG_WARN("update ddl table store failed", K(ret), K(ddl_param), K(sstable)); } else {