Skip to content

Commit 7406f7f

Browse files
authored
[BugFix] Fix possible dead lock in LoadJobStatsListener (#48146)
Signed-off-by: shuming.li <[email protected]>
1 parent fe41c83 commit 7406f7f

File tree

2 files changed

+15
-15
lines changed

2 files changed

+15
-15
lines changed

fe/fe-core/src/main/java/com/starrocks/listener/LoadJobMVListener.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,14 @@ private void doTriggerToRefreshRelatedMVs(Database db, Table table) throws DdlEx
130130
mvIdIterator.remove();
131131
continue;
132132
}
133-
mvDb.readLock();
134-
try {
135-
if (materializedView.shouldTriggeredRefreshBy(db.getFullName(), table.getName())) {
136-
LOG.info("Trigger auto materialized view refresh because of base table {} has changed, " +
137-
"db:{}, mv:{}", table.getName(), mvDb.getFullName(),
138-
materializedView.getName());
139-
GlobalStateMgr.getCurrentState().getLocalMetastore().refreshMaterializedView(
140-
mvDb.getFullName(), mvDb.getTable(mvId.getId()).getName(), false, null,
141-
Constants.TaskRunPriority.NORMAL.value(), true, false);
142-
}
143-
} finally {
144-
mvDb.readUnlock();
133+
// It's fine to no lock here, since it's not a critical operation and can be retried.
134+
if (materializedView.shouldTriggeredRefreshBy(db.getFullName(), table.getName())) {
135+
LOG.info("Trigger auto materialized view refresh because of base table {} has changed, " +
136+
"db:{}, mv:{}", table.getName(), mvDb.getFullName(),
137+
materializedView.getName());
138+
GlobalStateMgr.getCurrentState().getLocalMetastore().refreshMaterializedView(
139+
mvDb.getFullName(), mvDb.getTable(mvId.getId()).getName(), false, null,
140+
Constants.TaskRunPriority.NORMAL.value(), true, false);
145141
}
146142
}
147143
}

fe/fe-core/src/main/java/com/starrocks/load/InsertOverwriteJobRunner.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,11 @@ private void gc(boolean isReplay) {
387387

388388
private void doCommit(boolean isReplay) {
389389
Database db = getAndWriteLockDatabase(dbId);
390-
OlapTable targetTable = checkAndGetTable(db, tableId);
390+
OlapTable tmpTargetTable = null;
391391
try {
392+
// try exception to release write lock finally
393+
final OlapTable targetTable = checkAndGetTable(db, tableId);
394+
tmpTargetTable = targetTable;
392395
List<String> sourcePartitionNames = job.getSourcePartitionIds().stream()
393396
.map(partitionId -> targetTable.getPartition(partitionId).getName())
394397
.collect(Collectors.toList());
@@ -438,8 +441,9 @@ private void doCommit(boolean isReplay) {
438441
db.writeUnlock();
439442
}
440443

441-
// trigger listeners after insert overwrite committed.
442-
GlobalStateMgr.getCurrentState().getOperationListenerBus().onInsertOverwriteJobCommitFinish(db, targetTable);
444+
// trigger listeners after insert overwrite committed, trigger listeners after
445+
// write unlock to avoid holding lock too long
446+
GlobalStateMgr.getCurrentState().getOperationListenerBus().onInsertOverwriteJobCommitFinish(db, tmpTargetTable);
443447
}
444448

445449
private void prepareInsert() {

0 commit comments

Comments
 (0)