You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by li...@apache.org on 2024/10/14 08:54:20 UTC

(doris) branch master updated: [fix](statistics)Fix clear stale mv row count bug. (#41653)

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

lijibing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new b8b93330a32 [fix](statistics)Fix clear stale mv row count bug. (#41653)
b8b93330a32 is described below

commit b8b93330a3215498eb2254bca3e97a3bc2015b9a
Author: Jibing-Li <64...@users.noreply.github.com>
AuthorDate: Mon Oct 14 16:54:12 2024 +0800

    [fix](statistics)Fix clear stale mv row count bug. (#41653)
    
    When drop an mv, the row count for that mv should be removed in memory
    as well. Before we use OlapTable.getIndexIds to get all index ids, but
    this function always returns null. This pr is to fix this bug, use
    getIndexIdList instead.
---
 .../apache/doris/statistics/TableStatsMeta.java    | 19 ++++++-------
 .../doris/statistics/TableStatsMetaTest.java       | 33 ++++++++++++++++++++++
 .../suites/statistics/test_analyze_mv.groovy       | 24 ++++++++++++++++
 3 files changed, 65 insertions(+), 11 deletions(-)

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 61a5a9b1f88..9c8959d807b 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
@@ -154,10 +154,6 @@ public class TableStatsMeta implements Writable, GsonPostProcessable {
         colToColStatsMeta.remove(Pair.of(indexName, colName));
     }
 
-    public void removeAllColumn() {
-        colToColStatsMeta.clear();
-    }
-
     public Set<Pair<String, String>> analyzeColumns() {
         return colToColStatsMeta.keySet();
     }
@@ -230,21 +226,22 @@ 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);
+    }
+
     public long getBaseIndexDeltaRowCount(OlapTable table) {
         if (colToColStatsMeta == null || colToColStatsMeta.isEmpty() || userInjected) {
             return 0;
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 10e1973aa33..83e68e3090c 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.HashSet;
+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 bb7f5ca8e23..77eb65789cd 100644
--- a/regression-test/suites/statistics/test_analyze_mv.groovy
+++ b/regression-test/suites/statistics/test_analyze_mv.groovy
@@ -387,6 +387,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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org