From 6e44fa5c0ecdd4d1483333ca74e00d5d009bab91 Mon Sep 17 00:00:00 2001 From: morningman Date: Thu, 14 Mar 2019 20:24:12 +0800 Subject: [PATCH] Fix bug that balance slot may not be released when balance task is done --- .../java/org/apache/doris/clone/TabletSchedCtx.java | 3 +-- .../java/org/apache/doris/clone/TabletScheduler.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java b/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java index 62a9cde8f657c8..f5caa75716efd0 100644 --- a/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java +++ b/fe/src/main/java/org/apache/doris/clone/TabletSchedCtx.java @@ -856,7 +856,6 @@ public void finishCloneTask(CloneTask cloneTask, TFinishTaskRequest request) throw new SchedException(Status.UNRECOVERABLE, e.getMessage()); } throw e; - } finally { db.writeUnlock(); } @@ -1001,7 +1000,7 @@ public int compareTo(TabletSchedCtx o) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("tablet id: ").append(tabletId).append(", status: ").append(tabletStatus.name()); - sb.append(", state: ").append(state.name()); + sb.append(", state: ").append(state.name()).append(", type: ").append(type.name()); if (srcReplica != null) { sb.append(". from backend: ").append(srcReplica.getBackendId()); sb.append(", src path hash: ").append(srcPathHash); diff --git a/fe/src/main/java/org/apache/doris/clone/TabletScheduler.java b/fe/src/main/java/org/apache/doris/clone/TabletScheduler.java index c274a016c60aff..a32211894e084b 100644 --- a/fe/src/main/java/org/apache/doris/clone/TabletScheduler.java +++ b/fe/src/main/java/org/apache/doris/clone/TabletScheduler.java @@ -366,6 +366,12 @@ private void schedulePendingTablets() { if (tabletCtx.getFailedSchedCounter() > 10) { finalizeTabletCtx(tabletCtx, TabletSchedCtx.State.CANCELLED, "schedule failed too many times and " + e.getMessage()); + } else { + // we must release resource it current hold, and be scheduled again + tabletCtx.releaseResource(this); + // adjust priority to avoid some higher priority always be the first in pendingTablets + stat.counterTabletScheduledFailed.incrementAndGet(); + dynamicAdjustPrioAndAddBackToPendingTablets(tabletCtx, e.getMessage()); } } } else { @@ -1253,8 +1259,8 @@ public synchronized long takeAnAvailBalanceSlotFrom(Set pathHashs) { return -1; } - public void freeBalanceSlot(long destPathHash) { - Slot slot = pathSlots.get(destPathHash); + public synchronized void freeBalanceSlot(long pathHash) { + Slot slot = pathSlots.get(pathHash); if (slot == null) { return; }