enhancement
major
minor
defect
critical
major
minor
major
#30123
Scheduler meldet fälschlich „There is no thread to remove“, wenn der Start eines Tasks scheitert
Problem
Scheitert der Start eines Tasks, bevor sein Thread angelegt wurde, schreibt der Scheduler zusätzlich zum eigentlichen Fehler eine irreführende Fehlermeldung ins Log:
ERROR ... SchedulerEntry There is no thread to remove. SchedulerEntry(task = '...RefreshUsersTask...', state = STARTING, thread = 'null', ...) java.lang.IllegalStateException: There is no thread to remove. ... at com.top_logic.util.sched.entry.SchedulerEntry.removeThread(SchedulerEntry.java) at com.top_logic.util.sched.Scheduler.ensureActiveOrScheduled(Scheduler.java) at com.top_logic.util.sched.Scheduler.tryStartTask(Scheduler.java) ...
Beobachtet wurde das in einem Produktivsystem, als Scheduler.requestClusterLock beim Commit mit einer KnowledgeBaseRuntimeException ("Commit aborted in response to long running concurrent refetch.") scheiterte.
Ursache
Scheduler.tryStartTask fängt Fehler beim Starten eines Tasks ab und ruft ensureActiveOrScheduled auf. Für einen Eintrag im Zustand STARTING ruft diese Methode immer SchedulerEntry.removeThread() auf. Der Thread wird aber erst in startTaskNow angelegt. Scheitert der Start vorher, zum Beispiel beim Anfordern des Cluster-Locks, beim Maintenance-Mode-Check oder am Task-Log, gibt es keinen Thread, und removeThread() meldet einen Fehler.
Lösung
ensureActiveOrScheduled entfernt den Thread im Zustand STARTING nur noch, wenn einer existiert. Der zweite Aufrufer von removeThread(), Scheduler.taskDone, bleibt unverändert. Er wird nur für Einträge im Zustand RUNNING aufgerufen, und die haben immer einen Thread.