Scheduler-test: force dependency-wait to wake-up job

The main (test) thread is kept in a blocking wait until the
planned schedule is completed. If however the schedule overruns,
the wake-up job could just be triggered prematurely.

This can easily be prevented by adding a dependency from the last
computation job to the wake-up job. If the computation somehow
flounders, the SAFETY_TIMEOUT (5s) will eventually raise
an exception to let the test fail cleanly (shutting down
the Scheduler automatically)
This commit is contained in:
Fischlurch 2023-12-13 22:55:28 +01:00
parent 206c67cc8a
commit 3e84224f74
6 changed files with 80 additions and 12 deletions

View file

@ -163,12 +163,12 @@ namespace gear {
private:
/** @internal generate the builder / configurator term */
activity::Term
setupActivityScheme (activity::Term::Template schemeKind, Job job, Time start, Time after)
setupActivityScheme (activity::Term::Template schemeKind, Job job, Time start, Time dead)
{
return activity::Term{ mem_.until(after)
return activity::Term{ mem_.until(dead)
, schemeKind
, start
, after
, dead
, job
};
}

View file

@ -120,10 +120,10 @@ namespace gear {
};
explicit
Term (AllocHandle&& allocHandle, Template kind, Time start, Time after, Job job)
Term (AllocHandle&& allocHandle, Template kind, Time start, Time dead, Job job)
: alloc_{move (allocHandle)}
, invoke_{setupInvocation (job)}
, post_{setupPost (start,after, invoke_)}
, post_{setupPost (start,dead, invoke_)}
{
configureTemplate (kind);
}
@ -257,9 +257,9 @@ namespace gear {
}
Activity*
setupPost (Time start, Time after, Activity* followUp)
setupPost (Time start, Time dead, Activity* followUp)
{
return & alloc_.create (start,after,followUp);
return & alloc_.create (start,dead,followUp);
}
void

View file

@ -195,6 +195,14 @@ namespace gear {
return move(*this);
}
ScheduleSpec
compulsory (bool truely =true)
{
isCompulsory_ = truely;
return move(*this);
}
/** build Activity chain and hand-over to the Scheduler. */
ScheduleSpec post();

View file

@ -552,7 +552,8 @@ namespace test {
processSchedule()
{
MARK_TEST_FUN
auto LOAD_BASE = 200us;
auto LOAD_BASE = 1ms;
TestChainLoad testLoad{64};
// .configureShape_short_segments3_interleaved()
@ -581,6 +582,7 @@ SHOW_EXPR(referenceTime)
testLoad.setupSchedule(scheduler)
.withLoadTimeBase(LOAD_BASE)
.withJobDeadline(100ms)
.launch_and_wait();
// invocation through Scheduler has reproduced all node hashes

View file

@ -1610,11 +1610,17 @@ namespace test {
,manID_);
}
else
scheduler_.continueMetaJob (calcStartTime (levelDone+1)
,wakeUpJob()
,manID_);
scheduler_.defineSchedule(wakeUpJob())
.manifestation (manID_)
.startTime(calcStartTime (levelDone+1))
.lifeWindow(1s)
.compulsory()
.post()
.linkToPredecessor (schedule_[lastNodeIDX])
; // Setup wait-dependency on last computation
}
std::future<void>
performRun()
{

View file

@ -103267,7 +103267,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1702441785767" ID="ID_720337177" MODIFIED="1702441794596" TEXT="Ma&#xdf;nahmen">
<node COLOR="#435e98" CREATED="1702441785767" ID="ID_720337177" MODIFIED="1702495206270" TEXT="Ma&#xdf;nahmen">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="forward"/>
<node COLOR="#338800" CREATED="1702441683718" ID="ID_1861186167" MODIFIED="1702443370493" TEXT="Vereinfachung in der Sprachauswertung beseitigt viele redundante &#x3bb;-post">
<linktarget COLOR="#85c5af" DESTINATION="ID_1861186167" ENDARROW="Default" ENDINCLINATION="683;22;" ID="Arrow_ID_1560412883" SOURCE="ID_880220704" STARTARROW="None" STARTINCLINATION="275;13;"/>
@ -103285,6 +103286,22 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1702495209397" ID="ID_1653510240" MODIFIED="1702502179633" TEXT="n&#xe4;chster Trace sieht besser aus">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702495402514" ID="ID_1543356169" MODIFIED="1702495411067" TEXT="deadlines werden nun dynamisch gesetzt">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1702495456388" ID="ID_848150841" MODIFIED="1702495475621" TEXT="deadlines sind korrekt gem&#xe4;&#xdf; Follow-up-Job"/>
<node CREATED="1702495780587" ID="ID_568485686" MODIFIED="1702495794883" TEXT="ein einziger Worker arbeitet die gesamte Kette ab">
<node CREATED="1702495804347" ID="ID_58366967" MODIFIED="1702495905049" TEXT="Dauer: 25312-304 = 25008&#xb5;s"/>
<node CREATED="1702495906944" ID="ID_966835817" MODIFIED="1702495934504" TEXT="&#x2205; 390.85&#xb5;s"/>
<node CREATED="1702496050140" ID="ID_1027208983" MODIFIED="1702496069988" TEXT="Reference-time(single)=13064.993&#xb5;s"/>
<node CREATED="1702496142096" ID="ID_806958276" MODIFIED="1702496164835" TEXT="&#xd83e;&#xdc32; 91.4% Overhead">
<node CREATED="1702496205139" ID="ID_111513179" MODIFIED="1702496214051" TEXT="per Beobachtung: 190&#xb5;s / Step"/>
<node CREATED="1702496215064" ID="ID_835671568" MODIFIED="1702496237909" TEXT="per Referenz-Zeit: 186&#xb5;s / Step"/>
</node>
</node>
</node>
</node>
<node CREATED="1702427050770" ID="ID_974165172" MODIFIED="1702427059369" TEXT="n&#xe4;chster Lauf funktioniert...">
<node CREATED="1702427124405" ID="ID_1550920815" MODIFIED="1702427157812" TEXT="hier werden am &quot;problematischen Abschnitt&quot; drei Notify-post dispatched">
@ -103333,6 +103350,41 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1702502185844" ID="ID_90360587" MODIFIED="1702504217152" TEXT="mu&#xdf; Warten erzwingen">
<icon BUILTIN="yes"/>
<node CREATED="1702502209817" ID="ID_1809111942" MODIFIED="1702502224706" TEXT="Dependency vom wake-up-Job setzen">
<icon BUILTIN="idea"/>
<node CREATED="1702502229318" ID="ID_128135299" MODIFIED="1702502255524" TEXT="sollte nicht schwer sein...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
da wir alle ScheduleSpec-Terme in einem Array halten
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1702503012245" ID="ID_1867098513" MODIFIED="1702503045111" TEXT="ist dann kein Meta-Job mehr"/>
<node CREATED="1702503071612" ID="ID_1616639285" MODIFIED="1702503089510" TEXT="setzte l&#xe4;ngere Deadline &#x2254; 1sec"/>
<node CREATED="1702503090546" ID="ID_146168524" MODIFIED="1702503112917" TEXT="markiere den Job als &#xbb;compulsory&#xab;">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1702503113719" ID="ID_1888291213" MODIFIED="1702503123642" TEXT="bringt das was?">
<icon BUILTIN="help"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1702503126930" ID="ID_95376983" MODIFIED="1702504211403" TEXT="Test h&#xe4;ngt">
<icon BUILTIN="broken-line"/>
<node CREATED="1702503848860" ID="ID_1914405903" MODIFIED="1702503857039" TEXT="liegt aber nur an den Job-Deadlines"/>
<node CREATED="1702503858546" ID="ID_1996298783" MODIFIED="1702503876020" TEXT="wenn man die entsprechend verl&#xe4;ngert, funktioniert&apos;s"/>
<node CREATED="1702503996960" ID="ID_1870969909" MODIFIED="1702504099598" TEXT="mit load-Base&#x2254;1ms &#x27fc; Gesamtzeit 83ms"/>
<node CREATED="1702504066855" ID="ID_255921611" MODIFIED="1702504082328" TEXT="referenz-Zeit: 65924.825&#xb5;s"/>
<node CREATED="1702504155370" ID="ID_1935608101" MODIFIED="1702504198984" TEXT="&#xd83e;&#xdc32; 26% Overhead bzw. 266&#xb5;s / Step"/>
</node>
</node>
</node>
</node>
</node>