This is an automated email from the ASF dual-hosted git repository. dataroaring 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 3593b82498 [fix](schema change) Fix fe restart failed because of replay schema change alter job failed (#17825) 3593b82498 is described below commit 3593b82498e83cb2b16febe5723c858dd4133715 Author: YueW <45946325+tany...@users.noreply.github.com> AuthorDate: Fri Mar 17 20:54:50 2023 +0800 [fix](schema change) Fix fe restart failed because of replay schema change alter job failed (#17825) --- .../apache/doris/alter/SchemaChangeHandler.java | 40 ++++++++++++++++++++++ .../org/apache/doris/alter/SchemaChangeJobV2.java | 5 --- .../java/org/apache/doris/master/MasterImpl.java | 4 ++- .../test_dytable_complex_data.groovy | 4 ++- .../suites/index_p0/test_index_meta.groovy | 4 ++- .../inverted_index_p0/test_add_drop_index.groovy | 4 ++- .../test_add_drop_index_ignore_case_column.groovy | 4 ++- .../test_add_drop_index_with_data.groovy | 4 ++- .../test_add_drop_index_with_delete_data.groovy | 4 ++- .../test_index_like_select.groovy | 4 ++- .../test_index_match_term_and_phrase_select.groovy | 4 ++- .../test_index_range_between_select.groovy | 4 ++- .../test_index_range_in_select.groovy | 2 ++ .../test_index_range_not_in_select.groovy | 2 ++ .../test_alter_table_column_nullable.groovy | 1 + 15 files changed, 75 insertions(+), 15 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index ddc72f3ad6..5dfdb6c55f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -1596,9 +1596,35 @@ public class SchemaChangeHandler extends AlterHandler { }); } } + + if (alterJobsV2.isDone()) { + changeTableState(alterJobsV2.getDbId(), alterJobsV2.getTableId(), OlapTableState.NORMAL); + runnableSchemaChangeJobV2.remove(alterJobsV2.getJobId()); + LOG.info("set table's state to NORMAL, table id: {}, job id: {}", alterJobsV2.getTableId(), + alterJobsV2.getJobId()); + } }); } + private void changeTableState(long dbId, long tableId, OlapTableState olapTableState) { + try { + Database db = Env.getCurrentInternalCatalog().getDbOrMetaException(dbId); + OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, Table.TableType.OLAP); + olapTable.writeLockOrMetaException(); + try { + if (olapTable.getState() == olapTableState) { + return; + } else if (olapTable.getState() == OlapTableState.SCHEMA_CHANGE) { + olapTable.setState(olapTableState); + } + } finally { + olapTable.writeUnlock(); + } + } catch (MetaNotFoundException e) { + LOG.warn("[INCONSISTENT META] changing table status failed after schema change job done", e); + } + } + public List<List<Comparable>> getAllAlterJobInfos() { List<List<Comparable>> schemaChangeJobInfos = new LinkedList<>(); for (AlterJobV2 alterJob : ImmutableList.copyOf(alterJobsV2.values())) { @@ -2132,6 +2158,11 @@ public class SchemaChangeHandler extends AlterHandler { if (!schemaChangeJobV2.cancel("user cancelled")) { throw new DdlException("Job can not be cancelled. State: " + schemaChangeJobV2.getJobState()); } + if (schemaChangeJobV2.isDone()) { + changeTableState(schemaChangeJobV2.getDbId(), schemaChangeJobV2.getTableId(), OlapTableState.NORMAL); + LOG.info("set table's state to NORMAL when cancel job, table id: {}, job id: {}", + schemaChangeJobV2.getTableId(), schemaChangeJobV2.getJobId()); + } return; } } @@ -2235,6 +2266,9 @@ public class SchemaChangeHandler extends AlterHandler { while (iterator.hasNext()) { AlterJobV2 alterJobV2 = iterator.next().getValue(); if (alterJobV2.isDone()) { + changeTableState(alterJobV2.getDbId(), alterJobV2.getTableId(), OlapTableState.NORMAL); + LOG.info("set table's state to NORMAL, table id: {}, job id: {}", alterJobV2.getTableId(), + alterJobV2.getJobId()); iterator.remove(); } } @@ -2254,6 +2288,12 @@ public class SchemaChangeHandler extends AlterHandler { runnableSchemaChangeJobV2.put(alterJob.getJobId(), alterJob); } super.replayAlterJobV2(alterJob); + if (alterJob.isDone()) { + changeTableState(alterJob.getDbId(), alterJob.getTableId(), OlapTableState.NORMAL); + runnableSchemaChangeJobV2.remove(alterJob.getJobId()); + LOG.info("set table's state to NORMAL, table id: {}, job id: {}", alterJob.getTableId(), + alterJob.getJobId()); + } } // the invoker should keep table's write lock diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java index 1641fafdfd..db6a2dca59 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java @@ -697,7 +697,6 @@ public class SchemaChangeJobV2 extends AlterJobV2 { private void onFinished(OlapTable tbl) { if (invertedIndexChange) { tbl.setStorageFormat(storageFormat); - tbl.setState(OlapTableState.NORMAL); return; } // replace the origin index with shadow index, set index state as NORMAL @@ -779,8 +778,6 @@ public class SchemaChangeJobV2 extends AlterJobV2 { if (storageFormat == TStorageFormat.V2) { tbl.setStorageFormat(storageFormat); } - - tbl.setState(OlapTableState.NORMAL); } /* @@ -834,8 +831,6 @@ public class SchemaChangeJobV2 extends AlterJobV2 { // update index to oriIndexes, because inverted index updated before WAIT_TXN state. tbl.setIndexes(oriIndexes); } - tbl.setState(OlapTableState.NORMAL); - LOG.info("set table's state to NORMAL when cancel job: {}", tbl.getId(), jobId); } finally { tbl.writeUnlock(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java b/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java index 89c9aff23c..0c7ee5dc3f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java @@ -588,7 +588,9 @@ public class MasterImpl { private void finishAlterInvertedIndexTask(AgentTask task) { AlterInvertedIndexTask alterInvertedIndexTask = (AlterInvertedIndexTask) task; - LOG.info("beigin finish AlterInvertedIndexTask, Jobtype: {}", alterInvertedIndexTask.getJobType()); + LOG.info("beigin finish AlterInvertedIndexTask: {}, JobId: {}, Jobtype: {}", + alterInvertedIndexTask.getSignature(), alterInvertedIndexTask.getJobId(), + alterInvertedIndexTask.getJobType()); // TODO: more check alterInvertedIndexTask.setFinished(true); AgentTaskQueue.removeTask(task.getBackendId(), TTaskType.ALTER_INVERTED_INDEX, task.getSignature()); diff --git a/regression-test/suites/dynamic_table_p0/test_dytable_complex_data.groovy b/regression-test/suites/dynamic_table_p0/test_dytable_complex_data.groovy index 4d871e56e4..2e2028bb60 100644 --- a/regression-test/suites/dynamic_table_p0/test_dytable_complex_data.groovy +++ b/regression-test/suites/dynamic_table_p0/test_dytable_complex_data.groovy @@ -119,7 +119,9 @@ suite("test_dynamic_table", "dynamic_table"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/index_p0/test_index_meta.groovy b/regression-test/suites/index_p0/test_index_meta.groovy index b070731285..abec7ce2cd 100644 --- a/regression-test/suites/index_p0/test_index_meta.groovy +++ b/regression-test/suites/index_p0/test_index_meta.groovy @@ -29,7 +29,9 @@ suite("index_meta", "p0") { alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } sleep(delta_time) } diff --git a/regression-test/suites/inverted_index_p0/test_add_drop_index.groovy b/regression-test/suites/inverted_index_p0/test_add_drop_index.groovy index 8847c6ec48..da4152c752 100644 --- a/regression-test/suites/inverted_index_p0/test_add_drop_index.groovy +++ b/regression-test/suites/inverted_index_p0/test_add_drop_index.groovy @@ -27,7 +27,9 @@ suite("test_add_drop_index", "inverted_index"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_add_drop_index_ignore_case_column.groovy b/regression-test/suites/inverted_index_p0/test_add_drop_index_ignore_case_column.groovy index c17c843f3c..aee3170f3c 100644 --- a/regression-test/suites/inverted_index_p0/test_add_drop_index_ignore_case_column.groovy +++ b/regression-test/suites/inverted_index_p0/test_add_drop_index_ignore_case_column.groovy @@ -27,7 +27,9 @@ suite("test_add_drop_index_with_ignore_case_column", "inverted_index"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_add_drop_index_with_data.groovy b/regression-test/suites/inverted_index_p0/test_add_drop_index_with_data.groovy index 52cce8eeb0..c96b9d3ddb 100644 --- a/regression-test/suites/inverted_index_p0/test_add_drop_index_with_data.groovy +++ b/regression-test/suites/inverted_index_p0/test_add_drop_index_with_data.groovy @@ -27,7 +27,9 @@ suite("test_add_drop_index_with_data", "inverted_index"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_add_drop_index_with_delete_data.groovy b/regression-test/suites/inverted_index_p0/test_add_drop_index_with_delete_data.groovy index f224d1bed8..241778a3d1 100644 --- a/regression-test/suites/inverted_index_p0/test_add_drop_index_with_delete_data.groovy +++ b/regression-test/suites/inverted_index_p0/test_add_drop_index_with_delete_data.groovy @@ -27,7 +27,9 @@ suite("test_add_drop_index_with_delete_data", "inverted_index"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_index_like_select.groovy b/regression-test/suites/inverted_index_p0/test_index_like_select.groovy index c7468c3f97..7be9431e7c 100644 --- a/regression-test/suites/inverted_index_p0/test_index_like_select.groovy +++ b/regression-test/suites/inverted_index_p0/test_index_like_select.groovy @@ -37,7 +37,9 @@ suite("test_index_like_select", "inverted_index_select"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_index_match_term_and_phrase_select.groovy b/regression-test/suites/inverted_index_p0/test_index_match_term_and_phrase_select.groovy index 583c50fc15..13f1be3261 100644 --- a/regression-test/suites/inverted_index_p0/test_index_match_term_and_phrase_select.groovy +++ b/regression-test/suites/inverted_index_p0/test_index_match_term_and_phrase_select.groovy @@ -37,7 +37,9 @@ suite("test_index_match_term_and_phrase_select", "inverted_index_select"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_index_range_between_select.groovy b/regression-test/suites/inverted_index_p0/test_index_range_between_select.groovy index 42362c2d38..80a2ae7bc4 100644 --- a/regression-test/suites/inverted_index_p0/test_index_range_between_select.groovy +++ b/regression-test/suites/inverted_index_p0/test_index_range_between_select.groovy @@ -37,7 +37,9 @@ suite("test_index_range_between_select", "inverted_index_select"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { - break + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break } useTime = t sleep(delta_time) diff --git a/regression-test/suites/inverted_index_p0/test_index_range_in_select.groovy b/regression-test/suites/inverted_index_p0/test_index_range_in_select.groovy index 857a0b8735..1372dc9a6c 100644 --- a/regression-test/suites/inverted_index_p0/test_index_range_in_select.groovy +++ b/regression-test/suites/inverted_index_p0/test_index_range_in_select.groovy @@ -75,6 +75,8 @@ suite("test_index_range_in_select", "inverted_index_select"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) break } useTime = t diff --git a/regression-test/suites/inverted_index_p0/test_index_range_not_in_select.groovy b/regression-test/suites/inverted_index_p0/test_index_range_not_in_select.groovy index 4eed16864c..dd4f33b7ec 100644 --- a/regression-test/suites/inverted_index_p0/test_index_range_not_in_select.groovy +++ b/regression-test/suites/inverted_index_p0/test_index_range_not_in_select.groovy @@ -81,6 +81,8 @@ suite("test_index_range_not_in_select", "inverted_index_select"){ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" alter_res = alter_res.toString() if(alter_res.contains("FINISHED")) { + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) break } useTime = t diff --git a/regression-test/suites/schema_change_p0/test_alter_table_column_nullable.groovy b/regression-test/suites/schema_change_p0/test_alter_table_column_nullable.groovy index 55b9d247d6..35f1f4426f 100644 --- a/regression-test/suites/schema_change_p0/test_alter_table_column_nullable.groovy +++ b/regression-test/suites/schema_change_p0/test_alter_table_column_nullable.groovy @@ -119,6 +119,7 @@ suite("test_alter_table_column_nullable") { while (max_try_secs--) { String res = getJobState(tbName) if (res == "CANCELLED") { + sleep(3000) break } else { Thread.sleep(2000) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org