From 1dc0c74ad9822b4a9f3e41777f25cbcaf8134e84 Mon Sep 17 00:00:00 2001 From: Jibing-Li <64681310+Jibing-Li@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:36:28 +0800 Subject: [PATCH] [improvement](statistics)Stop analyze quickly after user close auto analyze. #29809 --- .../statistics/StatisticsAutoCollector.java | 26 +++++-- .../StatisticsAutoCollectorTest.java | 71 +++++++++++++++++++ 2 files changed, 90 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java index 0f29d00da1..e2eeb21aad 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java @@ -59,24 +59,32 @@ public class StatisticsAutoCollector extends StatisticsCollector { @Override protected void collect() { - if (!StatisticsUtil.inAnalyzeTime(LocalTime.now(TimeUtils.getTimeZone().toZoneId()))) { - analysisTaskExecutor.clear(); - return; - } - if (StatisticsUtil.enableAutoAnalyze()) { + if (canCollect()) { analyzeAll(); } } - @SuppressWarnings({"rawtypes", "unchecked"}) - private void analyzeAll() { + protected boolean canCollect() { + return StatisticsUtil.enableAutoAnalyze() + && StatisticsUtil.inAnalyzeTime(LocalTime.now(TimeUtils.getTimeZone().toZoneId())); + } + + protected void analyzeAll() { List catalogs = getCatalogsInOrder(); for (CatalogIf ctl : catalogs) { + if (!canCollect()) { + analysisTaskExecutor.clear(); + break; + } if (!ctl.enableAutoAnalyze()) { continue; } List dbs = getDatabasesInOrder(ctl); for (DatabaseIf databaseIf : dbs) { + if (!canCollect()) { + analysisTaskExecutor.clear(); + break; + } if (StatisticConstants.SYSTEM_DBS.contains(databaseIf.getFullName())) { continue; } @@ -109,6 +117,10 @@ public class StatisticsAutoCollector extends StatisticsCollector { List analysisInfos = constructAnalysisInfo(databaseIf); for (AnalysisInfo analysisInfo : analysisInfos) { try { + if (!canCollect()) { + analysisTaskExecutor.clear(); + break; + } analysisInfo = getReAnalyzeRequiredPart(analysisInfo); if (analysisInfo == null) { continue; diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java index 68f83fa3e3..2455581c29 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java @@ -31,6 +31,7 @@ import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.FeConstants; import org.apache.doris.datasource.CatalogIf; +import org.apache.doris.datasource.InternalCatalog; import org.apache.doris.statistics.AnalysisInfo.AnalysisMethod; import org.apache.doris.statistics.AnalysisInfo.AnalysisType; import org.apache.doris.statistics.AnalysisInfo.JobType; @@ -460,4 +461,74 @@ public class StatisticsAutoCollectorTest { Assertions.assertNotNull(task.getTableSample()); } } + + @Test + public void testDisableAuto1() throws Exception { + InternalCatalog catalog1 = new InternalCatalog(); + List catalogs = Lists.newArrayList(); + catalogs.add(catalog1); + + new MockUp() { + @Mock + public List getCatalogsInOrder() { + return catalogs; + } + + @Mock + protected boolean canCollect() { + return false; + } + + }; + + StatisticsAutoCollector sac = new StatisticsAutoCollector(); + new Expectations(catalog1) {{ + catalog1.enableAutoAnalyze(); + times = 0; + }}; + + sac.analyzeAll(); + } + + @Test + public void testDisableAuto2() throws Exception { + InternalCatalog catalog1 = new InternalCatalog(); + List catalogs = Lists.newArrayList(); + catalogs.add(catalog1); + + Database db1 = new Database(); + List> dbs = Lists.newArrayList(); + dbs.add(db1); + + new MockUp() { + int count = 0; + boolean[] canCollectReturn = {true, false}; + @Mock + public List getCatalogsInOrder() { + return catalogs; + } + + @Mock + public List> getDatabasesInOrder(CatalogIf catalog) { + return dbs; + } + + @Mock + protected boolean canCollect() { + return canCollectReturn[count++]; + } + + }; + + StatisticsAutoCollector sac = new StatisticsAutoCollector(); + new Expectations(catalog1, db1) {{ + catalog1.enableAutoAnalyze(); + result = true; + times = 1; + db1.getFullName(); + times = 0; + }}; + + sac.analyzeAll(); + } }