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 <zhangdong@selectdb.com>
This commit is contained in:
github-actions[bot]
2025-06-16 17:30:14 +08:00
committed by GitHub
parent 03b2606696
commit ee09f55ca2
3 changed files with 34 additions and 13 deletions

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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());
}
}