This is an automated email from the ASF dual-hosted git repository. zhangchen pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push: new 82ee8b0c7c [fix](meger-on-write) fix query result wrong when schema change (#22044) (#22101) 82ee8b0c7c is described below commit 82ee8b0c7c74f26e21d3d4aa2c3787b4908867a8 Author: Xin Liao <liaoxin...@126.com> AuthorDate: Fri Jul 21 22:41:30 2023 +0800 [fix](meger-on-write) fix query result wrong when schema change (#22044) (#22101) --- be/src/olap/delta_writer.cpp | 63 ++++++++++++++++++++++++------------------- be/src/olap/memtable.cpp | 5 ---- be/src/olap/schema_change.cpp | 2 +- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/be/src/olap/delta_writer.cpp b/be/src/olap/delta_writer.cpp index d13c5b4b08..da2cc7cda7 100644 --- a/be/src/olap/delta_writer.cpp +++ b/be/src/olap/delta_writer.cpp @@ -158,7 +158,13 @@ Status DeltaWriter::init() { if (_tablet->enable_unique_key_merge_on_write()) { std::lock_guard<std::shared_mutex> lck(_tablet->get_header_lock()); _cur_max_version = _tablet->max_version_unlocked().second; - _rowset_ids = _tablet->all_rs_id(_cur_max_version); + // tablet is under alter process. The delete bitmap will be calculated after conversion. + if (_tablet->tablet_state() == TABLET_NOTREADY && + SchemaChangeHandler::tablet_in_converting(_tablet->tablet_id())) { + _rowset_ids.clear(); + } else { + _rowset_ids = _tablet->all_rs_id(_cur_max_version); + } } // check tablet version number @@ -436,36 +442,39 @@ Status DeltaWriter::close_wait(const PSlaveTabletNodes& slave_tablet_nodes, } if (_tablet->enable_unique_key_merge_on_write()) { - auto beta_rowset = reinterpret_cast<BetaRowset*>(_cur_rowset.get()); - std::vector<segment_v2::SegmentSharedPtr> segments; - RETURN_IF_ERROR(beta_rowset->load_segments(&segments)); // tablet is under alter process. The delete bitmap will be calculated after conversion. if (_tablet->tablet_state() == TABLET_NOTREADY && SchemaChangeHandler::tablet_in_converting(_tablet->tablet_id())) { - return Status::OK(); - } - if (segments.size() > 1) { - // calculate delete bitmap between segments - RETURN_IF_ERROR(_tablet->calc_delete_bitmap_between_segments(_cur_rowset, segments, - _delete_bitmap)); - } + LOG(INFO) << "tablet is under alter process, delete bitmap will be calculated later, " + "tablet_id: " + << _tablet->tablet_id() << " txn_id: " << _req.txn_id; + } else { + auto beta_rowset = reinterpret_cast<BetaRowset*>(_cur_rowset.get()); + std::vector<segment_v2::SegmentSharedPtr> segments; + RETURN_IF_ERROR(beta_rowset->load_segments(&segments)); + if (segments.size() > 1) { + // calculate delete bitmap between segments + RETURN_IF_ERROR(_tablet->calc_delete_bitmap_between_segments(_cur_rowset, segments, + _delete_bitmap)); + } - // commit_phase_update_delete_bitmap() may generate new segments, we need to create a new - // transient rowset writer to write the new segments, then merge it back the original - // rowset. - std::unique_ptr<RowsetWriter> rowset_writer; - _tablet->create_transient_rowset_writer(_cur_rowset, &rowset_writer); - RETURN_IF_ERROR(_tablet->commit_phase_update_delete_bitmap( - _cur_rowset, _rowset_ids, _delete_bitmap, segments, _req.txn_id, - rowset_writer.get())); - if (_cur_rowset->tablet_schema()->is_partial_update()) { - // build rowset writer and merge transient rowset - RETURN_IF_ERROR(rowset_writer->flush()); - RowsetSharedPtr transient_rowset = rowset_writer->build(); - _cur_rowset->merge_rowset_meta(transient_rowset->rowset_meta()); - - // erase segment cache cause we will add a segment to rowset - SegmentLoader::instance()->erase_segment(_cur_rowset->rowset_id()); + // commit_phase_update_delete_bitmap() may generate new segments, we need to create a new + // transient rowset writer to write the new segments, then merge it back the original + // rowset. + std::unique_ptr<RowsetWriter> rowset_writer; + _tablet->create_transient_rowset_writer(_cur_rowset, &rowset_writer); + RETURN_IF_ERROR(_tablet->commit_phase_update_delete_bitmap( + _cur_rowset, _rowset_ids, _delete_bitmap, segments, _req.txn_id, + rowset_writer.get())); + if (_cur_rowset->tablet_schema()->is_partial_update()) { + // build rowset writer and merge transient rowset + RETURN_IF_ERROR(rowset_writer->flush()); + RowsetSharedPtr transient_rowset = rowset_writer->build(); + _cur_rowset->merge_rowset_meta(transient_rowset->rowset_meta()); + + // erase segment cache cause we will add a segment to rowset + SegmentLoader::instance()->erase_segment(_cur_rowset->rowset_id()); + } } } Status res = _storage_engine->txn_manager()->commit_txn(_req.partition_id, _tablet, _req.txn_id, diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index 76441a10bc..db8ab6f234 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -460,11 +460,6 @@ Status MemTable::_generate_delete_bitmap(int32_t segment_id) { std::vector<RowsetSharedPtr> specified_rowsets; { std::shared_lock meta_rlock(_tablet->get_header_lock()); - // tablet is under alter process. The delete bitmap will be calculated after conversion. - if (_tablet->tablet_state() == TABLET_NOTREADY && - SchemaChangeHandler::tablet_in_converting(_tablet->tablet_id())) { - return Status::OK(); - } specified_rowsets = _tablet->get_rowset_by_ids(&_mow_context->rowset_ids); } OlapStopWatch watch; diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp index 1fb0353d0e..aff67f68bb 100644 --- a/be/src/olap/schema_change.cpp +++ b/be/src/olap/schema_change.cpp @@ -952,7 +952,7 @@ Status SchemaChangeHandler::_do_process_alter_tablet_v2(const TAlterTabletReqV2& std::lock_guard<std::mutex> rwlock(new_tablet->get_rowset_update_lock()); std::lock_guard<std::shared_mutex> new_wlock(new_tablet->get_header_lock()); SCOPED_SIMPLE_TRACE_IF_TIMEOUT(TRACE_TABLET_LOCK_THRESHOLD); - int64_t new_max_version = new_tablet->max_version().second; + int64_t new_max_version = new_tablet->max_version_unlocked().second; rowsets.clear(); if (max_version < new_max_version) { LOG(INFO) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org