Scheduler: further investigation but no solution for the emergency-trigger

Last summer, I already identified a problmatic aspect
which could cause the Scheduler to fall idle without further notice:
5b62438eb4

Basically this situation should raise a **Scheduler-Emergency**,
but the only location where it can be easily detected is way down
in the implementation and has currently no clean way of signalling.
Moreover, how to handle a Scheduler-Emergency is likewise an open
question, an will in turn require even more cross-cutting notifications
and trigger actions somewhere at Render-Engine top-level.

By marking the location where this problem could be detected,
inadvertently I broke the SchedulerCommutator_test, which of course
must execute precisely this logic and check for the proper result.

Yet the problem as such is tricky and possibly far-reaching;
notably when processing long-running render jobs will reliably trigger
this situation — unless we establish additional dedicated control-logic
especially to cope with long-running jobs (opened #1382 for this topic)

__Bottom line__: we are far from addressing any of these issues right now,
and thus I reduced that failure to a warning message, so that at least
`SchedulerCommutator_test` passes again (it's not actually a defect there)
This commit is contained in:
Fischlurch 2024-11-15 23:54:46 +01:00
parent 39d614f55f
commit 606669aa1b
4 changed files with 294 additions and 122 deletions

View file

@ -184,6 +184,21 @@ namespace gear {
layer1.feedPrioritisation();
}
/** update queue head to discard obsolete content.
* @param now _current time_ to use for decision about dropping tasks
* @return `false` when failing to establish a consistent state due to
* missed **compulsory** entries; should cause **Emergency halt**.
*/
bool
maintainQueueHead (SchedulerInvocation& layer1, Time now)
{
ENSURE (holdsGroomingToken (thisThread()));
layer1.feedPrioritisation();
while (layer1.isOutdated (now) and not layer1.isOutOfTime(now))
layer1.pullHead();
return not layer1.isOutOfTime(now);
}
/**
* Look into the queues and possibly retrieve work due by now.
* @note transparently discards any outdated entries,
@ -198,17 +213,17 @@ namespace gear {
layer1.feedPrioritisation();
while (layer1.isOutdated (now) and not layer1.isOutOfTime(now))
layer1.pullHead();
if (not maintainQueueHead (layer1,now))
ALERT (engine, "MISSED compulsory job -- should raise Scheduler-Emergency"); //////////////TICKET #1362 : not clear where Scheduler-Emergency is to be handled and how it can be triggered. See Scheduler::triggerEmergency()
else
if (layer1.isDue (now))
{
if (layer1.isOutOfTime(now))
UNIMPLEMENTED ("how to trigger a Scheduler-Emergency from here"); ///////////////////////TICKET #1362 : not clear where Scheduler-Emergency is to be handled and how it can be triggered. See Scheduler::triggerEmergency()
else
return layer1.pullHead();
} }
return layer1.pullHead();
}
return ActivationEvent();
}
/***********************************************************//**
* This is the primary entrance point to the Scheduler.
* Place the given event into the schedule, with prioritisation

View file

@ -278,10 +278,10 @@ namespace gear {
and priority_.top().starting <= waterLevel(now);
}
/** determine if Activity at scheduler head missed it's deadline
/** determine if the Activity at scheduler head missed it's deadline.
* @warning due to memory management, such an Activity must not be dereferenced */
bool
isMissed (Time now) const
isMissed (Time now) const
{
return not priority_.empty()
and waterLevel(now) > priority_.top().deadline;

View file

@ -71,7 +71,7 @@
**
** If however a thread is put to work, it will start dequeuing an entry from
** the head of the [priority queue](\ref SchedulerInvocation::pullHead),
** and start interpreting this entry as a _chain of render activities_ with
** and start interpreting this entry as a _chain of render activities,_ with
** the help of the [»Activity Language«](\ref ActivityLang::dispatchChain).
** In the typical scenario, after some preparatory checks and notifications,
** the thread [transitions into work mode](\ref Scheduler::ExecutionCtx::work),
@ -94,8 +94,10 @@
** @see SchedulerCommutator Layer-2
** @see activity.hpp description of »Render Activities«
**
** @todo WIP 11/2023 »Playback Vertical Slice«
**
** @todo WIP 11/2024 »Playback Vertical Slice«
** - initial version of Scheduler was built and validated by \ref scheduler-stress-test.cpp
** - now awaiting integration with Render-Node invocation and Job-Planning
** - very likely we'll extract a Scheduler-Interface (and this file then becomes a service-impl)
*/
@ -112,11 +114,8 @@
#include "vault/gear/load-controller.hpp"
#include "vault/gear/engine-observer.hpp"
#include "vault/real-clock.hpp"
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
//#include <string>
#include <optional>
#include <utility>
@ -124,8 +123,6 @@
namespace vault{
namespace gear {
// using util::isnil;
// using std::string;
using std::move;
using lib::time::Time;
using lib::time::FSecs;
@ -216,6 +213,9 @@ namespace gear {
/******************************************************//**
* »Scheduler-Service« : coordinate render activities.
* @todo WIP 11/2023
* - largely completed spring 2024
* - passes stress testing with good performance
* - **TODO** further integration will require to extract a Scheduler-Interface
* @see BlockFlow
* @see SchedulerUsage_test
*/
@ -515,6 +515,16 @@ namespace gear {
};
/***********************************************************************//**
* @remark this is the »internal service entrance point« for render workers
* and is implemented by _combining all parts_ of the Scheduler
* - the processing environment of the ActivityLang
* - Layer-1 for queue management
* - Layer-2 for execution
* - the LoadController
*/
inline activity::Proc
Scheduler::doWork()
{
@ -525,7 +535,7 @@ namespace gear {
ExecutionCtx ctx{*this, toDispatch};
return ActivityLang::dispatchChain (toDispatch, ctx);
}
,[this]{ return getSchedTime(); }
,[this] { return getSchedTime(); }
);
}
@ -544,10 +554,10 @@ namespace gear {
*/
inline ScheduleSpec
ScheduleSpec::post()
{ // protect allocation
// auto guard = theScheduler_->layer2_.requireGroomingTokenHere();//////////////////////////////////////TODO can we avoid that?
{ // execute term-builder on-demand...
maybeBuildTerm();
//set up new schedule by retrieving the Activity-chain...
// set up new schedule by retrieving the Activity-chain...
theScheduler_->postChain ({term_->post(), start_
, death_
, manID_
@ -607,7 +617,9 @@ namespace gear {
}
/**
/*****************************************************************//**
* Enqueue for time-bound execution, possibly dispatch immediately.
* This is the »main entrance« to get some Activity scheduled.
* @param actEvent the Activity, start time and deadline
@ -625,7 +637,7 @@ namespace gear {
/**
* »Tick-hook« : code to maintain sane running status.
* »Tick-hook« : code to maintain a sane running status.
* This function will be invoked [regularly](\ref DUTY_CYCLE_PERIOD) while the scheduler
* is actively processing; in fact this function determines when the scheduler falls empty
* and can be shut down and thus regular invocation is equivalent to running state.
@ -645,16 +657,11 @@ namespace gear {
{
auto guard = layer2_.requireGroomingTokenHere();
// consolidate queue content
layer1_.feedPrioritisation();
// clean-up of outdated tasks here
while (layer1_.isOutdated (now) and not layer1_.isOutOfTime(now))
layer1_.pullHead();
// protect against missing the deadline of a compulsory task
if (layer1_.isOutOfTime (now))
{
// consolidate queue and discard outdated tasks
if (not layer2_.maintainQueueHead(layer1_,now))
{ // missed deadline of compulsory task
triggerEmergency();
return; // leave everything as-is
return;// leave everything as-is
}
// clean-up of obsolete Activities

View file

@ -17022,9 +17022,7 @@
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1534519645420" ID="ID_1509280168" MODIFIED="1576282358104" TEXT="&#xfc;bernimmt Funktionen vom ViewLocator">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...weil ich Stand 8/2018 nicht im Stande bin,
@ -17336,9 +17334,7 @@
<node CREATED="1504386535447" ID="ID_426578263" MODIFIED="1557498707222" TEXT="brauche Service zum Erzeugen/L&#xf6;schen"/>
<node CREATED="1504386595679" ID="ID_1383687482" MODIFIED="1576282358103" TEXT="Mutation: brauche Model-Platzhalter">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das Diff wird auf den Platzhalter angewendet
@ -17794,9 +17790,7 @@
</node>
<node CREATED="1664546805728" ID="ID_162637423" MODIFIED="1664547883294" TEXT="Expander typischerweise f&#xfc;r Timeline-Content">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
in diesem Fall ist das dann eine Art Toggle-Button, d.h. er wechselt auch seine Gestalt
@ -18803,9 +18797,7 @@
</node>
<node CREATED="1664404791911" ID="ID_1038149541" MODIFIED="1664486283099">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Nein! minimal und natural size <b>sollten gleich sein</b>
@ -19378,9 +19370,7 @@
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1664055442553" ID="ID_94790418" MODIFIED="1664055480281">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Unterscheidung <i>resize</i>&#160;&#10234; <i>rerender</i>
@ -20525,9 +20515,7 @@
<icon BUILTIN="yes"/>
<node CREATED="1541858031423" ID="ID_1183173385" MODIFIED="1576282358100">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>Standard</i>&#160;UI-Mechanik &#252;berlassen wir GTK
@ -22863,9 +22851,7 @@
</node>
<node CREATED="1563043807392" ID="ID_994687888" MODIFIED="1576282358083" TEXT="Wunsch nur teilweise realisierbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn die CSS-Node-Namen von Custom-Widgets kann man via GTKmm nicht &#228;ndern.
@ -43304,9 +43290,7 @@
</node>
<node COLOR="#435e98" CREATED="1670695125327" ID="ID_91649195" MODIFIED="1670695142557">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
das hier ist die <b>beste Alternative</b>
@ -44596,9 +44580,7 @@
</node>
<node COLOR="#435e98" CREATED="1669683026004" ID="ID_1867241917" MODIFIED="1670015746454" TEXT="Ergebnis ist aber noch nicht plausibel">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
<font face="Monospaced">#--&#9670;--# _raw(win.overallSpan().duration()) ? = 307445734561825860 </font>
@ -46361,9 +46343,7 @@
</node>
<node CREATED="1664669415850" ID="ID_550535214" MODIFIED="1664669442209">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
f&#252;r <i>wirklich generische </i>Styles sollte man generische Klassen schaffen
@ -46587,9 +46567,7 @@
<icon BUILTIN="button_ok"/>
<node CREATED="1448658692023" FOLDED="true" ID="ID_339186676" MODIFIED="1582388523994">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
generisch
@ -46759,9 +46737,7 @@
</node>
<node CREATED="1451177659369" ID="ID_928484705" MODIFIED="1518487921086">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
need to <i>bubble up</i>
@ -47054,9 +47030,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
ist er aber nicht notwendig,
@ -57521,7 +57495,7 @@
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
<node CREATED="1731466941465" ID="ID_1180140959" MODIFIED="1731467103523" TEXT="SchedulerCommutator_test">
<node COLOR="#435e98" CREATED="1731466941465" ID="ID_1180140959" MODIFIED="1731713169275" TEXT="SchedulerCommutator_test">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57537,7 +57511,8 @@
</body>
</html></richcontent>
<node CREATED="1731630625998" ID="ID_481330961" MODIFIED="1731630636457" TEXT="scheitert stets in &#xbb;verify_Significance&#xab;"/>
<node CREATED="1731631526021" ID="ID_433361901" MODIFIED="1731631554237" TEXT="ist ein (unbemerktes) Problem in der Test-Logik">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731631526021" FOLDED="true" ID="ID_433361901" MODIFIED="1731713215197" TEXT="ist ein (ungel&#xf6;stes) Problem im Scheduler">
<icon BUILTIN="info"/>
<node BACKGROUND_COLOR="#dfaf9a" COLOR="#990033" CREATED="1731631607610" ID="ID_1850643707" MODIFIED="1731631706792" TEXT="Test gebrochen seit 5b62438eb &#x2014; 2024-04-10 20:04:53">
<richcontent TYPE="NOTE"><html>
<head/>
@ -57591,11 +57566,10 @@
Thus I'll marked the problematic location and opened #1362
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1731631583470" ID="ID_1893073184" MODIFIED="1731631885052" TEXT="im Rahmen der Stress-Tests entdeckte &#xbb;Situation&#xab;">
<node COLOR="#624456" CREATED="1712710547319" ID="ID_1893073184" LINK="#ID_1932392128" MODIFIED="1731701538658" TEXT="im Rahmen der Stress-Tests entdeckte &#xbb;Situation&#xab;">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57603,11 +57577,21 @@
...die definitiv auftreten kann, und die auf einem h&#246;heren (derzeit nicht existenten) Level der Architektur behandelt werden mu&#223;, als eine <b>Scheduler-Emergency</b>.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node CREATED="1731632078651" ID="ID_912676608" MODIFIED="1731632263641" TEXT="hab damals einfach &#xbb;aufgegeben&#xab; da der Trigger-Punkt unpassenderweise in Layer-2 liegt">
<node CREATED="1731632078651" ID="ID_912676608" MODIFIED="1731694300412">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
hab damals einfach &#187;aufgegeben&#171;,
</p>
<p>
da der Trigger-Punkt <i>unpassenderweise </i>in Layer-2 liegt
</p>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57615,8 +57599,7 @@
...bzw dorthin gezogen ist durch den Umbau der Scheduler-Struktur, welche zwar sp&#228;t erfolgte, als Resultat der Stress-tests, aber insgesamt eine signifikante Verbessung des Codes darstellt. Leider hat dieser Umbau nun dazu gef&#252;hrt, da&#223; Layer-2 diverse &#187;Hooks&#171; auf Service-Level ansprechen mu&#223;, und das ist wiederum ein HInweis, da&#223; die Code-Anordnung nicht optimal ist
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node CREATED="1731632486002" ID="ID_1151089303" MODIFIED="1731632506832" TEXT="es fehlt ein Signalisierungs-Mechanismus"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1731632507425" ID="ID_241976514" MODIFIED="1731632836969" TEXT="dieser w&#xfc;rde &#xfc;ber mehrere Ecken laufen">
<richcontent TYPE="NOTE"><html>
@ -57634,12 +57617,32 @@
</li>
</ul>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1731710016247" ID="ID_1116003187" MODIFIED="1731710023256" TEXT="nochmal im Einzelnen analysiert"/>
<node CREATED="1731710023964" ID="ID_778217189" MODIFIED="1731710032544" TEXT="jede denkbare L&#xf6;sung ist nicht-trivial"/>
<node COLOR="#435e98" CREATED="1731710053533" ID="ID_722076886" MODIFIED="1731713106542" TEXT="denkbar w&#xe4;re zumindest ein Refactoring">
<linktarget COLOR="#23b91f" DESTINATION="ID_722076886" ENDARROW="Default" ENDINCLINATION="1530;2127;" ID="Arrow_ID_1785760257" SOURCE="ID_872583288" STARTARROW="None" STARTINCLINATION="-1253;43;"/>
<linktarget COLOR="#7298c6" DESTINATION="ID_722076886" ENDARROW="Default" ENDINCLINATION="-173;13;" ID="Arrow_ID_1252004977" SOURCE="ID_778660910" STARTARROW="None" STARTINCLINATION="411;21;"/>
<icon BUILTIN="idea"/>
<node COLOR="#338800" CREATED="1731710077230" ID="ID_1009222978" MODIFIED="1731712876022" TEXT="man k&#xf6;nnte die Erkennung dieser Situation in eine Methode auf Layer-1 extrahieren">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731710094764" ID="ID_703081528" MODIFIED="1731712883216" TEXT="aber selbst das setzt eine Entscheidung zur Emergency-Signalisierung voraus">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...und genau diese Entscheidung konnte/wollte ich vor einem halben Jahr nicht treffen (und bin im Moment nicht sicher, ob ich sie jetzt treffen kann)
</p>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731632025178" ID="ID_619384635" MODIFIED="1731632065737">
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731632025178" ID="ID_619384635" LINK="https://issues.lumiera.org/ticket/1362#comment:1" MODIFIED="1731701835497">
<richcontent TYPE="NODE"><html>
<head/>
<body>
@ -57647,22 +57650,17 @@
siehe auch Kommentar im Ticket <b><font color="#be0f18">#1362 Scheduler Emergency</font></b>
</p>
</body>
</html>
</richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
https://issues.lumiera.org/ticket/1362#comment:1
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#d52960" DESTINATION="ID_619384635" ENDARROW="Default" ENDINCLINATION="-2477;105;" ID="Arrow_ID_175149574" SOURCE="ID_100642146" STARTARROW="None" STARTINCLINATION="1042;92;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1731713044750" ID="ID_778660910" MODIFIED="1731713114926" TEXT="nur noch eine Warnung in&apos;s Log &#x27f9; Test l&#xe4;uft wieder">
<arrowlink COLOR="#7298c6" DESTINATION="ID_722076886" ENDARROW="Default" ENDINCLINATION="-173;13;" ID="Arrow_ID_1252004977" STARTARROW="None" STARTINCLINATION="411;21;"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1731466991636" ID="ID_1891507132" MODIFIED="1731467127501" TEXT="SchedulerStress_test">
</node>
<node COLOR="#435e98" CREATED="1731466991636" FOLDED="true" ID="ID_1891507132" MODIFIED="1731713151886" TEXT="SchedulerStress_test">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57701,12 +57699,11 @@
Hier beobachten wir ein lineares Model der Beladung; die lineare Regression hat einen konstanten Sockel(9ms) knapp oberhalb der bisher tolerierten Overheads f&#252;r start-up und spin-down (+Test-setup); erwartet werden ~6ms
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1731628606613" ID="ID_60599371" MODIFIED="1731628607824" TEXT="setup_systematicSchedule">
<node CREATED="1731628628170" ID="ID_1205966126" MODIFIED="1731629092546" TEXT="Scheduler kann einem lockeren Schedule nicht folgen">
<node CREATED="1731628628170" ID="ID_1205966126" MODIFIED="1731712944658" TEXT="Scheduler kann einem lockeren Schedule nicht folgen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57730,8 +57727,7 @@
<i>wenn </i>der Test durl&#228;uft sind die beobachteten Kenndaten des Schedulers wie erwartet
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57739,15 +57735,20 @@
also die Concurrency ist wirklich gut, die back-to-back-Zeit weicht nur 10ms vom theoretischen Wert ab
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731630239332" ID="ID_113082625" MODIFIED="1731630281906" TEXT="Vermutung: der Test l&#xe4;uft &gt; 4min &#x2014; das verletzt das Limit unseres Testsuite-Runners">
<node BACKGROUND_COLOR="#d5e3f2" COLOR="#435e98" CREATED="1731630239332" ID="ID_113082625" MODIFIED="1731691828038" TEXT="Vermutung: der Test l&#xe4;uft &gt; 4min &#x2014; das verletzt das Limit unseres Testsuite-Runners">
<icon BUILTIN="idea"/>
<node CREATED="1731691830301" ID="ID_1709364076" MODIFIED="1731691836711" TEXT="OK OK">
<icon BUILTIN="ksmiletris"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#067d20" CREATED="1731691838838" ID="ID_1445885924" MODIFIED="1731693892048" TEXT="also gibt es jetzt eine &quot;quick&quot;-Variante">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1731624499756" ID="ID_293265001" MODIFIED="1731624683932" TEXT="WorkForce_test">
</node>
<node COLOR="#435e98" CREATED="1731624499756" FOLDED="true" ID="ID_293265001" MODIFIED="1731713159777" TEXT="WorkForce_test">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -57764,8 +57765,7 @@
Dieser Test skaliert den Worker-Pool, wartet dann jeweils eine (fest konfigurierte) Zeitspanne, um anschlie&#223;end den Status zu pr&#252;fen &#8212; ein bekannterma&#223;en fragiles Schema, obwohl ich inzwischen Timings ausgeknobelt habe, die auf meiner Maschine hinreichend sicher sind. F&#252;r zuverl&#228;ssiges Testen m&#252;&#223;te man auf den Status der WorkForce <i>eigens warten, </i>und daf&#252;r m&#246;chte ich jedoch kein Core-API bereitstellen, denn ich m&#246;chte niemanden ermutigen, in Richtung einer &#187;pinball-machine&#171; zu gehen....
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font NAME="SansSerif" SIZE="10"/>
<icon BUILTIN="messagebox_warning"/>
</node>
@ -98442,6 +98442,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#ef2a5d" DESTINATION="ID_1983682769" ENDARROW="Default" ENDINCLINATION="103;86;" ID="Arrow_ID_768141599" SOURCE="ID_1737621678" STARTARROW="None" STARTINCLINATION="96;-6;"/>
<linktarget COLOR="#fe152a" DESTINATION="ID_1983682769" ENDARROW="Default" ENDINCLINATION="714;22;" ID="Arrow_ID_976291150" SOURCE="ID_1354795316" STARTARROW="None" STARTINCLINATION="422;18;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1731704761110" ID="ID_311901570" LINK="#ID_441812703" MODIFIED="1731704817143" TEXT="es gibt mutual-dependency im Zusammenhang mit Scheduler-Emergency-Erkennung"/>
</node>
</node>
</node>
@ -113286,6 +113287,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#6e3e89" DESTINATION="ID_459235865" ENDARROW="Default" ENDINCLINATION="506;31;" ID="Arrow_ID_321080977" SOURCE="ID_1642624688" STARTARROW="None" STARTINCLINATION="-736;-24;"/>
<linktarget COLOR="#8a3494" DESTINATION="ID_459235865" ENDARROW="Default" ENDINCLINATION="506;31;" ID="Arrow_ID_42313313" SOURCE="ID_376748016" STARTARROW="None" STARTINCLINATION="-1413;-61;"/>
<icon BUILTIN="yes"/>
<node CREATED="1731702245722" HGAP="55" ID="ID_1210629436" LINK="#ID_784405050" MODIFIED="1731702389055" TEXT="k&#xf6;nnte Probleme mit Verdrahtung und Signalisierung l&#xf6;sen..." VSHIFT="4">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
es gibt Situationen, in denen das Schedule &#187;gebrochen&#171; wird, und das f&#252;hrt u.U. zum Deadlock bzw. dazu, da&#223; ein Berechnungvorgang stillschweigend stecken bleibt; diese Situationen k&#246;nnen relativ leicht auf einem unteren Level im Code erkannt werden, aber von dort ist es nicht einfach, einen Alarm auf einem globalen Level auszul&#246;sen
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1699403193710" ID="ID_1522099049" MODIFIED="1699403198814" TEXT="Design-Skizze">
@ -125741,7 +125753,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1703798050746" FOLDED="true" ID="ID_339326725" MODIFIED="1713568821059" TEXT="Scheduler-Stre&#xdf;tests">
<node COLOR="#338800" CREATED="1703798050746" ID="ID_339326725" MODIFIED="1731712947664" TEXT="Scheduler-Stre&#xdf;tests">
<linktarget COLOR="#33a090" DESTINATION="ID_339326725" ENDARROW="Default" ENDINCLINATION="224;-1281;" ID="Arrow_ID_1171977868" SOURCE="ID_1032000470" STARTARROW="None" STARTINCLINATION="1205;67;"/>
<font NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="button_ok"/>
@ -125765,7 +125777,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1704766027439" FOLDED="true" ID="ID_161148852" MODIFIED="1713396148543" TEXT="Untersuchung-2: hohe Auslastung">
<node COLOR="#338800" CREATED="1704766027439" ID="ID_161148852" MODIFIED="1731712947669" TEXT="Untersuchung-2: hohe Auslastung">
<linktarget COLOR="#3832ae" DESTINATION="ID_161148852" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_1703930922" SOURCE="ID_549174207" STARTARROW="None" STARTINCLINATION="333;19;"/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704766160781" HGAP="8" ID="ID_1879705815" MODIFIED="1713536311760" STYLE="bubble" TEXT="bisher ging es um Dependency-Management &#x2014; nun geht es um &#xbb;Last&#xab;" VSHIFT="8">
@ -130200,7 +130212,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1712595518473" ID="ID_1871408755" MODIFIED="1712595524139" TEXT="oder als &#xbb;load bursts&#xab;"/>
</node>
</node>
<node COLOR="#338800" CREATED="1704915305240" FOLDED="true" ID="ID_466567694" MODIFIED="1713537416379" TEXT="Untersuchung im Stress-Test-Rig">
<node COLOR="#338800" CREATED="1704915305240" ID="ID_466567694" MODIFIED="1731712947683" TEXT="Untersuchung im Stress-Test-Rig">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1704915323510" ID="ID_1549178834" MODIFIED="1712623136295" TEXT="1.Test">
<icon BUILTIN="button_cancel"/>
@ -130815,7 +130827,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1712707454214" ID="ID_614749757" MODIFIED="1712707464397" TEXT="izt werd&apos;s interessant...">
<icon BUILTIN="smiley-oh"/>
</node>
<node BACKGROUND_COLOR="#fed799" COLOR="#fa002a" CREATED="1712707465445" FOLDED="true" ID="ID_1436192915" MODIFIED="1712771415761" TEXT="Deadline f&#xfc;r den Tick wurde &#xfc;berfahren">
<node BACKGROUND_COLOR="#fed799" COLOR="#fa002a" CREATED="1712707465445" ID="ID_1436192915" MODIFIED="1731712947689" TEXT="Deadline f&#xfc;r den Tick wurde &#xfc;berfahren">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1712707500045" ID="ID_154552576" MODIFIED="1712707511038">
<richcontent TYPE="NODE"><html>
@ -130886,11 +130898,11 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1712710547319" ID="ID_1932392128" MODIFIED="1712710556804" TEXT="Catch-22">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1712766598972" FOLDED="true" HGAP="35" ID="ID_441812703" MODIFIED="1712767856916" TEXT="m&#xf6;gliche L&#xf6;sungen" VSHIFT="19">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1712766598972" HGAP="35" ID="ID_441812703" MODIFIED="1731712951439" TEXT="m&#xf6;gliche L&#xf6;sungen" VSHIFT="19">
<linktarget COLOR="#7159db" DESTINATION="ID_441812703" ENDARROW="Default" ENDINCLINATION="-220;27;" ID="Arrow_ID_1982927238" SOURCE="ID_1402977969" STARTARROW="None" STARTINCLINATION="-15;-77;"/>
<icon BUILTIN="idea"/>
<node CREATED="1712766702693" ID="ID_459937240" MODIFIED="1712766715279" TEXT="Emergency auch in der work-Pull-Funktion erkennen">
<node CREATED="1712766860367" ID="ID_731751015" MODIFIED="1712766955228" TEXT="das ist aktuell ein Defekt">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712766860367" ID="ID_731751015" MODIFIED="1712767714974" TEXT="das ist aktuell ein Defekt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -130899,13 +130911,31 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</p>
</body>
</html></richcontent>
<icon BUILTIN="broken-line"/>
</node>
<node COLOR="#338800" CREATED="1712767010192" ID="ID_784405050" MODIFIED="1731699448874" TEXT="unten im Logik-Baum einfach zu erkennen">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1712766984495" ID="ID_697052410" MODIFIED="1712766991490" TEXT="aber unklar wie dann signalisiert werden kann"/>
</node>
<node CREATED="1712766735297" ID="ID_1909566269" MODIFIED="1712766752721" TEXT="Queue-Clean-up + Emergency-Erkennung in Layer-2 verlagern">
<node CREATED="1712767000253" ID="ID_921990888" MODIFIED="1712767010192" TEXT="das w&#xe4;re die offensichtliche Code-Vereinfachung"/>
<node CREATED="1712767010819" ID="ID_1785032368" MODIFIED="1712767031884" TEXT="und w&#xfc;rde bzg. der Erkennung sauber top &#x27f6; down arbeiten"/>
<node CREATED="1712767033160" ID="ID_1069761407" MODIFIED="1712767053312" TEXT="dann ist aber unklar wie die externe Reaktion getriggert wird"/>
<node CREATED="1712767033160" ID="ID_1069761407" MODIFIED="1731699713469" TEXT="dann ist aber unklar wie die externe Reaktion getriggert wird">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
genauer: eine externe Reaktion ist sicher nicht etws, was Layer-2 einfach machen kann &#8212; hier entstehe eine zunehmend komplexe Dependency-Injection, insofern der Layer-2 auch Entscheidungen f&#252;r den Service als Ganzes trifft
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#5e5c75" DESTINATION="ID_1642624688" ENDARROW="Default" ENDINCLINATION="719;33;" ID="Arrow_ID_1722015988" STARTARROW="None" STARTINCLINATION="338;16;"/>
</node>
<node COLOR="#338800" CREATED="1731712916425" ID="ID_872583288" MODIFIED="1731713025545" TEXT="zumindest hab ich jetzt die Erkennung in eine Methode in Layer-2 extrahiert">
<arrowlink COLOR="#23b91f" DESTINATION="ID_722076886" ENDARROW="Default" ENDINCLINATION="1530;2127;" ID="Arrow_ID_1785760257" STARTARROW="None" STARTINCLINATION="-1253;43;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1712766759846" ID="ID_483185917" MODIFIED="1712766801924" TEXT="bei Emergency-Erkennung im work-Pull eine Exception werfen">
<node CREATED="1712767072187" ID="ID_1670222323" MODIFIED="1712767105314" TEXT="ganz ein fieser Trick &#x2014; w&#xfc;rde aber im aktuellen Stand die Probleme l&#xf6;sen"/>
@ -130917,8 +130947,10 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1712767159375" ID="ID_1627406710" MODIFIED="1712767172097" TEXT="dann w&#xe4;re die Emergency-Behandlung auf Scheduler-Komponenten-Level"/>
<node CREATED="1712767172805" ID="ID_860911717" MODIFIED="1712767202045" TEXT="aber getriggert w&#xfc;rde er i.d.R bei der Queue-Behandlung in Layer-2"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1712767219839" ID="ID_1642624688" MODIFIED="1712767714974" TEXT="Vertagt &#x2014; Entscheidungs-Faktor ist das Signalisierungs-System">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1712767219839" ID="ID_1642624688" MODIFIED="1731704865163" TEXT="Vertagt &#x2014; Entscheidungs-Faktor ist das Signalisierungs-System">
<arrowlink COLOR="#6e3e89" DESTINATION="ID_459235865" ENDARROW="Default" ENDINCLINATION="506;31;" ID="Arrow_ID_321080977" STARTARROW="None" STARTINCLINATION="-736;-24;"/>
<arrowlink COLOR="#6e3e89" DESTINATION="ID_877599570" ENDARROW="Default" ENDINCLINATION="-1171;-67;" ID="Arrow_ID_1052751359" STARTARROW="None" STARTINCLINATION="-736;-24;"/>
<linktarget COLOR="#5e5c75" DESTINATION="ID_1642624688" ENDARROW="Default" ENDINCLINATION="719;33;" ID="Arrow_ID_1722015988" SOURCE="ID_1069761407" STARTARROW="None" STARTINCLINATION="338;16;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
@ -131426,7 +131458,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1713135206679" ID="ID_1775229427" MODIFIED="1713135398059" TEXT="Aber: mit 512 Nodes tritt das Problem nicht auf">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1713135274627" ID="ID_474427976" MODIFIED="1713135278870" TEXT="f&#xfc;r 4ms"/>
<node CREATED="1713135279578" ID="ID_1655783173" MODIFIED="1713135290933" TEXT="f&#xfc;r 5ms l&#xf6;sen wir eine SchedulerEmergency aus"/>
<node CREATED="1713135279578" ID="ID_1655783173" MODIFIED="1713135290933" TEXT="f&#xfc;r 5ms l&#xf6;sen wir bereits eine SchedulerEmergency aus"/>
<node CREATED="1713135383258" ID="ID_1427209469" MODIFIED="1713135395155" TEXT="wenn man daf&#xfc;r die Schwelle anhebt : dann l&#xe4;uft er durch"/>
</node>
<node CREATED="1713135778518" ID="ID_1026046718" MODIFIED="1713135806670" TEXT="exakt ist diese Anzahl zyklen nicht: es sind dann schon mal 6 statt 4"/>
@ -132465,6 +132497,22 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1731706422224" ID="ID_974503731" MODIFIED="1731709824617" TEXT="Behandlung f&#xfc;r Jobs &gt; DUTY_CYCLE_TOLERANCE">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...wenn diese naiv reingelassen werden und die gesamte Work-Kapazit&#228;t aussch&#246;pfen, f&#252;hrt der n&#228;chste &#187;Tick&#171;-Job zur <b>Scheduler-Emergency</b>.
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#b60c43" DESTINATION="ID_1586716013" ENDARROW="Default" ENDINCLINATION="-861;-54;" ID="Arrow_ID_818837170" STARTARROW="None" STARTINCLINATION="-590;32;"/>
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731709837511" ID="ID_1797274775" MODIFIED="1731709979326" TEXT="verwandtes Problem: Signalisierung der Emergency">
<arrowlink COLOR="#8e3855" DESTINATION="ID_256718341" ENDARROW="Default" ENDINCLINATION="490;-21;" ID="Arrow_ID_904544666" STARTARROW="None" STARTINCLINATION="717;37;"/>
<icon BUILTIN="bell"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698933282432" ID="ID_918993851" MODIFIED="1698933288745" TEXT="Bedeutung der Queue-Performance">
<icon BUILTIN="hourglass"/>
@ -132534,6 +132582,45 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731700747092" ID="ID_432163500" MODIFIED="1731700772941" TEXT="fragiles Verhalten bei gebrochenem Schedule">
<icon BUILTIN="clanbomber"/>
<node CREATED="1731700786715" ID="ID_1312861889" MODIFIED="1731701028764" TEXT="der Schdeuler arbeitet probabilistisch &#x2014; ist aber zugleich offen und unkoordiniert"/>
<node CREATED="1731701044358" ID="ID_774692462" MODIFIED="1731701090913" TEXT="wenig M&#xf6;glichkeiten einen Kontrollverlust rechtzeitig zu bemerken...."/>
<node CREATED="1731701157937" ID="ID_1153180150" MODIFIED="1731701265565" TEXT="unbefriedigte Dependencies bleiben einfach h&#xe4;ngen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
wenn man einen Verarbeitungsvorkang darstellt als Jobs mit Dependency-Verkettung, dann kann diese Verarbeitung ohne Weiteres irgendwo stecken bleiben, ohne da&#223; ein Fehler ersichtlich ist; der einzige Signalisierungs-Mechanismus sind compulsory-Jobs (und das ist ein relativ brachialer Mechanismus)
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1731705282278" ID="ID_1193889112" MODIFIED="1731705482192" TEXT="Jobs k&#xf6;nnen insgesamt &#xbb;zu fett&#xab; sein">
<linktarget COLOR="#de0597" DESTINATION="ID_1193889112" ENDARROW="Default" ENDINCLINATION="803;58;" ID="Arrow_ID_362639277" SOURCE="ID_673966027" STARTARROW="None" STARTINCLINATION="538;30;"/>
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731705524616" HGAP="58" ID="ID_528546646" MODIFIED="1731709887978" TEXT="zu viele exzessiv lang laufende Jobs sind ein Planungsfehler...." VSHIFT="4">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Es sind Render-jobs denkbar, die <i>mehrere Stunden brauchen!</i>
</p>
<p>
Da es keine &#252;bergeordnete Koordinierungs-Instanz gibt, mu&#223; in diesem Fall von der Job-Planung aus f&#252;r frei bleibende Restkapazit&#228;t f&#252;r Admin-Aufgaben gesorgt werden &#8212; denn wenn alle verf&#252;gbaren Worker mit solchen langwierigen Berechnungen belegt sind, findet kein &#187;Tick&#171; mehr statt (und der n&#228;chste Tick hat seine Deadline &#252;berfahren und l&#246;st eine <b>Scheduler-Emergency</b>&#160;aus). Ohne eine &#252;bergeordnete Kapazit&#228;ts- und Engine-Steuerung ist diese Situation <i>nicht ad&#228;quat zu handhaben: </i>entweder wir bekommen permanent und erwartbar eine Fehler-Situation, oder wir k&#246;nnen die Parallelit&#228;t nicht aussch&#246;pfen, weil wir eine ganze Core freihalten m&#252;ssen, oder wir m&#252;ssen &#252;berprovisionieren.
</p>
</body>
</html></richcontent>
<linktarget COLOR="#c00159" DESTINATION="ID_528546646" ENDARROW="Default" ENDINCLINATION="6;363;" ID="Arrow_ID_432556827" SOURCE="ID_1047177219" STARTARROW="None" STARTINCLINATION="-664;34;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731701587357" ID="ID_100642146" MODIFIED="1731701835497" TEXT="#1362 Scheduler Emergency">
<arrowlink COLOR="#d52960" DESTINATION="ID_619384635" ENDARROW="Default" ENDINCLINATION="-2477;105;" ID="Arrow_ID_175149574" STARTARROW="None" STARTINCLINATION="1042;92;"/>
<arrowlink COLOR="#d52960" DESTINATION="ID_256718341" ENDARROW="Default" ENDINCLINATION="-2477;105;" ID="Arrow_ID_1154862155" STARTARROW="None" STARTINCLINATION="1042;92;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
@ -133235,7 +133322,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#8c4d64" DESTINATION="ID_1447380879" ENDARROW="Default" ENDINCLINATION="-8;-5;" ID="Arrow_ID_435946798" STARTARROW="None" STARTINCLINATION="-79;0;"/>
<arrowlink COLOR="#8c4d64" DESTINATION="ID_1447380879" ENDARROW="Default" ENDINCLINATION="-3;-9;" ID="Arrow_ID_435946798" STARTARROW="None" STARTINCLINATION="-73;0;"/>
</node>
<node CREATED="1685314344399" ID="ID_1217096258" MODIFIED="1685314716242" TEXT="Reaktion auf externe Ereignisse ist der absolute Gegenpol einer Zeitsteuerung">
<richcontent TYPE="NOTE"><html>
@ -133272,6 +133359,24 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1731706222560" ID="ID_1047177219" MODIFIED="1731709887978" TEXT="aufwendie Render-Aufgaben passen nicht ins Konzept">
<arrowlink COLOR="#c00159" DESTINATION="ID_528546646" ENDARROW="Default" ENDINCLINATION="6;363;" ID="Arrow_ID_432556827" STARTARROW="None" STARTINCLINATION="-664;34;"/>
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731706331004" ID="ID_1988316403" MODIFIED="1731706418134" TEXT="Scheduler kann keine ununterbrochenen Jobs &gt; DUTY_CYCLE_TOLERANCE verarbeiten">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...wenn diese die gesamte Work-Kapazit&#228;t aussch&#246;pfen, f&#252;hrt der n&#228;chste &#187;Tick&#171;-Job zur <b>Scheduler-Emergency</b>.
</p>
</body>
</html></richcontent>
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1731706422224" HGAP="80" ID="ID_1875138790" MODIFIED="1731709589954" TEXT="m&#xfc;&#xdf;te daf&#xfc;r komplizierte Spezialbehandlung &#xbb;oben drauf&#xab; setzen" VSHIFT="4">
<arrowlink COLOR="#b60c43" DESTINATION="ID_1586716013" ENDARROW="Default" ENDINCLINATION="-861;-54;" ID="Arrow_ID_1529827421" STARTARROW="None" STARTINCLINATION="-580;27;"/>
</node>
</node>
</node>
<node CREATED="1685314776038" ID="ID_100581546" MODIFIED="1685314801303" TEXT="so gesehen &#x2014; wir haben ein Problem">
<icon BUILTIN="broken-line"/>
@ -133284,7 +133389,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</p>
</body>
</html></richcontent>
<linktarget COLOR="#8c4d64" DESTINATION="ID_1447380879" ENDARROW="Default" ENDINCLINATION="-8;-5;" ID="Arrow_ID_435946798" SOURCE="ID_30132170" STARTARROW="None" STARTINCLINATION="-79;0;"/>
<linktarget COLOR="#8c4d64" DESTINATION="ID_1447380879" ENDARROW="Default" ENDINCLINATION="-3;-9;" ID="Arrow_ID_435946798" SOURCE="ID_30132170" STARTARROW="None" STARTINCLINATION="-73;0;"/>
</node>
<node CREATED="1685315368175" ID="ID_212885906" MODIFIED="1685315397463" TEXT="wir haben komplett kontr&#xe4;re Anforderungen gleicherma&#xdf;en zu befriedigen">
<node CREATED="1685315468539" ID="ID_640947563" MODIFIED="1685315806051" TEXT="Playback ist h&#xe4;ufig, w&#xe4;re aber viel billiger auch zu haben">
@ -133702,6 +133807,17 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<arrowlink COLOR="#544ad5" DESTINATION="ID_1227874220" ENDARROW="Default" ENDINCLINATION="-1477;121;" ID="Arrow_ID_677451247" STARTARROW="None" STARTINCLINATION="-536;-12;"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1731632025178" ID="ID_256718341" LINK="https://issues.lumiera.org/ticket/1362#comment:1" MODIFIED="1731709979326" TEXT="aber der Tick kann selber &#xfc;berfahren werden (&#xd83e;&#xdc46; Deadlock)">
<linktarget COLOR="#8e3855" DESTINATION="ID_256718341" ENDARROW="Default" ENDINCLINATION="490;-21;" ID="Arrow_ID_904544666" SOURCE="ID_1797274775" STARTARROW="None" STARTINCLINATION="717;37;"/>
<linktarget COLOR="#d52960" DESTINATION="ID_256718341" ENDARROW="Default" ENDINCLINATION="-2477;105;" ID="Arrow_ID_1154862155" SOURCE="ID_100642146" STARTARROW="None" STARTINCLINATION="1042;92;"/>
<icon BUILTIN="clanbomber"/>
<node CREATED="1731702096252" HGAP="25" ID="ID_318845632" MODIFIED="1731702123129" TEXT="es g&#xe4;be eine Stelle in Layer-2 wo das erkennbar ist" VSHIFT="12">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1731702157572" ID="ID_1448268226" LINK="#ID_441812703" MODIFIED="1731702199510" TEXT="(die Signalisierung von dort ist aber nicht trivial zu l&#xf6;sen)">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
<node CREATED="1698530399254" ID="ID_1046746147" MODIFIED="1698530408833" TEXT="Au&#xdf;en-&#xdc;berwachung...">
<node CREATED="1698530409796" ID="ID_324754876" MODIFIED="1698530428896" TEXT="k&#xf6;nnte ein sanity-Check beim Zugriff sein"/>
@ -133712,12 +133828,15 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1698530454718" ID="ID_1982008339" MODIFIED="1698530612783" TEXT="mu&#xdf; vor dem BlockFlow-Clean-up sitzen">
<arrowlink COLOR="#ed3471" DESTINATION="ID_355476974" ENDARROW="Default" ENDINCLINATION="-616;43;" ID="Arrow_ID_729257748" STARTARROW="None" STARTINCLINATION="689;49;"/>
</node>
<node CREATED="1698971338638" ID="ID_1616058266" MODIFIED="1698971382127" TEXT="Warnschwelle == Deadline der periodischen &#xbb;Tick&#xab;-Activity">
<node CREATED="1698971338638" ID="ID_1616058266" MODIFIED="1731698980884" TEXT="Warnschwelle == Deadline der periodischen &#xbb;Tick&#xab;-Activity">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
derzeit eingestellt auf 50ms
derzeit eingestellt auf 200ms
</p>
<p>
(das sind Tick-Zyklen &#8212; nicht klar ob das reicht, denn in den Stre&#223;-Tests habe ich gesehen, da&#223; das Schedule durchaus leicht mal um mehrere 100ms weg-rutschen kann)
</p>
</body>
</html></richcontent>
@ -134138,10 +134257,31 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<arrowlink COLOR="#fe152a" DESTINATION="ID_1983682769" ENDARROW="Default" ENDINCLINATION="714;22;" ID="Arrow_ID_976291150" STARTARROW="None" STARTINCLINATION="422;18;"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#d2b7af" COLOR="#5c4d6e" CREATED="1712767219839" ID="ID_376748016" MODIFIED="1712767825639" TEXT="Verbindung EngineObserver &#x27f5; Scheduler-Emergency">
<node BACKGROUND_COLOR="#d2b7af" COLOR="#5c4d6e" CREATED="1712767219839" ID="ID_376748016" MODIFIED="1731704649880" TEXT="Verbindung EngineObserver &#x27f5; Scheduler-Emergency">
<arrowlink COLOR="#8a3494" DESTINATION="ID_459235865" ENDARROW="Default" ENDINCLINATION="506;31;" ID="Arrow_ID_42313313" STARTARROW="None" STARTINCLINATION="-1413;-61;"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712767596984" ID="ID_877599570" MODIFIED="1731704873017" TEXT="Weiterleitung der Emergency im Scheduler kl&#xe4;ren">
<linktarget COLOR="#6e3e89" DESTINATION="ID_877599570" ENDARROW="Default" ENDINCLINATION="-1171;-67;" ID="Arrow_ID_1052751359" SOURCE="ID_1642624688" STARTARROW="None" STARTINCLINATION="-736;-24;"/>
<icon BUILTIN="yes"/>
<node CREATED="1731704911918" ID="ID_304510502" MODIFIED="1731705258884" TEXT="mutual Dependency zwischen Queue-Pull und Service-Level">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Sowohl der Tick-Service, alsauch das pullWork m&#252;ssen die Queue aktualisieren und obsolete Eintr&#228;ge wegwerfen; dabei kann aber eine Scheduler-Emergency auftreten (konkret: ein compulsory-task steht am Queue-Head, hat aber bereits seine Deadline &#252;berfahren, weshalb man ihn nur noch wegwerfen kann, denn der zugeh&#246;rige Activity-Chain k&#246;nnte bereits dealloziert bzw. recycled sein; und im Besonderen k&#246;nnte dieser compulsory-task <b>der n&#228;chste Tick</b>&#160;sein).
</p>
<p>
Aber Scheduler-Emergency geh&#246;rt ganz eindeutig auf den top-Level, und mu&#223; dann sogar nach au&#223;en signalisiert werden, weil der Scheduler dieses Problem nicht selbst l&#246;sen kann
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1731705260057" ID="ID_673966027" MODIFIED="1731705482192" TEXT="komplexes Thema &#x2014; globale Render-Steuerung">
<arrowlink COLOR="#de0597" DESTINATION="ID_1193889112" ENDARROW="Default" ENDINCLINATION="803;58;" ID="Arrow_ID_362639277" STARTARROW="None" STARTINCLINATION="538;30;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698531826447" ID="ID_1031213188" MODIFIED="1698531840094" TEXT="Mechanismus zum Wiederanlauf schaffen">
<icon BUILTIN="hourglass"/>
@ -134187,6 +134327,16 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
<node CREATED="1693238644990" ID="ID_1196672113" MODIFIED="1693238729300" TEXT="Laststeuerung f&#xfc;r &#xbb;free-wheeling&#xab; / background render">
<arrowlink COLOR="#965d71" DESTINATION="ID_1960804622" ENDARROW="Default" ENDINCLINATION="286;89;" ID="Arrow_ID_494620026" STARTARROW="None" STARTINCLINATION="2087;110;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731709631970" ID="ID_1414604117" LINK="https://issues.lumiera.org/ticket/1322" MODIFIED="1731709696219" TEXT=" #1322 Free-wheeling quality Render ">
<arrowlink COLOR="#ec1b72" DESTINATION="ID_1586716013" ENDARROW="Default" ENDINCLINATION="74;-4;" ID="Arrow_ID_1073115607" STARTARROW="None" STARTINCLINATION="-107;7;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731709490129" ID="ID_1586716013" LINK="https://issues.lumiera.org/ticket/1382" MODIFIED="1731709795398" TEXT="#1382 schedule long-running Tasks ">
<linktarget COLOR="#b60c43" DESTINATION="ID_1586716013" ENDARROW="Default" ENDINCLINATION="-861;-54;" ID="Arrow_ID_818837170" SOURCE="ID_974503731" STARTARROW="None" STARTINCLINATION="-590;32;"/>
<linktarget COLOR="#b60c43" DESTINATION="ID_1586716013" ENDARROW="Default" ENDINCLINATION="-861;-54;" ID="Arrow_ID_1529827421" SOURCE="ID_1875138790" STARTARROW="None" STARTINCLINATION="-580;27;"/>
<linktarget COLOR="#ec1b72" DESTINATION="ID_1586716013" ENDARROW="Default" ENDINCLINATION="74;-4;" ID="Arrow_ID_1073115607" SOURCE="ID_1414604117" STARTARROW="None" STARTINCLINATION="-107;7;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693840934074" ID="ID_571516538" MODIFIED="1693840995972" TEXT="Render-Engie Lebenszyklus: start / stop">
@ -134201,8 +134351,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680563509728" ID="ID_1883500842" MODIFIED="1684869810400" TEXT="Scheduler">
<icon BUILTIN="stop"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680563509728" ID="ID_1883500842" MODIFIED="1731698766206" TEXT="Scheduler">
<icon BUILTIN="prepare"/>
<node CREATED="1688438164169" ID="ID_1339299906" MODIFIED="1688438167334" TEXT="Funktionalit&#xe4;t">
<node CREATED="1680563512563" ID="ID_960191744" LINK="#ID_1218283238" MODIFIED="1699651252147" TEXT="Layer-2">
<node CREATED="1692566489639" ID="ID_1996598339" MODIFIED="1692566493766" TEXT="Steuer-Funktionen">