Scheduler: draft high-level API for building a Job schedule

The invocation structure is effectively determined by the
Activity-chain builder from the Activity-Language; but, taking
into account the complexity of the Scheduler code developed thus far,
it seems prudent to encapsulate the topic of "Activities" altogether
and expose only a convenience builder-API towards the Job-Planning
This commit is contained in:
Fischlurch 2023-11-06 06:00:00 +01:00
parent c377ac7d46
commit 86b90fbf84
5 changed files with 172 additions and 17 deletions

View file

@ -147,6 +147,46 @@ namespace gear {
class ScheduleSpec
{
Job job_;
public:
ScheduleSpec (Job job)
: job_{job}
{ }
ScheduleSpec
startOffset (microseconds microTicks)
{
UNIMPLEMENTED ("start offset");
return move(*this);
}
ScheduleSpec
lifeWindow (microseconds microTicks)
{
UNIMPLEMENTED ("deadline relative to starts");
return move(*this);
}
ScheduleSpec
manifestation (ManifestationID manID)
{
UNIMPLEMENTED ("store manifestation-ID");
return move(*this);
}
ScheduleSpec
post()
{
UNIMPLEMENTED ("build chain and hand-over into queue");
return move(*this);
}
};
/******************************************************//**
* »Scheduler-Service« : coordinate render activities.
* @todo WIP-WIP 10/2023
@ -248,8 +288,8 @@ namespace gear {
/**
*
*/
void
buildJob()
ScheduleSpec
defineSchedule (Job job)
{
UNIMPLEMENTED("wrap the ActivityTerm");
}

View file

@ -73,7 +73,9 @@ namespace gear {
using std::atomic;
using util::unConst;
using std::chrono::milliseconds;
using std::chrono::microseconds;
using std::chrono_literals::operator ""ms;
using std::chrono_literals::operator ""us;
using std::this_thread::sleep_for;

View file

@ -368,7 +368,7 @@ namespace test {
Time t2{20,0}; Activity a2{2u,2u};
Time t3{30,0}; Activity a3{3u,3u};
Time t4{40,0}; Activity a4{4u,4u};
// start,deadline, manif.ID, isCompulsory
queue.instruct ({a1, t1, t4, ManifestationID{5}});
queue.instruct ({a2, t2, t2});
queue.instruct ({a3, t3, t3, ManifestationID{23}, true});
@ -497,7 +497,7 @@ namespace test {
queue.feedPrioritisation();
CHECK (now == queue.headTime());
CHECK (isSameObject (activity, *sched.findWork(queue, now)));
CHECK (sched.holdsGroomingToken (myself));
CHECK (sched.holdsGroomingToken (myself)); // findWork() acquired the token
CHECK (future == queue.headTime());
CHECK (not queue.isDue(now));
CHECK ( queue.isDue(future));

View file

@ -80,10 +80,11 @@ namespace test {
virtual void
run (Arg)
{
// simpleUsage();
// verify_StartStop();
simpleUsage();
verify_StartStop();
verify_LoadFactor();
// invokeWorkFunction();
invokeWorkFunction();
scheduleRenderJob();
walkingDeadline();
}
@ -137,7 +138,7 @@ namespace test {
/** @test verify the scheduler processes scheduled events,
* indicates current load and winds down automatically
* when falling empty.
* - placing short bursts of single FEED-Activities
* - schedule short bursts of single FEED-Activities
* - these actually do nothing and can be processed typically < 5µs
* - placing them spaced by 1µs, so the scheduler will build up congestion
* - since this Activity does not drop the »grooming-token«, actually only
@ -146,12 +147,14 @@ namespace test {
* - when reaching the scheduler »tick«, the queue should be empty
* and the scheduler will stop active processing
* - the main thread (this test) polls every 50µs to observe the load
* - after 2 seconds of idle-sleeping, the WorkForce is disengaged
* - verify the expected load pattern
* @todo WIP 10/23 define implement
*/
void
verify_LoadFactor()
{
MARK_TEST_FUN
BlockFlowAlloc bFlow;
EngineObserver watch;
Scheduler scheduler{bFlow, watch};
@ -284,19 +287,20 @@ namespace test {
* + after dispatching an Activity in a situation with no follow-up work,
* the work-function inserts a targeted sleep of random duration,
* to re-shuffle the rhythm of sleep cycles
* + when the next planned Activity has already be »tended for« (by placing
* + when the next planned Activity was already »tended for« (by placing
* another worker into a targeted sleep), further workers entering the
* work-function will be re-targeted by a random sleep to focus capacity
* into a time zone behind the next entry.
* @note Invoke the Activity probe itself can take 50..150µs, due to the EventLog,
* @note Invoking the Activity probe itself can take 50..150µs, due to the EventLog,
* which is not meant to be used in performance critical paths but only for tests,
* because it performs lots of heap allocations and string operations. Moreover,
* we see additional cache effects after an extended sleep period.
* @todo WIP 10/23 🔁 define implement
* @todo WIP 10/23 define implement
*/
void
invokeWorkFunction()
{
MARK_TEST_FUN
BlockFlowAlloc bFlow;
EngineObserver watch;
Scheduler scheduler{bFlow, watch};
@ -310,7 +314,7 @@ namespace test {
activity::Proc res;
auto post = [&](Time start)
{ // this test class is declared friend to get a backdoor to Scheduler internals...
{ // this test class is declared friend to get a backdoor into Scheduler internals...
scheduler.layer2_.acquireGoomingToken();
scheduler.postChain(ActivationEvent{probe, start});
};
@ -436,6 +440,47 @@ namespace test {
/** @test TODO schedule a render job through the high-level Job-builder API.
* - use the mock Job-Functor provided by the ActivityDetector
* @todo WIP 11/23 define 🔁 implement
*/
void
scheduleRenderJob()
{
MARK_TEST_FUN
BlockFlowAlloc bFlow;
EngineObserver watch;
Scheduler scheduler{bFlow, watch};
Time nominal{7,7};
Time start{0,1};
Time dead{0,10};
ActivityDetector detector;
Job testJob{detector.buildMockJob("testJob", nominal, 1337)};
CHECK (scheduler.empty());
scheduler.defineSchedule(testJob)
.startOffset(200us)
.lifeWindow (1ms)
.manifestation(ManifestationID{55})
.post();
CHECK (not scheduler.empty());
CHECK (detector.ensureNoInvocation("testJob"));
sleep_for(400us);
CHECK (detector.ensureNoInvocation("testJob"));
CHECK (activity::PASS == scheduler.getWork());
CHECK (scheduler.empty());
cout << detector.showLog()<<endl; // HINT: use this for investigation...
CHECK (detector.verifyInvocation("testJob"));
}
/** @test TODO
* @todo WIP 10/23 🔁 define implement
*/

View file

@ -81996,7 +81996,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<head/>
<body>
<p>
....das hat sich allerdings schon aus der Analyse des Pull-Processing im Node-Network so ergeben, denn dort geht man von der ExitNode r&#252;ckw&#228;rts; damals konnte ich nicht vorhersehen, wie die Situation im Scheduler sich darstellen wird &#8212; m&#246;glicherweise verbirg sich eine tiefere, strukturelle Konvergenz dahinter, da&#223; das jetzt so <i>sch&#246;n aufgeht</i>
....das hat sich allerdings schon aus der Analyse des Pull-Processing im Node-Network so ergeben, denn dort geht man von der ExitNode r&#252;ckw&#228;rts; damals konnte ich nicht vorhersehen, wie die Situation im Scheduler sich darstellen wird &#8212; m&#246;glicherweise verbirgt sich eine tiefere, strukturelle Konvergenz dahinter, da&#223; das jetzt so <i>sch&#246;n aufgeht</i>
</p>
</body>
</html></richcontent>
@ -82029,6 +82029,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698937122167" ID="ID_4829396" MODIFIED="1698937490736" TEXT="kann dort Inteface-Typen definieren">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1699245684722" ID="ID_1883772504" MODIFIED="1699245829024" TEXT="Zusammenarbeit mit SchedulerService erm&#xf6;glichen">
<linktarget COLOR="#fedfb1" DESTINATION="ID_1883772504" ENDARROW="Default" ENDINCLINATION="-261;14;" ID="Arrow_ID_416423581" SOURCE="ID_788545423" STARTARROW="None" STARTINCLINATION="242;-83;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1699245702520" ID="ID_1053537499" MODIFIED="1699245792944" TEXT="m&#xf6;glichst wenig virtuelle Funktionen">
<linktarget COLOR="#d06592" DESTINATION="ID_1053537499" ENDARROW="Default" ENDINCLINATION="212;16;" ID="Arrow_ID_1604416829" SOURCE="ID_1282593493" STARTARROW="None" STARTINCLINATION="319;-10;"/>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node CREATED="1698936458463" ID="ID_1013196495" MODIFIED="1698936467425" TEXT="bedeutet: virtuelle Funktionen">
@ -82067,8 +82075,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#2f9552" DESTINATION="ID_492054934" ENDARROW="Default" ENDINCLINATION="-315;-355;" ID="Arrow_ID_1566437327" STARTARROW="None" STARTINCLINATION="253;14;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1698945492703" TEXT="Wrapper-Builder um den Activity-Term legen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1699246415190" TEXT="Wrapper-Builder um den Activity-Term legen">
<linktarget COLOR="#f4336b" DESTINATION="ID_1142273023" ENDARROW="Default" ENDINCLINATION="-737;663;" ID="Arrow_ID_891496003" SOURCE="ID_175313196" STARTARROW="None" STARTINCLINATION="1218;-76;"/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698945250261" ID="ID_780386157" MODIFIED="1698946166942" TEXT="Zusatz-Angaben zur Relevanz">
<linktarget COLOR="#3d3aa9" DESTINATION="ID_780386157" ENDARROW="Default" ENDINCLINATION="69;74;" ID="Arrow_ID_103420327" SOURCE="ID_1778628995" STARTARROW="None" STARTINCLINATION="317;25;"/>
<icon BUILTIN="flag-yellow"/>
@ -82076,6 +82085,40 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698947287399" ID="ID_391005911" LINK="#ID_1426746639" MODIFIED="1698947345862" TEXT="Job-Deadline auf API verpflichtend">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245520392" ID="ID_1677467445" MODIFIED="1699246079335" TEXT="Builder-Funktionen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245533215" ID="ID_1666620904" MODIFIED="1699246017062" TEXT="relative Zeitangabe">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1699246024149" ID="ID_329731071" MODIFIED="1699246029581" TEXT="absolute Zeitangabe">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1699246030839" HGAP="86" ID="ID_685534906" MODIFIED="1699246062128" TEXT="(mal warten wie die Job-Planung ausf&#xe4;llt)" VSHIFT="1">
<font ITALIC="true" NAME="SansSerif" SIZE="9"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245538409" ID="ID_1074993324" MODIFIED="1699246017064" TEXT="hier auch schon mal std::chrono mit integrieren (f&#xfc;r Tests)">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245552636" ID="ID_1654937511" MODIFIED="1699246017063" TEXT="relative Deadline">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245562635" ID="ID_1277275368" MODIFIED="1699246017063" TEXT="weitere Setter">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245577969" ID="ID_1964298619" MODIFIED="1699246079334" TEXT="post() ausf&#xfc;hren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1699245611846" ID="ID_788545423" MODIFIED="1699245919549" TEXT="Definitions-Struktur und Code-Anordnung kl&#xe4;ren">
<arrowlink COLOR="#fedfb1" DESTINATION="ID_1883772504" ENDARROW="Default" ENDINCLINATION="-261;14;" ID="Arrow_ID_416423581" STARTARROW="None" STARTINCLINATION="242;-83;"/>
<arrowlink COLOR="#f5dffd" DESTINATION="ID_3688190" ENDARROW="Default" ENDINCLINATION="-410;-597;" ID="Arrow_ID_1041094005" STARTARROW="None" STARTINCLINATION="-664;318;"/>
<icon BUILTIN="flag-pink"/>
<node CREATED="1699245733434" ID="ID_1697507405" MODIFIED="1699245746917" TEXT="die post()-Implementierung mu&#xdf; den eigentlichen Scheduler sehen"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1699245761304" ID="ID_1282593493" MODIFIED="1699245799661" TEXT="eine Indirektion ist unvermeidbar; fragt sich blo&#xdf; wo?">
<arrowlink COLOR="#d06592" DESTINATION="ID_1053537499" ENDARROW="Default" ENDINCLINATION="212;16;" ID="Arrow_ID_1604416829" STARTARROW="None" STARTINCLINATION="319;-10;"/>
<icon BUILTIN="help"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697757025906" ID="ID_180161439" MODIFIED="1697757063868" TEXT="seedCalcStream()">
<icon BUILTIN="flag-yellow"/>
@ -83199,7 +83242,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698524123493" HGAP="7" ID="ID_3688190" MODIFIED="1698524141896" TEXT="Code-Anordnung festlegen" VSHIFT="5">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698524123493" HGAP="7" ID="ID_3688190" MODIFIED="1699245904190" TEXT="Code-Anordnung festlegen" VSHIFT="5">
<linktarget COLOR="#f5dffd" DESTINATION="ID_3688190" ENDARROW="Default" ENDINCLINATION="-410;-597;" ID="Arrow_ID_1041094005" SOURCE="ID_788545423" STARTARROW="None" STARTINCLINATION="-664;318;"/>
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698524143083" ID="ID_1366033191" MODIFIED="1698524154797" TEXT="Speicher-Ort f&#xfc;r eine Service-Instanz">
<icon BUILTIN="flag-yellow"/>
@ -83222,6 +83266,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698524289134" ID="ID_624223134" MODIFIED="1698524295738" TEXT="diese inlined die Scheduler-Internals"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245952137" ID="ID_1391908403" MODIFIED="1699245964386" TEXT="Job-Definition (Builder) ber&#xfc;cksichtigen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245966828" ID="ID_1446058222" MODIFIED="1699245979843" TEXT="der ist im API-Header definiert">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1699245983155" ID="ID_1339797501" MODIFIED="1699245999081" TEXT="braucht aber Zugang zur Implementierung">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1693172069235" ID="ID_1573845677" MODIFIED="1697675305351" TEXT="Layer-1: SchedulerInvocation"/>
@ -84046,8 +84099,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node COLOR="#338800" CREATED="1697982436029" ID="ID_288711039" MODIFIED="1698808212796" TEXT="Test">
<arrowlink COLOR="#56a5a9" DESTINATION="ID_488605324" ENDARROW="Default" ENDINCLINATION="457;-68;" ID="Arrow_ID_1794430254" STARTARROW="None" STARTINCLINATION="-752;0;"/>
<arrowlink COLOR="#56a5a9" DESTINATION="ID_1292738036" ENDARROW="Default" ENDINCLINATION="286;-465;" ID="Arrow_ID_367470516" STARTARROW="None" STARTINCLINATION="-752;0;"/>
<arrowlink COLOR="#56a5a9" DESTINATION="ID_488605324" ENDARROW="Default" ENDINCLINATION="457;-68;" ID="Arrow_ID_1794430254" STARTARROW="None" STARTINCLINATION="-752;0;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698521316395" ID="ID_1194473945" MODIFIED="1698521326921" TEXT="kann im Test die Timing/Sleep-Muster zeigen">
<icon BUILTIN="button_ok"/>
@ -90046,6 +90099,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698275570360" ID="ID_1639263149" MODIFIED="1698275580859" TEXT="leere work-Function: 2&#xb5;s"/>
<node CREATED="1698275583014" ID="ID_1884559465" MODIFIED="1698275618806" TEXT="post() einstellen &#x27f6; Dispatch: 5&#xb5;s"/>
</node>
<node CREATED="1699241559870" ID="ID_272897929" MODIFIED="1699241563925" TEXT="-O0">
<node CREATED="1699241565249" ID="ID_290905521" MODIFIED="1699241579030" TEXT="komplett-Dispatch FEED-Activity: 5&#xb5;s"/>
<node CREATED="1699241580463" ID="ID_1046781011" MODIFIED="1699241588749" TEXT="(wenn Cache hei&#xdf;)">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
</node>
<node CREATED="1697758391611" ID="ID_124711923" MODIFIED="1697758397083" TEXT="F&#xe4;lle">
@ -92117,6 +92176,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699243246184" ID="ID_834498549" MODIFIED="1699245502339" TEXT="scheduleRenderJob">
<icon BUILTIN="pencil"/>
<node CREATED="1699243261338" ID="ID_266519660" MODIFIED="1699243272937" TEXT="verwendet einen Job vom ActivityDetector"/>
<node CREATED="1699243350122" ID="ID_175313196" MODIFIED="1699246395229" TEXT="&#xfc;bergibt den per Builder-API an den Scheduler">
<arrowlink COLOR="#f4336b" DESTINATION="ID_1142273023" ENDARROW="Default" ENDINCLINATION="-737;663;" ID="Arrow_ID_891496003" STARTARROW="None" STARTINCLINATION="1218;-76;"/>
</node>
<node CREATED="1699243361425" ID="ID_565283839" MODIFIED="1699243380530" TEXT="ruft die work-Function direkt auf (keine WorkForce!)"/>
<node CREATED="1699243391733" ID="ID_1214068544" MODIFIED="1699243397136" TEXT="verifiziert Aufruf per Log"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697755558855" ID="ID_278365674" MODIFIED="1697741858009" TEXT="SchedulerStress_test">