From 86088a1f59103256e8ba587706aec00c1dc43b57 Mon Sep 17 00:00:00 2001 From: chaoyli Date: Tue, 21 May 2019 11:27:29 +0800 Subject: [PATCH 1/2] Add a configuration to force seek for block --- be/src/common/config.h | 4 ++++ be/src/olap/segment_reader.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/be/src/common/config.h b/be/src/common/config.h index fff9e60d3eefb5..271464bf08acb8 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -409,6 +409,10 @@ namespace config { // Is set to true, index loading failure will not causing BE exit, // and the tablet will be marked as bad, so that FE will try to repair it. CONF_Bool(auto_recover_index_loading_failure, "false"); + + // This configuration is used to recover compaction under the corner case. + // If this configuration is set to true, block will seek position. + CONF_Bool(block_seek_position, "false"); } // namespace config } // namespace doris diff --git a/be/src/olap/segment_reader.cpp b/be/src/olap/segment_reader.cpp index 30a8c445051c4d..c05455c1d777ff 100644 --- a/be/src/olap/segment_reader.cpp +++ b/be/src/olap/segment_reader.cpp @@ -835,7 +835,7 @@ OLAPStatus SegmentReader::_create_reader(size_t* buffer_size) { OLAPStatus SegmentReader::_seek_to_block_directly( int64_t block_id, const std::vector& cids) { - if (_at_block_start && block_id == _current_block_id) { + if (!config::block_seek_position && _at_block_start && block_id == _current_block_id) { // no need to execute seek return OLAP_SUCCESS; } From 2bcf65d654d281d6e8ce6ad703dda8be72be2d97 Mon Sep 17 00:00:00 2001 From: chaoyli Date: Wed, 22 May 2019 11:25:56 +0800 Subject: [PATCH 2/2] Fix short key not fill up all space --- be/src/olap/field.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/src/olap/field.h b/be/src/olap/field.h index 1b421efc4e8127..621069ef086dc1 100644 --- a/be/src/olap/field.h +++ b/be/src/olap/field.h @@ -163,7 +163,7 @@ inline int Field::index_cmp(char* left, char* right) const { // so calculate the min of the three size as new compare_size compare_size = std::min(std::min(compare_size, (int)l_slice->size), (int)r_slice->size); res = strncmp(l_slice->data, r_slice->data, compare_size); - if (res == 0) { + if (res == 0 && compare_size != (_index_size - OLAP_STRING_MAX_BYTES)) { if (l_slice->size < r_slice->size) { res = -1; } else if (l_slice->size > r_slice->size) {