Scheduler-test: fix Segfault in test setup

...as it turned out, this segfault was caused by flaws in the ScheduleCtx
used for generate the test-schedule; especially when all node-spreads are set
to zero and thus all jobs are scheduled immediately at t=0, there was a loophole
in the logic to set the dependencies for the final »wake-up« job.

When running such a schedule in the Stress-Test-Bench, the next measurement run
could be started due to a premature wake-up job, thereby overrunning the previous
test-run, which could be still in the middle of computations.

So this was not a bug in the Scheduler itself, yet something to take care of
later when programming the actual Job-Planning and schedule generation.
This commit is contained in:
Fischlurch 2024-01-11 22:03:36 +01:00
parent 81d4b5d323
commit 6a08c97543
4 changed files with 255 additions and 37 deletions

View file

@ -328,15 +328,42 @@ namespace test {
void
investigateWorkProcessing()
{
// TestChainLoad<8> testLoad{64};
// testLoad.seedingRule(testLoad.rule().probability(0.6).minVal(2))
// .pruningRule(testLoad.rule().probability(0.44))
// .setSeed(55)
// .buildTopology()
// .printTopologyDOT()
// .printTopologyStatistics()
// ;
MARK_TEST_FUN
TestChainLoad<8> testLoad{64};
testLoad.seedingRule(testLoad.rule().probability(0.6).minVal(2))
.pruningRule(testLoad.rule().probability(0.44))
.setSeed(55)
.buildTopology()
.printTopologyDOT()
.printTopologyStatistics()
;
// ////////////////////////////////////////////////////////WIP : Run test directly for investigation of SEGFAULT....
// BlockFlowAlloc bFlow;
// EngineObserver watch;
// Scheduler scheduler{bFlow, watch};
// auto LOAD_BASE = 500us;
// auto stressFac = 1.0;
// auto concurrency = 8;
//
// ComputationalLoad cpuLoad;
// cpuLoad.timeBase = LOAD_BASE;
// cpuLoad.calibrate();
//
// double loadMicros = cpuLoad.invoke();
// double refTime = testLoad.calcRuntimeReference(LOAD_BASE);
//SHOW_EXPR(loadMicros)
//
// auto testSetup =
// testLoad.setupSchedule(scheduler)
// .withLoadTimeBase(LOAD_BASE)
// .withJobDeadline(50ms)
// .withUpfrontPlanning()
// .withAdaptedSchedule (stressFac, concurrency);
// double runTime = testSetup.launch_and_wait();
// double expected = testSetup.getExpectedEndTime();
//SHOW_EXPR(runTime)
//SHOW_EXPR(expected)
//SHOW_EXPR(refTime)
struct Setup : StressRig
{

View file

@ -1315,7 +1315,7 @@ namespace test {
// replicate this relation into the clone array
clone[predIdx].addSucc(clone[succIdx]);
};
auto continuation = [&](size_t nodeDone, size_t levelDone, bool work_left)
auto continuation = [&](size_t, size_t nodeDone, size_t levelDone, bool work_left)
{
lastNode =nodeDone;
lastLevel = levelDone;

View file

@ -193,6 +193,7 @@ namespace test {
const Duration SCHEDULE_LEVEL_STEP{_uTicks(1ms)}; ///< time budget to plan for the calculation of each »time level« of jobs
const Duration SCHEDULE_NODE_STEP{Duration::NIL}; ///< additional time step to include in the plan for each job (node).
const Duration SCHEDULE_PLAN_STEP{_uTicks(100us)}; ///< time budget to reserve for each node to be planned and scheduled
const Offset SCHEDULE_WAKE_UP{_uTicks(10us)}; ///< tiny offset to place the final wake-up job behind any systematic schedule
const bool SCHED_DEPENDS = false; ///< explicitly schedule a dependent job (or rely on NOTIFY)
const bool SCHED_NOTIFY = true; ///< explicitly set notify dispatch time to the dependency's start time.
@ -1592,9 +1593,9 @@ namespace test {
{
using Node = typename TestChainLoad<maxFan>::Node;
function<void(size_t,size_t)> scheduleCalcJob_;
function<void(Node*,Node*)> markDependency_;
function<void(size_t,size_t,bool)> continuation_;
function<void(size_t,size_t)> scheduleCalcJob_;
function<void(Node*,Node*)> markDependency_;
function<void(size_t,size_t,size_t,bool)> continuation_;
size_t maxCnt_;
Node* nodes_;
@ -1621,6 +1622,7 @@ namespace test {
void
invokeJobOperation (JobParameter param) override
{
size_t start{currIdx_};
size_t reachedLevel{0};
size_t targetNodeIDX = decodeNodeID (param.invoKey);
for ( ; currIdx_<maxCnt_; ++currIdx_)
@ -1636,7 +1638,7 @@ namespace test {
markDependency_(pred,n);
}
ENSURE (currIdx_ > 0);
continuation_(currIdx_-1, reachedLevel, currIdx_ < maxCnt_);
continuation_(start, currIdx_-1, reachedLevel, currIdx_ < maxCnt_);
}
@ -1719,7 +1721,7 @@ namespace test {
/** continue planning: schedule follow-up planning job */
void
continuation (size_t lastNodeIDX, size_t levelDone, bool work_left)
continuation (size_t chunkStart, size_t lastNodeIDX, size_t levelDone, bool work_left)
{
if (work_left)
{
@ -1729,13 +1731,15 @@ namespace test {
,manID_);
}
else
scheduler_.defineSchedule(wakeUpJob())
.manifestation (manID_)
.startTime(jobStartTime (levelDone+1))
.lifeWindow(SAFETY_TIMEOUT)
.post()
.linkToPredecessor (schedule_[lastNodeIDX], not schedNotify_)
; // Setup wait-dependency on last computation
{
auto wakeUp = scheduler_.defineSchedule(wakeUpJob())
.manifestation (manID_)
.startTime(jobStartTime (levelDone+1, lastNodeIDX+1) + SCHEDULE_WAKE_UP)
.lifeWindow(SAFETY_TIMEOUT)
.post();
for (size_t exitIDX : lastExitNodes (chunkStart))
wakeUp.linkToPredecessor (schedule_[exitIDX]);
} // Setup wait-dependency on last computations
}
@ -1751,7 +1755,8 @@ namespace test {
planFunctor_.reset (new RandomChainPlanFunctor<maxFan>{chainLoad_.nodes_[0], chainLoad_.numNodes_
,[this](size_t i, size_t l){ disposeStep(i,l); }
,[this](auto* p, auto* s) { setDependency(p,s);}
,[this](size_t n,size_t l, bool w){ continuation(n,l,w); }
,[this](size_t s,size_t n,size_t l, bool w)
{ continuation(s,n,l,w); }
});
startTime_ = anchorSchedule();
scheduler_.seedCalcStream (planningJob(firstChunkEndNode)
@ -2026,14 +2031,15 @@ namespace test {
}
void
fillAdaptedSchedule (double stressFac, uint concurrency)
fillAdaptedSchedule (double stressFact, uint concurrency)
{
REQUIRE (stressFact > 0);
size_t numPoints = chainLoad_.topLevel()+2;
startTimes_.clear();
startTimes_.reserve (numPoints);
startTimes_.push_back (Time::ZERO);
chainLoad_.levelScheduleSequence (concurrency)
.transform([&](double scheduleFact){ return (scheduleFact/stressFac) * Offset{1,levelSpeed_};})
.transform([&](double scheduleFact){ return (scheduleFact/stressFact) * Offset{1,levelSpeed_};})
.effuse(startTimes_);
}
@ -2045,6 +2051,14 @@ namespace test {
+ nodeExpense_ * nodeIDX;
}
auto
lastExitNodes (size_t lastChunkStartIDX)
{
return chainLoad_.allExitNodes()
.transform([&](Node& n){ return chainLoad_.nodeID(n); })
.filter([=](size_t idx){ return idx >= lastChunkStartIDX; });
} // index of all Exit-Nodes within last planning-chunk...
Time
calcPlanScheduleTime (size_t lastNodeIDX)
{/* must be at least 1 level ahead,

View file

@ -110773,14 +110773,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704288869866" ID="ID_1475817699" MODIFIED="1704288911093" TEXT="Aufgabe: Belegen der grunds&#xe4;tzlichen Tauglichkeit"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704288897590" ID="ID_1251840457" MODIFIED="1704288911094" TEXT="Parameter + Grenzen f&#xfc;r eine Standard-Last herausfinden"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1704766027439" ID="ID_161148852" MODIFIED="1704915359907" TEXT="Untersuchung-1: hohe Auslastung">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1704766027439" ID="ID_161148852" MODIFIED="1704919268932" TEXT="Untersuchung-1: hohe Auslastung">
<linktarget COLOR="#3832ae" DESTINATION="ID_161148852" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_1703930922" SOURCE="ID_549174207" STARTARROW="None" STARTINCLINATION="289;17;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1704766160781" ID="ID_1879705815" MODIFIED="1704766424803" TEXT="bisher ging es um Dependency-Management &#x2014; nun geht es um &#xbb;Last&#xab;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
die ganzen Test zur Integration und zum Aufbau der Testanordnung haben die &#187;chained load bursts&#171; verwendet, ein hochgradig unregelm&#228;&#223;iges und abschnittsweise stark verkn&#252;pftes Pattern. Damit konnte ich in etwa die erwartete Parallelisierung beobachten, aber die Computational Load ist typischerweise doppelt so lang gelaufen wie kalibriert, w&#228;hrend gleichzeitig permanent Koordinations-Aufwand zu leisten war. Deshalb w&#228;hle ich nun einen anderen Blickwinkel: Wie gut k&#246;nnen wir die theoretisch vorhandene &#187;Rechenkapazit&#228;t&#171; zum Einsatz bringen? Daf&#252;r braucht es ein m&#246;glichst einfaches Pattern, das aber hinreichend breit sein mu&#223;, um alle Kerne auszulasten. Ziel ist es, einen gleichm&#228;&#223;igen &#187;Flow&#171; von l&#228;nger laufenden Rechen-Jobs zu generieren
@ -110795,9 +110793,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1704849761430" ID="ID_973472982" MODIFIED="1704849788023" TEXT="massiv-vernetzt">
<node CREATED="1704849789603" ID="ID_1248796850" MODIFIED="1704850126462" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<font size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TestChainLoad&lt;8&gt; testLoad{64}; </font>
@ -110828,9 +110824,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1704849928488" ID="ID_1928191255" MODIFIED="1704850743844" TEXT="4-parallel-interleaved">
<node CREATED="1704850003870" ID="ID_703412136" MODIFIED="1704850140684" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<font size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TestChainLoad&lt;8&gt; testLoad{64}; </font>
@ -110861,9 +110855,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1704850522511" ID="ID_1699065000" MODIFIED="1704850544528" TEXT="massiv-parallel">
<node CREATED="1704850545733" ID="ID_1888388122" MODIFIED="1704850628464" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<font size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TestChainLoad&lt;8&gt; testLoad{64}; </font>
@ -110905,8 +110897,193 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1704915326966" ID="ID_117301056" MODIFIED="1704915346470" TEXT="8 Kerne gleichm&#xe4;&#xdf;ige Last 500&#xb5;s">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1704940787856" FOLDED="true" ID="ID_548135052" MODIFIED="1705010869404" TEXT="SEGFAULT">
<icon BUILTIN="broken-line"/>
<node CREATED="1704990398092" ID="ID_80295046" MODIFIED="1704990404404" TEXT="Beobachtungen">
<node CREATED="1704990408854" ID="ID_1906248087" MODIFIED="1704990424328" TEXT="reproduzierbar im Test-Bench"/>
<node CREATED="1704990425041" ID="ID_1845017576" MODIFIED="1704990437358" TEXT="der gleiche Graph l&#xe4;uft im direkten Test problemlos durch"/>
<node CREATED="1704990442728" ID="ID_153024669" MODIFIED="1704990457145" TEXT="SEGFAULT kommt stets aus irgend einem Worker"/>
<node CREATED="1704990463047" ID="ID_1160243754" MODIFIED="1704990504216" TEXT="er tritt auf beim Zugriff auf den calcFunctor"/>
<node CREATED="1704990553070" ID="ID_1526538911" MODIFIED="1704990565368" TEXT="Sonderbare Verhalten und Crash im Debugger">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1704990567617" ID="ID_1173334240" MODIFIED="1704990584316" TEXT="die Addresse des calcFunctors ist noch die Gleiche wie zu Beginn"/>
<node CREATED="1704990585358" ID="ID_586252989" MODIFIED="1704990599008" TEXT="man kann den Inhalt aber nicht mehr inspizieren"/>
<node CREATED="1704990600476" ID="ID_142853753" MODIFIED="1704990622133" TEXT="im Test-Thread kann man dann den btr Shared-Ptr auch nicht mehr inspizieren"/>
<node CREATED="1704990684393" ID="ID_1789340667" MODIFIED="1704990717130">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
andere Stack-Frames oder Thrads inspizieren &#10230; <b>Debugger terminiert</b>
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1704990723937" ID="ID_178341494" MODIFIED="1704990752371" TEXT="mehrere andere Threads stehen an der gleichen Stelle im Code">
<icon BUILTIN="idea"/>
<node CREATED="1704990754552" ID="ID_1329373124" MODIFIED="1704990896919" TEXT="das Spezielle bei diesem Test: alle Jobs f&#xfc;r t=0 gescheduled"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704990897845" HGAP="21" ID="ID_716447039" MODIFIED="1704990957152" STYLE="bubble" VSHIFT="8">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
&#10233; <u>Verdacht</u>: <b>Daten-Korruption durch ungesicherten Race</b>
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
<node CREATED="1704990778899" ID="ID_1882100216" MODIFIED="1704990783330" TEXT="Situation">
<icon BUILTIN="info"/>
<node CREATED="1704990784695" ID="ID_1057384980" MODIFIED="1704990807613" TEXT="die Test-Last war f&#xfc;r diesen Test noch nicht konfiguriert"/>
<node CREATED="1704990793642" ID="ID_77629130" MODIFIED="1704990823802" TEXT="deshalb ist die nominelle Laufzeit &#x2261; 0"/>
<node CREATED="1704990824957" ID="ID_1361111256" MODIFIED="1704990835799" TEXT="alle Jobs werden daher zugleich gescheduled"/>
<node CREATED="1704990868467" ID="ID_1318496153" MODIFIED="1704990880051" TEXT="es passiert wohl ziemlich am Anfang des ersten Testlaufs"/>
<node CREATED="1704990880795" ID="ID_1948314569" MODIFIED="1704990887162" TEXT="die Planung ist aber bereits durch"/>
</node>
<node COLOR="#435e98" CREATED="1704990966046" ID="ID_986682266" MODIFIED="1705010677923" TEXT="Untersuchung">
<icon BUILTIN="forward"/>
<node CREATED="1704990969371" ID="ID_1971034431" MODIFIED="1704990986428" TEXT="Dump einbinden &#x27f6; Gl&#xfc;ck gehabt, SEGFAULT reproduzierbar">
<node COLOR="#435e98" CREATED="1704991498765" ID="ID_1480139423" MODIFIED="1705001660275" TEXT="seltsam: warum startet Planungs-Funktor nicht im pre-Roll?">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1704997199852" ID="ID_468557813" MODIFIED="1704997215882" TEXT="liegt vmtl. an der Referenz-Zeit im DUMP"/>
<node CREATED="1704997216462" ID="ID_1676022132" MODIFIED="1705001290651" TEXT="m&#xf6;glich da&#xdf; es da mehrere Instanzen gibt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
theoretisch sollte es auch so sein: sie befindet sich in einem anonymen Namespace...
</p>
</body>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1704997251159" ID="ID_1254432212" MODIFIED="1704997276149" TEXT="&#x27f9; explizit in eine Translation-Unit (activity-lang.cpp)">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704996029443" ID="ID_1771223657" MODIFIED="1705001665527" TEXT="alle Jobs werden auf t=12153 gesetzt"/>
<node CREATED="1704999274739" ID="ID_470946777" MODIFIED="1704999285952" TEXT="wirre Folge von Ausf&#xfc;hrungen...."/>
<node CREATED="1704999398984" ID="ID_935321430" MODIFIED="1704999420905" TEXT="auch die letzte Kette ist relativ bald mit dabei"/>
<node CREATED="1704999421719" ID="ID_250374885" MODIFIED="1704999434257" TEXT="Nodes mit h&#xf6;heren Nummern werden vor fr&#xfc;heren Ketten ausgef&#xfc;hrt"/>
<node CREATED="1704999439133" ID="ID_713393704" MODIFIED="1704999460718" TEXT="NOTIFY-continuations bekommen Vorfahrt &#x27f9; letzte Kette macht Fortschritte"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1704999461378" ID="ID_372748970" MODIFIED="1705003161373" TEXT=" &#xd83e;&#xdc46;&#xd83d;&#xddf1; wake-up Continuation aktiviert &#x2014; obwohl viele andere Ketten noch unterwegs sind">
<arrowlink COLOR="#d90173" DESTINATION="ID_1510371688" ENDARROW="Default" ENDINCLINATION="226;-7;" ID="Arrow_ID_547071277" STARTARROW="None" STARTINCLINATION="-325;11;"/>
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#dcc1a9" COLOR="#ff0000" CREATED="1704999555581" ID="ID_132163274" MODIFIED="1704999629290" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Problem erkannt: <b>re-Entrance</b>
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704999646841" ID="ID_1490241879" MODIFIED="1704999666830" STYLE="fork" TEXT="der n&#xe4;chste Testlauf startet bereits">
<node COLOR="#c40264" CREATED="1704999733982" ID="ID_1748055178" MODIFIED="1704999796418" TEXT="das bestehende Schedule wird de-Alloziert">
<icon BUILTIN="broken-line"/>
</node>
<node COLOR="#c40264" CREATED="1704999744068" ID="ID_1687999691" MODIFIED="1704999796419" TEXT="die Job-Funktoren werden ebenfalls re-alloziert">
<icon BUILTIN="broken-line"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704999646841" ID="ID_739939003" MODIFIED="1704999698630" STYLE="fork" TEXT="w&#xe4;hrend noch die Verarbeitung des aktuellen Testlaufs unterwegs ist"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1705010732582" HGAP="-2" ID="ID_1350365350" MODIFIED="1705010804404" TEXT="Abhilfe strikt definierte Dependencies" VSHIFT="6">
<linktarget COLOR="#3a84b6" DESTINATION="ID_1350365350" ENDARROW="Default" ENDINCLINATION="-192;14;" ID="Arrow_ID_980960219" SOURCE="ID_909211409" STARTARROW="None" STARTINCLINATION="118;-27;"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1705002884235" ID="ID_669579747" MODIFIED="1705002898912" TEXT="Konsequenzen">
<icon BUILTIN="bell"/>
<node CREATED="1705002913235" ID="ID_1850530595" MODIFIED="1705002925055" TEXT="Test-Setup">
<node COLOR="#435e98" CREATED="1705002942000" FOLDED="true" ID="ID_882063020" MODIFIED="1705010871389" TEXT="Wake-up &gt; calc sicherstellen">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1705003013406" ID="ID_1062338611" MODIFIED="1705004263654" TEXT="die letzte Node kann vor fr&#xfc;heren Nodes zum Zug kommen">
<icon BUILTIN="info"/>
<node CREATED="1705003087228" ID="ID_741945444" MODIFIED="1705003099054" TEXT="Konsequenz: Wake-up zu fr&#xfc;h getriggert"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1705003099694" ID="ID_1510371688" MODIFIED="1705003152022" TEXT="im Test-Bench &#xfc;berf&#xe4;hrt der n&#xe4;chtse Lauf den aktuellen Lauf">
<linktarget COLOR="#d90173" DESTINATION="ID_1510371688" ENDARROW="Default" ENDINCLINATION="226;-7;" ID="Arrow_ID_547071277" SOURCE="ID_372748970" STARTARROW="None" STARTINCLINATION="-325;11;"/>
<icon BUILTIN="broken-line"/>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1705003068679" ID="ID_975652225" MODIFIED="1705004256969" TEXT="nicht zu 100% auszuschlie&#xdf;en">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1705003171035" ID="ID_1766218775" MODIFIED="1705003181878" TEXT="wenn das gesamte Schedule ohne Schrittweite ausf&#xe4;llt"/>
<node CREATED="1705003184935" ID="ID_510244737" MODIFIED="1705003200875" TEXT="wenn der Graph sehr breit ist und nicht in eine Exit-Node zusammenl&#xe4;uft"/>
<node CREATED="1705003217034" ID="ID_1881563553" MODIFIED="1705010855805" TEXT="wegen Planning-Chunk-Aufteilung kann Dependency nur auf letzte ExitNode gesetzt werden">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
&#252;ber alles andere k&#246;nnen wir keine Annahmen machen &#8212; fr&#252;here Nodes k&#246;nnten schon &#8222;durch&#8220; sein und dann w&#252;rde der Wake-up f&#252;r-immer warten
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#384b8b" DESTINATION="ID_502331773" ENDARROW="Default" ENDINCLINATION="-142;-8;" ID="Arrow_ID_151297788" STARTARROW="None" STARTINCLINATION="-164;5;"/>
</node>
</node>
<node COLOR="#338800" CREATED="1705003318951" ID="ID_159903527" MODIFIED="1705009211252" TEXT="Heuristik: nominelle Zeit &gt; alle anderen">
<icon BUILTIN="button_ok"/>
<node CREATED="1705003345113" ID="ID_968042609" MODIFIED="1705003422497" TEXT="mu&#xdf; daf&#xfc;r dann doch die Node-ID (f&#xfc;r Spreizung) mit angeben">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
habe ich nicht gemacht, weil ich dachte, es sei eine gute Idee, wenn die Contuation &#187;fr&#252;hest-m&#246;glich&#171; zur&#252;ckkommt. An das Dependency-Problem habe ich nicht gedach.
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1705003424007" ID="ID_1509168666" MODIFIED="1705003450839" TEXT="da alle Spreads auf Null gesetzt sein k&#xf6;nnen &#x27f9; k&#xfc;nstlicher Aufschlag">
<node CREATED="1705003457506" ID="ID_1969405800" MODIFIED="1705003461192" TEXT="+10&#xb5;s"/>
<node CREATED="1705003466937" ID="ID_1006741284" MODIFIED="1705003475092" TEXT="damit steht dieser immer am Ende der Queue"/>
<node CREATED="1705003481007" ID="ID_397220801" MODIFIED="1705004288466">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
sofern SCHED_NOTIFY w&#228;ren wir <i>theoretisch </i>sicher
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#5b280f" CREATED="1705004289667" ID="ID_1272300583" MODIFIED="1705009215439" TEXT="praktisch leider nicht...">
<arrowlink COLOR="#e60a56" DESTINATION="ID_909211409" ENDARROW="Default" ENDINCLINATION="56;-82;" ID="Arrow_ID_1973950783" STARTARROW="None" STARTINCLINATION="-181;19;"/>
<icon BUILTIN="stop-sign"/>
<node CREATED="1705004334677" ID="ID_566241813" MODIFIED="1705004354158" TEXT="laufende Nodes k&#xf6;nnen Continuations &#x201e;nachliefern&#x201c;"/>
<node CREATED="1705004372232" ID="ID_1518391029" MODIFIED="1705004482664" TEXT="auch wenn vorher kurz die Queue ganz leer war">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
zwar kann (nach diesem ersten Fix) die Continuation erst starten, nachdem das von Anfang an geplante Schedule abgearbeitet war; jedoch laufen zu dem Zeitpunkt u.U noch eine Anzahl Nodes (Paralleit&#228;ts-Grad FAN_OUT). Und wenn diese dann fertig sind, k&#246;nnten die weitere NOTIFY-Dependencies &#8222;abwerfen&#8220; &#10233; SEGFAULT
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1705004228755" ID="ID_909211409" MODIFIED="1705010791415" TEXT="gen&#xfc;gt nicht &#x27f9; wenigstens partielle Dependencies">
<arrowlink COLOR="#3a84b6" DESTINATION="ID_1350365350" ENDARROW="Default" ENDINCLINATION="-192;14;" ID="Arrow_ID_980960219" STARTARROW="None" STARTINCLINATION="118;-27;"/>
<linktarget COLOR="#e60a56" DESTINATION="ID_909211409" ENDARROW="Default" ENDINCLINATION="56;-82;" ID="Arrow_ID_1973950783" SOURCE="ID_1272300583" STARTARROW="None" STARTINCLINATION="-181;19;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1705004486681" ID="ID_665048830" MODIFIED="1705004506586" TEXT="mu&#xdf; also doch explizit Dependencies setzen"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1705004507198" ID="ID_502331773" MODIFIED="1705010855806" TEXT="mu&#xdf; diese aber auf den aktuellen Chunk einschr&#xe4;nken">
<linktarget COLOR="#384b8b" DESTINATION="ID_502331773" ENDARROW="Default" ENDINCLINATION="-142;-8;" ID="Arrow_ID_151297788" SOURCE="ID_1881563553" STARTARROW="None" STARTINCLINATION="-164;5;"/>
</node>
</node>
</node>
</node>