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:
committed by
GitHub
parent
03b2606696
commit
ee09f55ca2
@ -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();
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user