This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 a2a69c3f60a [fix](mtmv)Fix issue that refreshState turns to init when
replaying alterStatus editLog (#51439)
a2a69c3f60a is described below
commit a2a69c3f60ae2466752424349fc086e50681ef04
Author: zhangdong <[email protected]>
AuthorDate: Fri Jun 6 11:22:09 2025 +0800
[fix](mtmv)Fix issue that refreshState turns to init when replaying
alterStatus editLog (#51439)
### What problem does this PR solve?
During Gson deserialization, the no-arg constructor of MTMVStatus is
invoked, which sets refreshState to "init". However, the
org.apache.doris.mtmv.MTMVStatus#updateNotNull method determines which
properties to modify by checking whether each parameter is null. The
unintended side effect is that refreshState, which should remain null,
gets initialized as "init", leading to unexpected behavior
---
.../main/java/org/apache/doris/catalog/MTMV.java | 3 ++-
.../java/org/apache/doris/mtmv/MTMVStatus.java | 20 ++++++++----------
.../test/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 8b04bdd7f6e..2084703989d 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
@@ -184,7 +184,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 ea05dbc8673..b1761b9e973 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 cfe2ac9cb6f..b8c438348ac 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());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]