From d83b66ec6aad6a702233ba1f69d777bfc6a9d81c Mon Sep 17 00:00:00 2001 From: suz-yang Date: Thu, 20 Jun 2024 14:42:44 +0000 Subject: [PATCH] fix get from ddlkv --- ...tablet_ddl_kv_multi_version_row_iterator.h | 179 +++++++++++++++++- 1 file changed, 177 insertions(+), 2 deletions(-) diff --git a/src/storage/ddl/ob_tablet_ddl_kv_multi_version_row_iterator.h b/src/storage/ddl/ob_tablet_ddl_kv_multi_version_row_iterator.h index 9b20344f2..ae89c87a3 100644 --- a/src/storage/ddl/ob_tablet_ddl_kv_multi_version_row_iterator.h +++ b/src/storage/ddl/ob_tablet_ddl_kv_multi_version_row_iterator.h @@ -20,6 +20,175 @@ namespace oceanbase { namespace storage { +class ObSSTableMultiVersionRowGetter; +class ObSSTableMultiVersionRowMultiGetter; + +template +class ObDDLKVEmptyRowIterator : public ObStoreRowIterator +{ +public: + virtual int init( + const ObTableIterParam ¶m, + ObTableAccessContext &context, + ObITable *table, + const void *query_range) + { + return OB_SUCCESS; + } + virtual int get_next_row(const blocksstable::ObDatumRow *&row) { return OB_ITER_END; } +}; + +template <> +class ObDDLKVEmptyRowIterator : public ObStoreRowIterator +{ +public: + ObDDLKVEmptyRowIterator() : range_idx_(0) {} + virtual ~ObDDLKVEmptyRowIterator() {} + virtual void reuse() + { + range_idx_ = 0; + not_exist_row_.reset(); + ObStoreRowIterator::reuse(); + } + virtual void reset() + { + range_idx_ = 0; + not_exist_row_.reset(); + ObStoreRowIterator::reset(); + } + virtual int init( + const ObTableIterParam ¶m, + ObTableAccessContext &context, + ObITable *table, + const void *query_range) + { + int ret = OB_SUCCESS; + if (OB_UNLIKELY(not_exist_row_.is_valid())) { + ret = OB_INIT_TWICE; + STORAGE_LOG(WARN, "init twice", K(ret), KP(this), K(not_exist_row_)); + } else if (OB_ISNULL(query_range)) { + ret = OB_INVALID_ARGUMENT; + STORAGE_LOG(WARN, "invalid args", K(ret), KP(query_range)); + } else { + const ObDatumRowkey *rowkey = static_cast(query_range); + const int64_t column_count = param.get_out_col_cnt(); + if (OB_UNLIKELY(rowkey->get_datum_cnt() > column_count)) { + ret = OB_INVALID_ARGUMENT; + STORAGE_LOG(WARN, "invalid rowkey cnt", K(ret), KPC(rowkey), K(column_count)); + } else if (OB_FAIL(not_exist_row_.init(*context.get_range_allocator(), column_count))) { + STORAGE_LOG(WARN, "fail to init datum row", K(ret)); + } else { + not_exist_row_.row_flag_.reset(); + not_exist_row_.row_flag_.set_flag(ObDmlFlag::DF_NOT_EXIST); + for (int64_t i = 0; i < not_exist_row_.get_column_count(); ++i) { + if (i < rowkey->get_datum_cnt()) { + not_exist_row_.storage_datums_[i] = rowkey->datums_[i]; + } else { + not_exist_row_.storage_datums_[i].set_nop(); + } + } + } + } + return ret; + } + virtual int get_next_row(const blocksstable::ObDatumRow *&row) + { + int ret = OB_SUCCESS; + if (OB_UNLIKELY(!not_exist_row_.is_valid())) { + ret = OB_NOT_INIT; + STORAGE_LOG(WARN, "not init", K(ret), KP(this)); + } else if (range_idx_ == 0) { + ++range_idx_; + row = ¬_exist_row_; + } else { + ret = OB_ITER_END; + } + return ret; + } + +private: + int64_t range_idx_; + blocksstable::ObDatumRow not_exist_row_; +}; + +template <> +class ObDDLKVEmptyRowIterator : public ObStoreRowIterator +{ +public: + ObDDLKVEmptyRowIterator() : range_idx_(0), base_rowkeys_(nullptr) {} + virtual ~ObDDLKVEmptyRowIterator() {} + virtual void reuse() + { + range_idx_ = 0; + not_exist_row_.reset(); + base_rowkeys_ = nullptr; + ObStoreRowIterator::reuse(); + } + virtual void reset() + { + range_idx_ = 0; + not_exist_row_.reset(); + base_rowkeys_ = nullptr; + ObStoreRowIterator::reset(); + } + virtual int init( + const ObTableIterParam ¶m, + ObTableAccessContext &context, + ObITable *table, + const void *query_range) + { + int ret = OB_SUCCESS; + if (OB_UNLIKELY(not_exist_row_.is_valid())) { + ret = OB_INIT_TWICE; + STORAGE_LOG(WARN, "init twice", K(ret), KP(this), K(not_exist_row_)); + } else if (OB_ISNULL(query_range)) { + ret = OB_INVALID_ARGUMENT; + STORAGE_LOG(WARN, "invalid args", K(ret), KP(query_range)); + } else { + base_rowkeys_ = reinterpret_cast *>(query_range); + const int64_t column_count = param.get_out_col_cnt(); + if (OB_FAIL(not_exist_row_.init(*context.get_range_allocator(), column_count))) { + STORAGE_LOG(WARN, "fail to init datum row", K(ret)); + } else { + not_exist_row_.row_flag_.reset(); + not_exist_row_.row_flag_.set_flag(ObDmlFlag::DF_NOT_EXIST); + for (int64_t i = 0; i < not_exist_row_.get_column_count(); ++i) { + not_exist_row_.storage_datums_[i].set_nop(); + } + } + } + return ret; + } + virtual int get_next_row(const blocksstable::ObDatumRow *&row) + { + int ret = OB_SUCCESS; + if (OB_UNLIKELY(!not_exist_row_.is_valid())) { + ret = OB_NOT_INIT; + STORAGE_LOG(WARN, "not init", K(ret), KP(this)); + } else if (range_idx_ < base_rowkeys_->count()) { + const blocksstable::ObDatumRowkey &rowkey = base_rowkeys_->at(range_idx_); + if (OB_UNLIKELY(rowkey.get_datum_cnt() > not_exist_row_.get_column_count())) { + ret = OB_INVALID_ARGUMENT; + STORAGE_LOG(WARN, "invalid rowkey cnt", K(ret), K(rowkey), + K(not_exist_row_.get_column_count())); + } else { + for (int64_t i = 0; i < rowkey.get_datum_cnt(); ++i) { + not_exist_row_.storage_datums_[i] = rowkey.datums_[i]; + } + ++range_idx_; + row = ¬_exist_row_; + } + } else { + ret = OB_ITER_END; + } + return ret; + } + +private: + int64_t range_idx_; + blocksstable::ObDatumRow not_exist_row_; + const common::ObIArray *base_rowkeys_; +}; template class ObDDLKVMultiVersionRowIterator : public ObStoreRowIterator @@ -42,7 +211,7 @@ private: ret = OB_ERR_UNEXPECTED; STORAGE_LOG(WARN, "unexpected ddl memtable is null", K(ret)); } else if (OB_FAIL(iterator_.init(param_, context_, ddl_memtable, query_range_))) { - STORAGE_LOG(WARN, "fail to init", K(ret)); + STORAGE_LOG(WARN, "fail to init iterator", K(ret)); } return ret; } @@ -59,12 +228,14 @@ public: virtual void reuse() { iterator_.reuse(); + empty_iterator_.reuse(); is_empty_ = false; ObStoreRowIterator::reuse(); } virtual void reset() { iterator_.reset(); + empty_iterator_.reset(); is_empty_ = false; ObStoreRowIterator::reset(); } @@ -91,6 +262,9 @@ public: } else { ret = OB_SUCCESS; is_empty_ = true; + if (OB_FAIL(empty_iterator_.init(param, context, nullptr, query_range))) { + STORAGE_LOG(WARN, "fail to init empty ddl memtable", K(ret)); + } } } } @@ -100,7 +274,7 @@ public: { int ret = OB_SUCCESS; if (is_empty_) { - ret = OB_ITER_END; + ret = empty_iterator_.get_next_row(row); } else { ret = iterator_.get_next_row(row); } @@ -109,6 +283,7 @@ public: private: T iterator_; + ObDDLKVEmptyRowIterator empty_iterator_; bool is_empty_; };