This is an automated email from the ASF dual-hosted git repository. yangzhg pushed a commit to branch support_batch_delete_in_fe in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/support_batch_delete_in_fe by this push: new 1813e16 add write and read delete flag in segment 1813e16 is described below commit 1813e1685cd0f3d5d54cd3b4dbdddfb01750c564 Author: yangzhg <yangz...@gmail.com> AuthorDate: Tue Aug 4 17:24:37 2020 +0800 add write and read delete flag in segment --- be/src/olap/reader.cpp | 7 +++--- be/src/olap/row_cursor.h | 2 +- be/src/olap/rowset/segment_v2/segment_writer.cpp | 27 +++++++++++++++++++----- be/src/olap/rowset/segment_v2/segment_writer.h | 4 ++-- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/be/src/olap/reader.cpp b/be/src/olap/reader.cpp index 5a2017f..cca3b2f 100644 --- a/be/src/olap/reader.cpp +++ b/be/src/olap/reader.cpp @@ -411,13 +411,14 @@ OLAPStatus Reader::_unique_key_next_row(RowCursor* row_cursor, MemPool* mem_pool *eof = true; return OLAP_SUCCESS; } - cur_delete_flag = _next_delete_flag; // the verion is in reverse order, the first row is the highest version, // in UNIQUE_KEY highest version is the final result, there is no need to // merge the lower versions - direct_copy_row(row_cursor, *_next_key); - agg_finalize_row(_value_cids, row_cursor, mem_pool); + if (!_next_key->is_delete()) { + direct_copy_row(row_cursor, *_next_key); + agg_finalize_row(_value_cids, row_cursor, mem_pool); + } // skip the lower version rows; while (nullptr != _next_key) { auto res = _collect_iter->next(&_next_key, &_next_delete_flag); diff --git a/be/src/olap/row_cursor.h b/be/src/olap/row_cursor.h index fb77fe7..1678ef4 100644 --- a/be/src/olap/row_cursor.h +++ b/be/src/olap/row_cursor.h @@ -76,7 +76,7 @@ public: void set_is_delete(bool is_delete) { _is_delete = is_delete; } - bool is_delete() { return _is_delete; } + bool is_delete() const { return _is_delete; } // deep copy field content (ignore null-byte) void set_field_content(size_t index, const char* buf, MemPool* mem_pool) { diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index a9f7aba..aa8b2d5 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -25,6 +25,7 @@ #include "olap/rowset/segment_v2/column_writer.h" // ColumnWriter #include "olap/rowset/segment_v2/page_io.h" #include "olap/short_key_index.h" +#include "olap/delete_bitmap_index.h" #include "olap/schema.h" #include "util/crc32c.h" #include "util/faststring.h" @@ -77,7 +78,7 @@ Status SegmentWriter::init(uint32_t write_mbytes_per_sec __attribute__((unused)) _column_writers.push_back(std::move(writer)); } _index_builder.reset(new ShortKeyIndexBuilder(_segment_id, _opts.num_rows_per_block)); - _delete_bitmap_builder.reset(new DeleteBitmapIndexBuilder()); + _delete_index_builder.reset(new DeleteBitmapIndexBuilder()); return Status::OK(); } @@ -99,7 +100,24 @@ Status SegmentWriter::append_row(const RowType& row) { } template Status SegmentWriter::append_row(const RowCursor& row); -template Status SegmentWriter::append_row(const ContiguousRow& row); +template<> Status SegmentWriter::append_row(const ContiguousRow& row) { + for (size_t cid = 0; cid < _column_writers.size(); ++cid) { + auto cell = row.cell(cid); + RETURN_IF_ERROR(_column_writers[cid]->append(cell)); + } + + // At the begin of one block, so add a short key index entry + if ((_row_count % _opts.num_rows_per_block) == 0) { + std::string encoded_key; + encode_key(&encoded_key, row, _tablet_schema->num_short_key_columns()); + RETURN_IF_ERROR(_index_builder->add_item(encoded_key)); + } + if (row.is_delete()) { + RETURN_IF_ERROR(_delete_index_builder->add_delete_item(_row_count)); + } + ++_row_count; + return Status::OK(); +} // TODO(lingbin): Currently this function does not include the size of various indexes, // We should make this more precise. @@ -112,7 +130,6 @@ uint64_t SegmentWriter::estimate_segment_size() { size += column_writer->estimate_buffer_size(); } size += _index_builder->size(); - size += _delete_bitmap_builder->size(); return size; } @@ -186,9 +203,9 @@ Status SegmentWriter::_write_short_key_index() { Status SegmentWriter::_write_delete_index() { std::vector<Slice> body; PageFooterPB footer; - RETURN_IF_ERROR(_delete_bitmap_builder->finalize(&body, &footer)); + RETURN_IF_ERROR(_delete_index_builder->finalize(&body, &footer)); PagePointer pp; - // delete index page is not compressed right now + // short key index page is not compressed right now RETURN_IF_ERROR(PageIO::write_page(_wblock, body, footer, &pp)); pp.to_proto(_footer.mutable_delete_index_page()); return Status::OK(); diff --git a/be/src/olap/rowset/segment_v2/segment_writer.h b/be/src/olap/rowset/segment_v2/segment_writer.h index 8eee044..6093785 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.h +++ b/be/src/olap/rowset/segment_v2/segment_writer.h @@ -25,7 +25,6 @@ #include "common/status.h" // Status #include "gen_cpp/segment_v2.pb.h" #include "gutil/macros.h" -#include "olap/delete_bitmap_index.h" namespace doris { @@ -33,6 +32,7 @@ class RowBlock; class RowCursor; class TabletSchema; class ShortKeyIndexBuilder; +class DeleteBitmapIndexBuilder; namespace fs { class WritableBlock; @@ -90,7 +90,7 @@ private: SegmentFooterPB _footer; std::unique_ptr<ShortKeyIndexBuilder> _index_builder; - std::unique_ptr<DeleteBitmapIndexBuilder> _delete_bitmap_builder; + std::unique_ptr<DeleteBitmapIndexBuilder> _delete_index_builder; std::vector<std::unique_ptr<ColumnWriter>> _column_writers; uint32_t _row_count = 0; }; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org