This is an automated email from the ASF dual-hosted git repository.

cambyzju pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 746c6207fca [fix](index) bitmap and bloomfilter index should not do 
light index change (#35225)
746c6207fca is described below

commit 746c6207fca8aef5f66c29b903d407995fdf1923
Author: camby <[email protected]>
AuthorDate: Wed May 29 10:09:31 2024 +0800

    [fix](index) bitmap and bloomfilter index should not do light index change 
(#35225)
---
 .../olap/rowset/segment_v2/bitmap_index_reader.cpp |  3 +
 .../segment_v2/bloom_filter_index_reader.cpp       |  4 +
 be/src/olap/schema_change.cpp                      | 12 +++
 be/src/olap/tablet_schema.cpp                      | 18 ++++
 be/src/olap/tablet_schema.h                        |  2 +
 .../test_index_ddl_fault_injection.out             | 22 +++++
 .../test_index_ddl_fault_injection.groovy          | 97 ++++++++++++++++++++++
 7 files changed, 158 insertions(+)

diff --git a/be/src/olap/rowset/segment_v2/bitmap_index_reader.cpp 
b/be/src/olap/rowset/segment_v2/bitmap_index_reader.cpp
index c76de68b7ba..fe3609f01ad 100644
--- a/be/src/olap/rowset/segment_v2/bitmap_index_reader.cpp
+++ b/be/src/olap/rowset/segment_v2/bitmap_index_reader.cpp
@@ -24,6 +24,7 @@
 #include <roaring/roaring.hh>
 
 #include "olap/types.h"
+#include "util/debug_points.h"
 #include "vec/columns/column.h"
 #include "vec/common/string_ref.h"
 #include "vec/data_types/data_type.h"
@@ -53,6 +54,8 @@ Status BitmapIndexReader::_load(bool use_page_cache, bool 
kept_in_memory,
 }
 
 Status BitmapIndexReader::new_iterator(BitmapIndexIterator** iterator) {
+    DBUG_EXECUTE_IF("BitmapIndexReader::new_iterator.fail",
+                    { return Status::InternalError("new_iterator for bitmap 
index failed"); });
     *iterator = new BitmapIndexIterator(this);
     return Status::OK();
 }
diff --git a/be/src/olap/rowset/segment_v2/bloom_filter_index_reader.cpp 
b/be/src/olap/rowset/segment_v2/bloom_filter_index_reader.cpp
index c9b74c034ee..0857c1890c4 100644
--- a/be/src/olap/rowset/segment_v2/bloom_filter_index_reader.cpp
+++ b/be/src/olap/rowset/segment_v2/bloom_filter_index_reader.cpp
@@ -22,6 +22,7 @@
 
 #include "olap/rowset/segment_v2/bloom_filter.h"
 #include "olap/types.h"
+#include "util/debug_points.h"
 #include "vec/columns/column.h"
 #include "vec/common/string_ref.h"
 #include "vec/data_types/data_type.h"
@@ -46,6 +47,9 @@ Status BloomFilterIndexReader::_load(bool use_page_cache, 
bool kept_in_memory) {
 }
 
 Status 
BloomFilterIndexReader::new_iterator(std::unique_ptr<BloomFilterIndexIterator>* 
iterator) {
+    DBUG_EXECUTE_IF("BloomFilterIndexReader::new_iterator.fail", {
+        return Status::InternalError("new_iterator for bloom filter index 
failed");
+    });
     iterator->reset(new BloomFilterIndexIterator(this));
     return Status::OK();
 }
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index c5ae7793c47..02f60a993a1 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -765,6 +765,9 @@ Status 
SchemaChangeHandler::_do_process_alter_tablet_v2(const TAlterTabletReqV2&
         for (const auto& column : request.columns) {
             base_tablet_schema->append_column(TabletColumn(column));
         }
+        // The request only include column info, do not include bitmap or 
bloomfilter index info,
+        // So we also need to copy index info from the real base tablet
+        
base_tablet_schema->update_index_info_from(*base_tablet->tablet_schema());
     }
     // Use tablet schema directly from base tablet, they are the newest 
schema, not contain
     // dropped column during light weight schema change.
@@ -1299,6 +1302,15 @@ Status SchemaChangeHandler::_parse_request(const 
SchemaChangeParams& sc_params,
         if (column_mapping->expr != nullptr) {
             *sc_directly = true;
             return Status::OK();
+        } else if (column_mapping->ref_column >= 0) {
+            const auto& column_new = new_tablet_schema->column(i);
+            const auto& column_old = 
base_tablet_schema->column(column_mapping->ref_column);
+            // index changed
+            if (column_new.is_bf_column() != column_old.is_bf_column() ||
+                column_new.has_bitmap_index() != 
column_old.has_bitmap_index()) {
+                *sc_directly = true;
+                return Status::OK();
+            }
         }
     }
 
diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp
index d423ec4d709..a44abedc354 100644
--- a/be/src/olap/tablet_schema.cpp
+++ b/be/src/olap/tablet_schema.cpp
@@ -974,6 +974,24 @@ void TabletSchema::copy_from(const TabletSchema& 
tablet_schema) {
     _table_id = tablet_schema.table_id();
 }
 
+void TabletSchema::update_index_info_from(const TabletSchema& tablet_schema) {
+    for (auto& col : _cols) {
+        if (col->unique_id() < 0) {
+            continue;
+        }
+        const auto iter = 
tablet_schema._field_id_to_index.find(col->unique_id());
+        if (iter == tablet_schema._field_id_to_index.end()) {
+            continue;
+        }
+        int32_t col_idx = iter->second;
+        if (col_idx < 0 || col_idx >= tablet_schema._cols.size()) {
+            continue;
+        }
+        col->set_is_bf_column(tablet_schema._cols[col_idx]->is_bf_column());
+        
col->set_has_bitmap_index(tablet_schema._cols[col_idx]->has_bitmap_index());
+    }
+}
+
 std::string TabletSchema::to_key() const {
     TabletSchemaPB pb;
     to_schema_pb(&pb);
diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h
index 384772375d1..c9e8fdce54e 100644
--- a/be/src/olap/tablet_schema.h
+++ b/be/src/olap/tablet_schema.h
@@ -162,6 +162,7 @@ public:
     int32_t parent_unique_id() const { return _parent_col_unique_id; }
     void set_parent_unique_id(int32_t col_unique_id) { _parent_col_unique_id = 
col_unique_id; }
     void set_is_bf_column(bool is_bf_column) { _is_bf_column = is_bf_column; }
+    void set_has_bitmap_index(bool has_bitmap_index) { _has_bitmap_index = 
has_bitmap_index; }
     std::shared_ptr<const vectorized::IDataType> get_vec_type() const;
 
     void append_sparse_column(TabletColumn column);
@@ -282,6 +283,7 @@ public:
     // Must make sure the row column is always the last column
     void add_row_column();
     void copy_from(const TabletSchema& tablet_schema);
+    void update_index_info_from(const TabletSchema& tablet_schema);
     std::string to_key() const;
     // Don't use.
     // TODO: memory size of TabletSchema cannot be accurately tracked.
diff --git 
a/regression-test/data/fault_injection_p0/test_index_ddl_fault_injection.out 
b/regression-test/data/fault_injection_p0/test_index_ddl_fault_injection.out
new file mode 100644
index 00000000000..6bbc4f12702
--- /dev/null
+++ b/regression-test/data/fault_injection_p0/test_index_ddl_fault_injection.out
@@ -0,0 +1,22 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !order1 --
+1      2       hello
+
+-- !order2 --
+1      2       hello
+
+-- !order3 --
+1      2       hello
+
+-- !order4 --
+1      2       hello
+
+-- !order5 --
+1      2       hello
+
+-- !order6 --
+1      2       hello
+
+-- !order7 --
+1      2       hello
+
diff --git 
a/regression-test/suites/fault_injection_p0/test_index_ddl_fault_injection.groovy
 
b/regression-test/suites/fault_injection_p0/test_index_ddl_fault_injection.groovy
new file mode 100644
index 00000000000..0beef4e80a6
--- /dev/null
+++ 
b/regression-test/suites/fault_injection_p0/test_index_ddl_fault_injection.groovy
@@ -0,0 +1,97 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+suite("test_index_ddl_fault_injection", "nonConcurrent") {
+    try {
+      sql "DROP TABLE IF EXISTS `test_index_ddl_fault_injection_tbl`"
+      sql """
+        CREATE TABLE test_index_ddl_fault_injection_tbl (
+          `k1` int(11) NULL COMMENT "",
+          `k2` int(11) NULL COMMENT "",
+          `v1` string NULL COMMENT ""
+          ) ENGINE=OLAP
+          DUPLICATE KEY(`k1`)
+          DISTRIBUTED BY HASH(`k1`) BUCKETS 1
+          PROPERTIES ( "replication_allocation" = "tag.location.default: 1");
+      """
+
+      sql """ INSERT INTO test_index_ddl_fault_injection_tbl VALUES (1, 2, 
"hello"), (3, 4, "world"); """
+      sql 'sync'
+
+      qt_order1 """ select * from test_index_ddl_fault_injection_tbl where v1 
= 'hello'; """
+
+      // add bloom filter index
+      sql """ ALTER TABLE test_index_ddl_fault_injection_tbl set 
("bloom_filter_columns" = "v1"); """
+      assertEquals("FINISHED", 
getAlterColumnFinalState("test_index_ddl_fault_injection_tbl"))
+
+      try {
+          qt_order2 """ select * from test_index_ddl_fault_injection_tbl where 
v1 = 'hello'; """
+          
GetDebugPoint().enableDebugPointForAllBEs("BloomFilterIndexReader::new_iterator.fail");
+          test {
+            // if BE add bloom filter correctly, this query will call 
BloomFilterIndexReader::new_iterator
+            sql """ select * from test_index_ddl_fault_injection_tbl where v1 
= 'hello'; """
+           exception "new_iterator for bloom filter index failed"
+          }
+      } finally {
+          
GetDebugPoint().disableDebugPointForAllBEs("BloomFilterIndexReader::new_iterator.fail");
+      }
+
+      // drop bloom filter index
+      sql """ ALTER TABLE test_index_ddl_fault_injection_tbl set 
("bloom_filter_columns" = ""); """
+      assertEquals("FINISHED", 
getAlterColumnFinalState("test_index_ddl_fault_injection_tbl"))
+
+      try {
+          qt_order3 """ select * from test_index_ddl_fault_injection_tbl where 
v1 = 'hello'; """
+          
GetDebugPoint().enableDebugPointForAllBEs("BloomFilterIndexReader::new_iterator.fail");
+            // if BE drop bloom filter correctly, this query will not call 
BloomFilterIndexReader::new_iterator
+          qt_order4 """ select * from test_index_ddl_fault_injection_tbl where 
v1 = 'hello'; """
+      } finally {
+          
GetDebugPoint().disableDebugPointForAllBEs("BloomFilterIndexReader::new_iterator.fail");
+      }
+
+      // add bitmap index
+      sql """ ALTER TABLE test_index_ddl_fault_injection_tbl ADD INDEX 
idx_bitmap(v1) USING BITMAP; """
+      assertEquals("FINISHED", 
getAlterColumnFinalState("test_index_ddl_fault_injection_tbl"))
+      try {
+          qt_order5 """ select * from test_index_ddl_fault_injection_tbl where 
v1 = 'hello'; """
+          
GetDebugPoint().enableDebugPointForAllBEs("BitmapIndexReader::new_iterator.fail");
+          test {
+            // if BE add bitmap index correctly, this query will call 
BitmapIndexReader::new_iterator
+            sql """ select * from test_index_ddl_fault_injection_tbl where v1 
= 'hello'; """
+           exception "new_iterator for bitmap index failed"
+          }
+      } finally {
+          
GetDebugPoint().disableDebugPointForAllBEs("BitmapIndexReader::new_iterator.fail");
+      }
+
+      // drop bitmap index
+      sql """ DROP INDEX idx_bitmap ON test_index_ddl_fault_injection_tbl; """
+      assertEquals("FINISHED", 
getAlterColumnFinalState("test_index_ddl_fault_injection_tbl"))
+
+      try {
+          qt_order6 """ select * from test_index_ddl_fault_injection_tbl where 
v1 = 'hello'; """
+          
GetDebugPoint().enableDebugPointForAllBEs("BitmapIndexReader::new_iterator.fail");
+            // if BE drop bitmap index correctly, this query will not call 
BitmapIndexReader::new_iterator
+          qt_order7 """ select * from test_index_ddl_fault_injection_tbl where 
v1 = 'hello'; """
+      } finally {
+          
GetDebugPoint().disableDebugPointForAllBEs("BitmapIndexReader::new_iterator.fail");
+      }
+    } finally {
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to