From f6a6cdd80244c8400cd5f464077b549ec6397250 Mon Sep 17 00:00:00 2001 From: "shenyunlong.syl" Date: Wed, 20 Sep 2023 16:19:15 +0000 Subject: [PATCH] [OBKV] Fix TTL issue 52232705 --- src/observer/table/ttl/ob_table_ttl_task.cpp | 46 +++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/observer/table/ttl/ob_table_ttl_task.cpp b/src/observer/table/ttl/ob_table_ttl_task.cpp index 76f848f92e..44527f5a2f 100644 --- a/src/observer/table/ttl/ob_table_ttl_task.cpp +++ b/src/observer/table/ttl/ob_table_ttl_task.cpp @@ -530,8 +530,12 @@ int ObTableTTLDeleteRowIterator::get_next_row(ObNewRow*& row) int64_t cell_ts = -cell.get_timestamp(); // obhtable timestamp is nagative in ms if ((cell_rowkey != cur_rowkey_) || (cell_qualifier != cur_qualifier_)) { cur_version_ = 1; - cur_rowkey_ = cell_rowkey; - cur_qualifier_ = cell_qualifier; + allocator_.reuse(); + if (OB_FAIL(ob_write_string(allocator_, cell_rowkey, cur_rowkey_))) { + LOG_WARN("fail to copy cell rowkey", KR(ret), K(cell_rowkey)); + } else if (OB_FAIL(ob_write_string(allocator_, cell_qualifier, cur_qualifier_))) { + LOG_WARN("fail to copy cell qualifier", KR(ret), K(cell_qualifier)); + } } else { cur_version_++; } @@ -625,27 +629,45 @@ int ObTableTTLDeleteTask::execute_ttl_delete(ObTableTTLDeleteRowIterator &ttl_ro result.scan_rows_ = ttl_row_iter.scan_cnt_; } } + if (OB_SUCC(ret)) { - ObRowkey row_key; + int64_t rowkey_cnt = ttl_row_iter.rowkey_cell_ids_.count(); if (OB_NOT_NULL(ttl_row_iter.last_row_)) { - if (ttl_row_iter.last_row_->get_count() < ttl_row_iter.get_rowkey_column_cnt()) { + int64_t row_cell_cnt = ttl_row_iter.last_row_->get_count(); + if (row_cell_cnt < rowkey_cnt) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected rowkey column count", K(ttl_row_iter.last_row_->get_count()), K(ttl_row_iter.get_rowkey_column_cnt())); + LOG_WARN("unexpected rowkey column count", KR(ret), K(row_cell_cnt), K(rowkey_cnt)); } else { rowkey_allocator_.reuse(); - row_key.assign(ttl_row_iter.last_row_->cells_, ttl_row_iter.get_rowkey_column_cnt()); - if (OB_FAIL(row_key.deep_copy(rowkey_, rowkey_allocator_))) { - LOG_WARN("fail to deep copy rowkey", KR(ret)); + ObObj *rowkey_buf = nullptr; + common::ObIArray &row_cell_ids = ttl_row_iter.rowkey_cell_ids_; + if (OB_ISNULL(rowkey_buf = static_cast(rowkey_allocator_.alloc(sizeof(ObObj) * rowkey_cnt)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc cells buffer", K(ret), K(rowkey_cnt)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < rowkey_cnt; i++) { + int64_t cell_idx = row_cell_ids.at(i); + if (cell_idx >= row_cell_cnt || cell_idx < 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected cell ids", KR(ret), K(cell_idx), K(row_cell_cnt)); + } else if (OB_FAIL(ob_write_obj(rowkey_allocator_, ttl_row_iter.last_row_->cells_[cell_idx], rowkey_buf[i]))) { + LOG_WARN("fail to copy obj", KR(ret), K(cell_idx), KPC(ttl_row_iter.last_row_->cells_)); + } + } + + if (OB_SUCC(ret)) { + rowkey_.assign(rowkey_buf, rowkey_cnt); + } } } } - if (OB_SUCC(ret) && row_key.is_valid()) { - uint64_t buf_len = row_key.get_serialize_size(); + if (OB_SUCC(ret) && rowkey_.is_valid()) { + uint64_t buf_len = rowkey_.get_serialize_size(); char *buf = static_cast(allocator_.alloc(buf_len)); int64_t pos = 0; - if (OB_FAIL(row_key.serialize(buf, buf_len, pos))) { - LOG_WARN("fail to serialize", K(ret), K(buf_len), K(pos), K(row_key)); + if (OB_FAIL(rowkey_.serialize(buf, buf_len, pos))) { + LOG_WARN("fail to serialize", K(ret), K(buf_len), K(pos), K_(rowkey)); } else { result.end_rowkey_.assign_ptr(buf, buf_len); }