From ee09f55ca2405a41fd5fb2afc9896d2efef703cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 17:30:14 +0800 Subject: [PATCH] branch-2.1: [fix](mtmv)Fix issue that refreshState turns to init when replaying alterStatus editLog #51439 (#51544) Cherry-picked from #51439 Co-authored-by: zhangdong --- .../java/org/apache/doris/catalog/MTMV.java | 3 ++- .../org/apache/doris/mtmv/MTMVStatus.java | 20 +++++++--------- .../java/org/apache/doris/mtmv/MTMVTest.java | 24 +++++++++++++++++++ 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java index 3be722f18c..ea4e94d5c9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java @@ -182,7 +182,8 @@ public class MTMV extends OlapTable { public MTMVStatus alterStatus(MTMVStatus newStatus) { writeMvLock(); try { - return this.status.updateNotNull(newStatus); + // only can update state, refresh state will be change by add task + return this.status.updateStateAndDetail(newStatus); } finally { writeMvUnlock(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVStatus.java b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVStatus.java index ea05dbc867..b1761b9e97 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVStatus.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVStatus.java @@ -70,18 +70,14 @@ public class MTMVStatus { this.refreshState = refreshState; } - public MTMVStatus updateNotNull(MTMVStatus status) { - Objects.requireNonNull(status); - if (status.getState() != null) { - this.state = status.getState(); - if (this.state == MTMVState.SCHEMA_CHANGE) { - this.schemaChangeDetail = status.getSchemaChangeDetail(); - } else { - this.schemaChangeDetail = null; - } - } - if (status.getRefreshState() != null) { - this.refreshState = status.getRefreshState(); + public MTMVStatus updateStateAndDetail(MTMVStatus status) { + Objects.requireNonNull(status, "status can not be null"); + Objects.requireNonNull(status.getState(), "status.state can not be null"); + this.state = status.getState(); + if (this.state == MTMVState.SCHEMA_CHANGE) { + this.schemaChangeDetail = status.getSchemaChangeDetail(); + } else { + this.schemaChangeDetail = null; } return this; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVTest.java b/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVTest.java index cfe2ac9cb6..b8c438348a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVTest.java @@ -32,6 +32,8 @@ import org.apache.doris.common.util.PropertyAnalyzer; import org.apache.doris.job.common.IntervalUnit; import org.apache.doris.job.extensions.mtmv.MTMVTask; import org.apache.doris.mtmv.MTMVRefreshEnum.BuildMode; +import org.apache.doris.mtmv.MTMVRefreshEnum.MTMVRefreshState; +import org.apache.doris.mtmv.MTMVRefreshEnum.MTMVState; import org.apache.doris.mtmv.MTMVRefreshEnum.RefreshMethod; import org.apache.doris.mtmv.MTMVRefreshEnum.RefreshTrigger; @@ -173,4 +175,26 @@ public class MTMVTest { Assert.assertTrue(excludedTriggerTables.contains(new TableName(null, "db2", "t2"))); Assert.assertTrue(excludedTriggerTables.contains(new TableName(null, null, "t3"))); } + + @Test + public void testAlterStatus() { + MTMV mtmv = new MTMV(); + MTMVStatus status = new MTMVStatus(); + mtmv.setStatus(status); + // test init + Assert.assertEquals(MTMVState.INIT, status.getState()); + Assert.assertEquals(MTMVRefreshState.INIT, status.getRefreshState()); + // test schema change + status.setRefreshState(MTMVRefreshState.SUCCESS); + mtmv.alterStatus(new MTMVStatus(MTMVState.SCHEMA_CHANGE, "base table")); + Assert.assertEquals(MTMVState.SCHEMA_CHANGE, status.getState()); + Assert.assertEquals(MTMVRefreshState.SUCCESS, status.getRefreshState()); + + MTMVStatus alterStatus = new MTMVStatus(); + alterStatus.setState(MTMVState.SCHEMA_CHANGE); + alterStatus.setSchemaChangeDetail("base table"); + mtmv.alterStatus(new MTMVStatus(MTMVState.SCHEMA_CHANGE, "base table")); + Assert.assertEquals(MTMVState.SCHEMA_CHANGE, status.getState()); + Assert.assertEquals(MTMVRefreshState.SUCCESS, status.getRefreshState()); + } }