Chain-Load: verify correct operation of planning logic

- test setup without actual scheduler
- wire the callbacks such to verify
  + all nodes are touched
  + levels are processed to completion
  + the planning chunk stops at the expected level
  + all node dependencies are properly reported through the callbacks
This commit is contained in:
Fischlurch 2023-12-04 23:31:21 +01:00
parent 29ca3a485f
commit 5e9b115283
3 changed files with 118 additions and 28 deletions

View file

@ -927,10 +927,16 @@ namespace test {
/** @test TODO setup for running a chain-load as scheduled task
/** @test setup for running a chain-load as scheduled task
* - running an isolated Node recalculation
* - dispatch of this recalculation packaged as render job
* @todo WIP 12/23 🔁 define 🔁 implement
* - verify the planning job, which processes nodes in batches;
* for the test, the callback-λ will not invoke the Scheduler,
* but rather use the instructions to create clone nodes;
* if all nodes are processed and all dependency connections
* properly reported through the callback-λ, then calculating
* this clone network should reproduce the original hash.
* @todo WIP 12/23 define implement
*/
void
verify_scheduling_setup()
@ -986,6 +992,73 @@ namespace test {
job3.triggerJob(); // Hash calculations are *not* idempotent
CHECK (e.hash != 0x6A5924BA3389D7C);
// use the »planing job« to organise the calculations:
// Let the callbacks create a clone — which at the end should generate the same hash
array<Node,4> clone;
size_t lastTouched(-1);
size_t lastLevel(-1);
bool shallContinue{false};
auto getNodeIdx = [&](Node* n) { return n - &nodes[0]; };
// callback-λ rigged for test....
// Instead of invoking the Scheduler, here we replicate the node structure
auto disposeStep = [&](size_t idx, size_t level)
{
Node& n = clone[idx];
n.clear();
n.level = level;
lastTouched = idx;
};
auto setDependency = [&](Node* pred, Node* succ)
{
size_t predIdx = getNodeIdx(pred);
size_t succIdx = getNodeIdx(succ);
// replicate this relation into the clone array
clone[predIdx].addSucc(clone[succIdx]);
};
auto continuation = [&](size_t levelDone, bool work_left)
{
lastLevel = levelDone;
shallContinue = work_left;
};
// build a JobFunctor for the planning step(s)
RandomChainPlanFunctor<16> planJob{nodes.front(), nodes.size()
,disposeStep
,setDependency
,continuation};
Job jobP1{planJob
,InvocationInstanceID()
,planJob.encodeLevel(1)};
Job jobP2{planJob
,InvocationInstanceID()
,planJob.encodeLevel(3)};
jobP1.triggerJob();
CHECK (lastTouched = 2);
CHECK (lastLevel = 1);
Node* lastN = &clone[lastTouched];
CHECK (lastN->level == lastLevel);
CHECK ( isnil (lastN->succ));
CHECK (not isnil (lastN->pred));
CHECK (shallContinue);
jobP2.triggerJob();
CHECK (lastTouched = 3);
CHECK (lastLevel = 3);
lastN = &clone[lastTouched];
CHECK (lastN->level == 2);
CHECK (lastN->level < lastLevel);
CHECK ( isnil (lastN->succ));
CHECK (not isnil (lastN->pred));
CHECK (not shallContinue);
// all clone nodes should be wired properly now
CHECK (lastN->hash == 0);
for (Node& n : clone)
n.calculate();
CHECK (lastN->hash == 0x6A5924BA3389D7C);
}
};

View file

@ -1136,31 +1136,31 @@ namespace test {
using Node = typename TestChainLoad<maxFan>::Node;
function<void(size_t,size_t)> scheduleCalcJob_;
function<void(size_t,size_t)> markDependency_;
function<void(Node*,Node*)> markDependency_;
function<void(size_t,bool)> continuation_;
size_t chunkSize_;
size_t maxCnt_;
Node* nodes_;
size_t currIdx_{0};
size_t currIdx_{0}; // Note: this test-JobFunctor is statefull
public:
template<class CAL, class DEP, class CON>
RandomChainPlanFunctor(size_t chunkSize, size_t maxLevel,
Node& nodeArray,
RandomChainPlanFunctor(Node& nodeArray, size_t nodeCnt,
CAL&& schedule, DEP&& markDepend,
CON&& continuation)
: scheduleCalcJob_{forward<CAL> (schedule)}
, markDependency_{forward<CAL> (markDepend)}
, continuation_{continuation}
, chunkSize_{chunkSize}
, maxCnt_{maxLevel}
, markDependency_{forward<DEP> (markDepend)}
, continuation_{forward<CON> (continuation)}
, maxCnt_{nodeCnt}
, nodes_{&nodeArray}
{ }
/** render job invocation to trigger one Node recalculation */
/** render job invocation to trigger one batch of scheduling;
* the installed callback-λ should actually place a job with
* RandomChainCalcFunctor for each node, and also inform the
* Scheduler about dependency relations between jobs. */
void
invokeJobOperation (JobParameter param) override
{
@ -1171,7 +1171,7 @@ namespace test {
if (n->level > targetLevel)
break;
scheduleCalcJob_(currIdx_, n->level);
for (Node* pred: n.pred)
for (Node* pred: n->pred)
markDependency_(pred,n);
}
continuation_(targetLevel, currIdx_ < maxCnt_);

View file

@ -57667,8 +57667,7 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701698319632"
ID="ID_883682364" MODIFIED="1701699545121" TEXT="Hash-Berechnung">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701698319632" ID="ID_883682364" MODIFIED="1701699545121" TEXT="Hash-Berechnung">
<icon BUILTIN="hourglass"/>
<icon BUILTIN="clanbomber"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701698589858" ID="ID_1039799906" MODIFIED="1701698595947" TEXT="#722 uniform uses of hash values">
@ -100610,13 +100609,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701488306399" ID="ID_437847189" MODIFIED="1701488325489" TEXT="Schinttstelle bestimmen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1701735941318" ID="ID_838192654" MODIFIED="1701735953071" TEXT="die Job-Functoren sind low-Level"/>
<node CREATED="1701735956675" ID="ID_1255143540" MODIFIED="1701735980625" TEXT="TestChainLoad hat Schedule-Operator">
<node CREATED="1701736001878" ID="ID_512576307" MODIFIED="1701736016095" TEXT="dieser bekommt die Scheduling-Charakteristiken"/>
<node CREATED="1701736046063" ID="ID_1447466146" MODIFIED="1701736059002" TEXT="und eine Referenz auf den Scheduler"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701493065993" ID="ID_1474617887" MODIFIED="1701493070377" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701548966576" ID="ID_1078499413" MODIFIED="1701548984371" TEXT="Basis und Rahmen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701549002234" ID="ID_1561610431" MODIFIED="1701550109050" TEXT="Design-Fragen zu kl&#xe4;ren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701549002234" ID="ID_1561610431" MODIFIED="1701735925477" TEXT="Design-Fragen zu kl&#xe4;ren">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701550180973" ID="ID_809373895" MODIFIED="1701630273510" TEXT="wie verarbeiten wir Prerequisites?">
<icon BUILTIN="help"/>
<node CREATED="1701550315571" ID="ID_1778692014" MODIFIED="1701550322317" TEXT="Activity-Term-API">
@ -100635,7 +100639,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701550594381" ID="ID_1100224733" MODIFIED="1701550628201" TEXT="brauche Hilfe vom TestChainLoad &#x27fc; NodeID herausfinden"/>
<node CREATED="1701550669625" ID="ID_318100058" MODIFIED="1701550690108" TEXT="&#x27f9; SchedulerSpec m&#xfc;ssen auch in einem Array liegen"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1701550796338" ID="ID_10603052" MODIFIED="1701550944298" TEXT="SchedulerSpec (und ActivityTerm) passen nicht gut in dieses Arbeitsschema">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701550796338" ID="ID_10603052" MODIFIED="1701735914954" TEXT="SchedulerSpec (und ActivityTerm) passen nicht gut in dieses Arbeitsschema">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701550947518" ID="ID_844132583" MODIFIED="1701550954585" TEXT="die waren als Builder gedacht"/>
<node CREATED="1701630020156" ID="ID_1451722632" MODIFIED="1701630029914" TEXT="und damit auf eine Einzelfall-Anwendung zugeschnitten"/>
@ -100675,8 +100679,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701630922141" ID="ID_887329209" MODIFIED="1701630929224" TEXT="explizitie Vorbereitung m&#xf6;glich"/>
<node CREATED="1701634155541" ID="ID_237095519" MODIFIED="1701634175327" TEXT="daf&#xfc;r m&#xf6;glichst generisch und klar"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701653204166" ID="ID_1263178085" MODIFIED="1701661760657" TEXT="Typen einrichten">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1701653204166" ID="ID_1263178085" MODIFIED="1701735891489" TEXT="Typen einrichten">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701653208718" FOLDED="true" ID="ID_1927337889" MODIFIED="1701659244968" TEXT="Problem: TestChainLoad hat zu viele Template-Parameter">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701653222644" ID="ID_1426060278" MODIFIED="1701653291333">
@ -100892,16 +100896,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701692351228" ID="ID_971527823" MODIFIED="1701692368970" TEXT="TPar: maxFan &#x27f6; Node-Layout"/>
<node CREATED="1701692370541" ID="ID_1427040653" MODIFIED="1701692389312" TEXT="Node-Array &#x27f9; raw pointer arrithmetics"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701662028749" ID="ID_1982023018" MODIFIED="1701662069143" TEXT="RandomChainPlanFunctor">
<node COLOR="#338800" CREATED="1701662028749" ID="ID_1982023018" MODIFIED="1701735889333" TEXT="RandomChainPlanFunctor">
<arrowlink COLOR="#546bbc" DESTINATION="ID_114421309" ENDARROW="Default" ENDINCLINATION="-34;-130;" ID="Arrow_ID_234763232" STARTARROW="None" STARTINCLINATION="-98;10;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1701692393563" ID="ID_1979090741" MODIFIED="1701702795082" TEXT="parametirisert mit 3 Funktoren">
<node CREATED="1701702805338" ID="ID_598071439" MODIFIED="1701702815217" TEXT="halte damit das Scheduler-API noch raus"/>
<node CREATED="1701702816068" ID="ID_1652334733" MODIFIED="1701702833077" TEXT="hoffe, so die Schleifen-Logik testen zu k&#xf6;nnen"/>
</node>
<node CREATED="1701692404354" ID="ID_410999909" MODIFIED="1701692419283" TEXT="damit rein f&#xfc;r die Schleifen-Logik zust&#xe4;ndig"/>
</node>
<node CREATED="1701693653847" ID="ID_735944505" MODIFIED="1701693663905" TEXT="gemeinsame Basisklasse">
<node COLOR="#338800" CREATED="1701693653847" ID="ID_735944505" MODIFIED="1701735892442" TEXT="gemeinsame Basisklasse">
<icon BUILTIN="button_ok"/>
<node CREATED="1701693665213" ID="ID_874266292" MODIFIED="1701693686411" TEXT="ChainFunctor (abstrakt)"/>
<node CREATED="1701693696854" ID="ID_1473365249" MODIFIED="1701693708309" TEXT="Handhabung der InvocationInstanceID"/>
<node CREATED="1701693708846" ID="ID_1233561389" MODIFIED="1701693713042" TEXT="Parameter encode/decode"/>
@ -100935,9 +100940,9 @@ 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="1701493075903" ID="ID_114421309" MODIFIED="1701702784104" TEXT="Meta-Job implementieren">
<node COLOR="#338800" CREATED="1701493075903" ID="ID_114421309" MODIFIED="1701735887233" TEXT="Meta-Job implementieren">
<linktarget COLOR="#546bbc" DESTINATION="ID_114421309" ENDARROW="Default" ENDINCLINATION="-34;-130;" ID="Arrow_ID_234763232" SOURCE="ID_1982023018" STARTARROW="None" STARTINCLINATION="-98;10;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701692565258" ID="ID_706254089" MODIFIED="1701702780297" TEXT="nun doch die Operationen als &#x3bb;">
<icon BUILTIN="button_ok"/>
</node>
@ -100953,8 +100958,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1701702762388" ID="ID_1493951597" MODIFIED="1701702780299" TEXT="ruft eine Continuation auf und signalisiert in-bound">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701702840464" ID="ID_211506547" MODIFIED="1701702848927" TEXT="reine Schleifen-Logik testen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701702840464" ID="ID_211506547" MODIFIED="1701735885970" TEXT="reine Schleifen-Logik testen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701730371400" ID="ID_278158848" MODIFIED="1701735877874" TEXT="alle Nodes werden erfa&#xdf;t">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1701730384179" ID="ID_1548774018" MODIFIED="1701735880310" TEXT="exakt die definierten Dependencies werden gemeldet">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1701730402905" ID="ID_161560731" MODIFIED="1701735882870" TEXT="Level werden als Ganzes bearbeitet">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1701730423505" ID="ID_1285268115" MODIFIED="1701735884581" TEXT="Schleife stoppt an der richtigen Stelle">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701493107387" ID="ID_1826192324" MODIFIED="1701493117170" TEXT="Aufruf-front-End">