This is an automated email from the ASF dual-hosted git repository. lijibing 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 033220edb6b [fix](statistics)Fix clear stale mv row count bug. (#41653) (#41805) 033220edb6b is described below commit 033220edb6bf18fe14b55d07552af615014d4d29 Author: Jibing-Li <64681310+jibing...@users.noreply.github.com> AuthorDate: Mon Oct 14 19:00:33 2024 +0800 [fix](statistics)Fix clear stale mv row count bug. (#41653) (#41805) backport: https://github.com/apache/doris/pull/41653 --- .../java/org/apache/doris/catalog/OlapTable.java | 8 ++++++ .../apache/doris/statistics/TableStatsMeta.java | 15 +++++----- .../doris/statistics/TableStatsMetaTest.java | 33 ++++++++++++++++++++++ .../suites/statistics/test_analyze_mv.groovy | 24 ++++++++++++++++ 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index a84e8a09368..5876611b4ec 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -718,6 +718,14 @@ public class OlapTable extends Table { return result; } + public List<Long> getIndexIdList() { + List<Long> result = Lists.newArrayList(); + for (Long indexId : indexIdToMeta.keySet()) { + result.add(indexId); + } + return result; + } + // schema public Map<Long, List<Column>> getIndexIdToSchema() { return getIndexIdToSchema(Util.showHiddenColumns()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java index d0673998b54..f39ad452e03 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java @@ -227,18 +227,19 @@ public class TableStatsMeta implements Writable, GsonPostProcessable { return indexesRowCount.getOrDefault(indexId, -1L); } - public void clearIndexesRowCount() { - indexesRowCount.clear(); - } - - private void clearStaleIndexRowCount(OlapTable table) { + protected void clearStaleIndexRowCount(OlapTable table) { Iterator<Long> iterator = indexesRowCount.keySet().iterator(); - List<Long> indexIds = table.getIndexIds(); + List<Long> indexIds = table.getIndexIdList(); while (iterator.hasNext()) { long key = iterator.next(); - if (indexIds.contains(key)) { + if (!indexIds.contains(key)) { iterator.remove(); } } } + + // For unit test only. + protected void addIndexRowForTest(long indexId, long rowCount) { + indexesRowCount.put(indexId, rowCount); + } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java index 7532884f400..60e3a848d58 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java @@ -19,11 +19,15 @@ package org.apache.doris.statistics; import org.apache.doris.catalog.OlapTable; +import com.google.common.collect.Lists; +import mockit.Mock; +import mockit.MockUp; import mockit.Mocked; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.HashMap; +import java.util.List; class TableStatsMetaTest { @@ -35,4 +39,33 @@ class TableStatsMetaTest { tableStatsMeta.update(jobInfo, table); Assertions.assertEquals(4, tableStatsMeta.rowCount); } + + @Test + void testClearStaleIndexRowCount() { + TableStatsMeta meta = new TableStatsMeta(); + meta.addIndexRowForTest(1, 1); + meta.addIndexRowForTest(2, 2); + meta.addIndexRowForTest(3, 3); + Assertions.assertEquals(1, meta.getRowCount(1)); + Assertions.assertEquals(2, meta.getRowCount(2)); + Assertions.assertEquals(3, meta.getRowCount(3)); + Assertions.assertEquals(-1, meta.getRowCount(4)); + + new MockUp<OlapTable>() { + @Mock + public List<Long> getIndexIdList() { + List<Long> result = Lists.newArrayList(); + result.add(1L); + return result; + } + }; + + OlapTable table = new OlapTable(); + + meta.clearStaleIndexRowCount(table); + Assertions.assertEquals(1, meta.getRowCount(1)); + Assertions.assertEquals(-1, meta.getRowCount(2)); + Assertions.assertEquals(-1, meta.getRowCount(3)); + Assertions.assertEquals(-1, meta.getRowCount(4)); + } } diff --git a/regression-test/suites/statistics/test_analyze_mv.groovy b/regression-test/suites/statistics/test_analyze_mv.groovy index d7cef1b38a8..e3045f03018 100644 --- a/regression-test/suites/statistics/test_analyze_mv.groovy +++ b/regression-test/suites/statistics/test_analyze_mv.groovy @@ -391,6 +391,30 @@ suite("test_analyze_mv") { assertEquals("5001", result_sample[0][8]) assertEquals("FULL", result_sample[0][9]) + // Test drop mv and other indexes' row still exist. + sql """DROP MATERIALIZED VIEW mv1 ON mvTestAgg;""" + sql """analyze table mvTestAgg with sync;""" + result_row = sql """show index stats mvTestAgg mvTestAgg""" + assertEquals(1, result_row.size()) + assertEquals("mvTestAgg", result_row[0][0]) + assertEquals("mvTestAgg", result_row[0][1]) + assertEquals("5", result_row[0][2]) + result_row = sql """show index stats mvTestAgg mv3""" + assertEquals(1, result_row.size()) + assertEquals("mvTestAgg", result_row[0][0]) + assertEquals("mv3", result_row[0][1]) + assertEquals("5", result_row[0][2]) + result_row = sql """show index stats mvTestAgg mv6""" + assertEquals(1, result_row.size()) + assertEquals("mvTestAgg", result_row[0][0]) + assertEquals("mv6", result_row[0][1]) + assertEquals("4", result_row[0][2]) + result_row = sql """show index stats mvTestAgg rollup1""" + assertEquals(1, result_row.size()) + assertEquals("mvTestAgg", result_row[0][0]) + assertEquals("rollup1", result_row[0][1]) + assertEquals("4", result_row[0][2]) + sql """ CREATE TABLE mvTestUni ( --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org