From 5f5ec1c35bb5c26ce6597824e755f035cb9b21a0 Mon Sep 17 00:00:00 2001 From: qiye Date: Tue, 16 Jul 2024 20:32:02 +0800 Subject: [PATCH] [test](build index)Remove index_meta in tablet schema when the index is dropped. (#37646) (#37902) --- be/src/olap/task/index_builder.cpp | 20 ++++ ..._builder_drop_index_fault_injection.groovy | 105 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 regression-test/suites/fault_injection_p0/test_index_builder_drop_index_fault_injection.groovy diff --git a/be/src/olap/task/index_builder.cpp b/be/src/olap/task/index_builder.cpp index 7f2f6af3740ec0..4680bdd0ceac2e 100644 --- a/be/src/olap/task/index_builder.cpp +++ b/be/src/olap/task/index_builder.cpp @@ -18,6 +18,7 @@ #include "olap/task/index_builder.h" #include "common/status.h" +#include "gutil/integral_types.h" #include "olap/rowset/beta_rowset.h" #include "olap/rowset/rowset_writer.h" #include "olap/rowset/rowset_writer_context.h" @@ -68,9 +69,28 @@ Status IndexBuilder::update_inverted_index_info() { // base on input rowset's tablet_schema to build // output rowset's tablet_schema which only remove // the indexes specified in this drop index request + // ATTN: DO NOT REMOVE INDEX AFTER OUTPUT_ROWSET_WRITER CREATED. for (auto t_inverted_index : _alter_inverted_indexes) { output_rs_tablet_schema->remove_index(t_inverted_index.index_id); } + DBUG_EXECUTE_IF("index_builder.update_inverted_index_info.drop_index", { + auto indexes_count = DebugPoints::instance()->get_debug_param_or_default( + "index_builder.update_inverted_index_info.drop_index", "indexes_count", 0); + if (indexes_count < 0) { + return Status::Error( + "indexes count cannot be negative"); + } + int32_t indexes_size = 0; + for (auto index : output_rs_tablet_schema->indexes()) { + if (index.index_type() == IndexType::INVERTED) { + indexes_size++; + } + } + if (indexes_count != indexes_size) { + return Status::Error( + "indexes count not equal to expected"); + } + }) } else { // base on input rowset's tablet_schema to build // output rowset's tablet_schema which only add diff --git a/regression-test/suites/fault_injection_p0/test_index_builder_drop_index_fault_injection.groovy b/regression-test/suites/fault_injection_p0/test_index_builder_drop_index_fault_injection.groovy new file mode 100644 index 00000000000000..bc378727e9a523 --- /dev/null +++ b/regression-test/suites/fault_injection_p0/test_index_builder_drop_index_fault_injection.groovy @@ -0,0 +1,105 @@ +// 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_builder_drop_index_fault_injection", "nonConcurrent") { + def runTest = { indexTbName -> + sql """ insert into ${indexTbName} values(1, "json love anny", "json", "anny",1); """ + sql "sync" + + def show_result = sql_return_maparray "show index from ${indexTbName}" + logger.info("show index from " + indexTbName + " result: " + show_result) + assertEquals(show_result.size(), 4) + assertEquals(show_result[0].Key_name, "index_int") + assertEquals(show_result[1].Key_name, "index_str_k2") + assertEquals(show_result[2].Key_name, "index_str_k4") + assertEquals(show_result[3].Key_name, "index_k5") + + try { + GetDebugPoint().enableDebugPointForAllBEs("segment_iterator._read_columns_by_index", [indexes_count: 3]) + sql "DROP INDEX index_int ON ${indexTbName}" + show_result = sql_return_maparray "show index from ${indexTbName}" + logger.info("show index from " + indexTbName + " result: " + show_result) + assertEquals(show_result.size(), 3) + assertEquals(show_result[0].Key_name, "index_str_k2") + assertEquals(show_result[1].Key_name, "index_str_k4") + assertEquals(show_result[2].Key_name, "index_k5") + } finally { + GetDebugPoint().disableDebugPointForAllBEs("index_builder.update_inverted_index_info.drop_index") + } + + try { + GetDebugPoint().enableDebugPointForAllBEs("segment_iterator._read_columns_by_index", [indexes_count: 2]) + sql "DROP INDEX index_str_k2 ON ${indexTbName}" + show_result = sql_return_maparray "show index from ${indexTbName}" + logger.info("show index from " + indexTbName + " result: " + show_result) + assertEquals(show_result.size(), 2) + assertEquals(show_result[0].Key_name, "index_str_k4") + assertEquals(show_result[1].Key_name, "index_k5") + } finally { + GetDebugPoint().disableDebugPointForAllBEs("index_builder.update_inverted_index_info.drop_index") + } + + try { + GetDebugPoint().enableDebugPointForAllBEs("segment_iterator._read_columns_by_index", [indexes_count: 1]) + sql "DROP INDEX index_str_k4 ON ${indexTbName}" + show_result = sql_return_maparray "show index from ${indexTbName}" + logger.info("show index from " + indexTbName + " result: " + show_result) + assertEquals(show_result.size(), 1) + assertEquals(show_result[0].Key_name, "index_k5") + } finally { + GetDebugPoint().disableDebugPointForAllBEs("index_builder.update_inverted_index_info.drop_index") + } + + try { + GetDebugPoint().enableDebugPointForAllBEs("segment_iterator._read_columns_by_index", [indexes_count: 0]) + sql "DROP INDEX index_k5 ON ${indexTbName}" + show_result = sql_return_maparray "show index from ${indexTbName}" + logger.info("show index from " + indexTbName + " result: " + show_result) + assertEquals(show_result.size(), 0) + } finally { + GetDebugPoint().disableDebugPointForAllBEs("index_builder.update_inverted_index_info.drop_index") + } + } + + def createTestTable = { -> + def indexTbName = "test_index_builder_drop_index_fault_injection" + + sql "DROP TABLE IF EXISTS ${indexTbName}" + sql """ + CREATE TABLE ${indexTbName} + ( + k1 int , + k2 string, + k3 char(50), + k4 varchar(200), + k5 int, + index index_int (k1) using inverted, + index index_str_k2 (k2) using inverted properties("parser"="english","ignore_above"="257"), + index index_str_k4 (k4) using inverted, + index index_k5 (k5) using inverted + ) + DISTRIBUTED BY RANDOM BUCKETS 10 + PROPERTIES("replication_num" = "1"); + """ + + runTest(indexTbName) + } + + createTestTable() +} \ No newline at end of file