Scheduler: allow to manipulate nominal full capacity

While building increasingly complex integration tests for the Scheduler,
it turns out helpful to be able to manipulate the "full concurreency"
as used by Scheduler, WorkForce and LoadController.

In the current test, I am facing a problem that new entries from the
threadsafe entrance queue are not propagated to the priority queue
soon enough; partly this is due to functionality still to be added
(scaling up when new tasks are passed in) -- but this will further
complicate the test setup.
This commit is contained in:
Fischlurch 2023-11-07 16:12:56 +01:00
parent 86a909b850
commit 8056bebf9c
8 changed files with 246 additions and 51 deletions

View file

@ -52,21 +52,21 @@ namespace util {
template <class NUM>
inline int
inline int constexpr
sgn (NUM n)
{
return (n==0)? 0 :((n<0)? -1:+1 );
}
template <class N1, class N2>
inline N1
inline N1 constexpr
min (N1 n1, N2 n2)
{
return n2 < n1? N1(n2) : n1;
}
template <class N1, class N2>
inline N1
inline N1 constexpr
max (N1 n1, N2 n2)
{
return n1 < n2? N1(n2) : n1;
@ -74,7 +74,7 @@ namespace util {
/** cut a numeric value to be >=0 */
template <typename NUM>
inline NUM
inline NUM constexpr
noneg (NUM val)
{
return (0<val? val : 0);
@ -82,7 +82,7 @@ namespace util {
/** force a numeric to be within bounds, inclusively */
template <typename NUM, typename NB>
inline NUM
inline NUM constexpr
limited (NB lowerBound, NUM val, NB upperBound)
{
return min ( max (val, lowerBound)

View file

@ -152,8 +152,7 @@ namespace gear {
public:
struct Wiring
{
size_t maxCapacity{2};
function<size_t()> maxCapacity {[]{ return 1; }};
function<size_t()> currWorkForceSize{[]{ return 0; }};
///////TODO add here functors to access performance indicators
};
@ -189,7 +188,7 @@ namespace gear {
double lag = _raw(std::clamp<TimeVar> (now - (head.isRegular()? head:now)
, -SLEEP_HORIZON
, WORK_HORIZON));
const double alpha = LAG_SAMPLE_DAMPING / (1 + wiring_.maxCapacity);
const double alpha = LAG_SAMPLE_DAMPING / (1 + wiring_.maxCapacity());
int64_t average = sampledLag_.load (memory_order_relaxed);
int64_t newAverage;
do newAverage = std::floor (lag*alpha + (1-alpha)*average);
@ -238,7 +237,7 @@ namespace gear {
lag /= _raw(WORK_HORIZON);
lag *= 10;
double lagFactor = lag<0? 1/(1-lag): 1+lag;
double loadFactor = wiring_.currWorkForceSize() / double(wiring_.maxCapacity);
double loadFactor = wiring_.currWorkForceSize() / double(wiring_.maxCapacity());
return loadFactor * lagFactor;
}

View file

@ -360,7 +360,7 @@ namespace gear {
connectMonitoring()
{
LoadController::Wiring setup;
setup.maxCapacity = work::Config::COMPUTATION_CAPACITY;
setup.maxCapacity = []{ return work::Config::COMPUTATION_CAPACITY; };
setup.currWorkForceSize = [this]{ return workForce_.size(); };
return setup;
}

View file

@ -23,27 +23,14 @@
/** @file work-force.cpp
** Implementation of render worker coordination.
**
** @note as of X/2023 this is complete bs
** @todo WIP ///////////////////////TICKET #
**
** @see ////TODO_test usage example
** @see scheduler.cpp implementation
**
** @todo WIP-WIP-WIP 6/2023 »Playback Vertical Slice«
** @todo WIP-WIP 11/2023 »Playback Vertical Slice«
**
*/
#include "vault/gear/work-force.hpp"
//#include "lib/symbol.hpp"
//#include "include/logging.h"
#include "lib/util.hpp"
//#include <string>
//using std::string;
//using util::isnil;
namespace vault{
namespace gear {
@ -56,15 +43,24 @@ namespace gear {
// NA::~NA() { }
/** default value for full computing capacity is to use all (virtual) cores */
const size_t work::Config::COMPUTATION_CAPACITY = util::max (std::thread::hardware_concurrency()
, MINIMAL_CONCURRENCY);
/**
* Nominal »full size« of a pool of concurrent workers.
* This value is [initialised](\ref Config::getDefaultComputationCapacity)
* to use all available concurrent computing cores, but can be adjusted.
* Adjustments should be done before a worker pool scales up.
* @warning this value is taken as-is; setting it to zero will disable
* many (but not all) aspects of concurrent processing.
*/
size_t work::Config::COMPUTATION_CAPACITY = Config::getDefaultComputationCapacity();
/**
* default value for full computing capacity is to use all (virtual) cores.
*/
size_t
work::Config::getDefaultComputationCapacity()
{
return util::max (std::thread::hardware_concurrency()
, MINIMAL_CONCURRENCY);
}
}} // namespace vault::gear

View file

@ -95,10 +95,12 @@ namespace gear {
*/
struct Config
{
static const size_t COMPUTATION_CAPACITY;
static size_t COMPUTATION_CAPACITY;
const milliseconds IDLE_WAIT = 20ms;
const size_t DISMISS_CYCLES = 100;
static size_t getDefaultComputationCapacity();
};

View file

@ -316,7 +316,7 @@ namespace test {
uint currThreads = 0;
LoadController::Wiring setup;
setup.maxCapacity = maxThreads;
setup.maxCapacity = [&]{ return maxThreads; };
setup.currWorkForceSize = [&]{ return currThreads; };
// rigged setup to verify calculated load indicator
LoadController lctrl{move(setup)};

View file

@ -80,10 +80,10 @@ namespace test {
virtual void
run (Arg)
{
simpleUsage();
verify_StartStop();
verify_LoadFactor();
invokeWorkFunction();
// simpleUsage();
// verify_StartStop();
// verify_LoadFactor();
// invokeWorkFunction();
scheduleRenderJob();
walkingDeadline();
}
@ -464,24 +464,27 @@ namespace test {
//////////////////////////////////
CHECK (scheduler.empty());
SHOW_EXPR(offset())
auto buidl=
scheduler.defineSchedule(testJob)
.startOffset(200us)
.lifeWindow (1ms)
.manifestation(ManifestationID{55})
.post();
.lifeWindow (1ms);
SHOW_EXPR(offset())
buidl .post();
CHECK (not scheduler.empty());
CHECK (detector.ensureNoInvocation("testJob"));
// CHECK (detector.ensureNoInvocation("testJob"));
SHOW_EXPR(offset())
sleep_for(400us);
CHECK (detector.ensureNoInvocation("testJob"));
// CHECK (detector.ensureNoInvocation("testJob"));
SHOW_EXPR(offset())
scheduler.layer1_.feedPrioritisation();
auto res= scheduler.getWork();
SHOW_EXPR(res)
SHOW_EXPR(offset())
SHOW_EXPR(res)
SHOW_EXPR(offset(scheduler.layer1_.headTime()))
// CHECK (activity::PASS == scheduler.getWork());
CHECK (scheduler.empty());
// CHECK (scheduler.empty());
cout << detector.showLog()<<endl; // HINT: use this for investigation...
CHECK (detector.verifyInvocation("testJob"));

View file

@ -82115,8 +82115,22 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node COLOR="#338800" CREATED="1699245577969" ID="ID_1964298619" MODIFIED="1699310570096" TEXT="post() ausf&#xfc;hren">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1964298619" ENDARROW="Default" ENDINCLINATION="27;865;" ID="Arrow_ID_900145073" SOURCE="ID_760916314" STARTARROW="Default" STARTINCLINATION="-554;-36;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699325172901" ID="ID_1435123962" MODIFIED="1699325566562" TEXT="mu&#xdf; Kapazit&#xe4;t pr&#xfc;fen / Hochskalieren">
<arrowlink COLOR="#57496c" DESTINATION="ID_745204926" ENDARROW="Default" ENDINCLINATION="249;-377;" ID="Arrow_ID_55492946" STARTARROW="None" STARTINCLINATION="668;346;"/>
<linktarget COLOR="#662136" DESTINATION="ID_1435123962" ENDARROW="Default" ENDINCLINATION="304;54;" ID="Arrow_ID_928822414" SOURCE="ID_1792556883" STARTARROW="None" STARTINCLINATION="-206;16;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699329348003" ID="ID_396553511" MODIFIED="1699368192260" TEXT="Parameter zur WorkForce-St&#xe4;rke ber&#xfc;cksichtigen">
<linktarget COLOR="#7f4745" DESTINATION="ID_396553511" ENDARROW="Default" ENDINCLINATION="486;26;" ID="Arrow_ID_329496296" SOURCE="ID_651840656" STARTARROW="None" STARTINCLINATION="728;32;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1699329449911" ID="ID_1960065591" MODIFIED="1699329453611" TEXT="wenn....">
<node CREATED="1699329454534" ID="ID_258337881" MODIFIED="1699329465057" TEXT="Scheduler l&#xe4;uft nicht &#x27f9; ignite()"/>
<node CREATED="1699329466069" ID="ID_1149902545" MODIFIED="1699329477423" TEXT="nicht volle St&#xe4;rke &#x27f9; step"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699245611846" ID="ID_788545423" MODIFIED="1699307283267" 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;"/>
@ -82669,6 +82683,37 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1699329055524" ID="ID_1177531499" MODIFIED="1699368575685" TEXT="WorkForce-Parameter: COMPUTATION_CAPACITY">
<arrowlink COLOR="#64334e" DESTINATION="ID_1000686206" ENDARROW="Default" ENDINCLINATION="-739;-25;" ID="Arrow_ID_1025143985" STARTARROW="None" STARTINCLINATION="-283;494;"/>
<linktarget COLOR="#786a97" DESTINATION="ID_1177531499" ENDARROW="Default" ENDINCLINATION="-920;53;" ID="Arrow_ID_1670167461" SOURCE="ID_1757255005" STARTARROW="None" STARTINCLINATION="61;-138;"/>
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#435e98" CREATED="1699329238981" ID="ID_407782041" MODIFIED="1699329259621" TEXT="Idee: nicht alle Cores verwenden">
<icon BUILTIN="info"/>
<node CREATED="1699329261275" ID="ID_1627297150" MODIFIED="1699329269211" TEXT="k&#xf6;nnte tats&#xe4;chlich sinnvoll sein"/>
<node CREATED="1699329290856" ID="ID_387151968" MODIFIED="1699329300199" TEXT="aktuell n&#xfc;tzt es mir f&#xfc;r die Tests"/>
</node>
<node CREATED="1699368212285" ID="ID_855305118" MODIFIED="1699368213601" TEXT="wird von WorkForce und LoadController als Referenz verwendet"/>
<node COLOR="#338800" CREATED="1699329306877" ID="ID_651840656" MODIFIED="1699368342608" TEXT="dieser Parameter ist nun explizit &#xe4;nderbar (nicht mehr const)">
<arrowlink COLOR="#7f4745" DESTINATION="ID_396553511" ENDARROW="Default" ENDINCLINATION="486;26;" ID="Arrow_ID_329496296" STARTARROW="None" STARTINCLINATION="728;32;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1699368246481" ID="ID_817072584" MODIFIED="1699368325222" TEXT="wird aber wie eine Konstante behandelt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
....also kein Locking etc; allerdings greift der LoadController jetzt per Lambda darauf zu.
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1699368298187" ID="ID_1401898380" MODIFIED="1699368321811" TEXT="sollte man also bei stehendem Scheduler &#xe4;ndern">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697808056565" ID="ID_10043675" MODIFIED="1697808062704" TEXT="Fehlerbehandlung bedenken">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697808069219" ID="ID_1793076416" MODIFIED="1698518471734" TEXT="Grooming-Token garantiert freigeben">
@ -82910,6 +82955,73 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1699068495938" ID="ID_1790197795" MODIFIED="1699068527242" TEXT="das ist ein internes API &#x2014; aber die zentrale Achse"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1699313803867" HGAP="-20" ID="ID_1032033223" MODIFIED="1699328444728" TEXT="Logik-Fehler: neu geplanter Job steckt fest" VSHIFT="18">
<linktarget COLOR="#f91d6b" DESTINATION="ID_1032033223" ENDARROW="Default" ENDINCLINATION="-973;63;" ID="Arrow_ID_46385590" SOURCE="ID_550874585" STARTARROW="None" STARTINCLINATION="630;-68;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1699314171601" ID="ID_911884909" MODIFIED="1699314174654" TEXT="Szenario">
<node CREATED="1699314175722" ID="ID_760916314" MODIFIED="1699314218863" TEXT="Render-Job per high-level API eingestellt">
<arrowlink DESTINATION="ID_1964298619" ENDARROW="Default" ENDINCLINATION="27;865;" ID="Arrow_ID_900145073" STARTARROW="Default" STARTINCLINATION="-554;-36;"/>
</node>
<node CREATED="1699314230211" ID="ID_468314180" MODIFIED="1699314238150" TEXT="Scheduler::getWork() aufgerufen"/>
<node CREATED="1699314250040" ID="ID_154801779" MODIFIED="1699314262819" TEXT="liefert: activity::WAIT">
<icon BUILTIN="forward"/>
</node>
</node>
<node CREATED="1699314283068" ID="ID_1215190474" MODIFIED="1699314330289" TEXT="Problem-Situation">
<node CREATED="1699314331405" ID="ID_601536457" MODIFIED="1699314347447" TEXT="das neue ActivationEvent sitzt noch in der Eingangs-Queue"/>
<node CREATED="1699314348751" ID="ID_786038008" MODIFIED="1699314417293" TEXT="&#x27f9; die pre-Dispatch-Kapazit&#xe4;tssteuerung &#x27fc; idle-WAIT"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1699314450362" ID="ID_1548210369" MODIFIED="1699314482186" TEXT="Problem: solange niemand das Grooming-Token hat, passiert kein feedPrioritisation()">
<icon BUILTIN="clanbomber"/>
<node CREATED="1699314936837" ID="ID_1589318425" MODIFIED="1699315051503" TEXT="die pre-Dispatch-Kapazit&#xe4;tssteuerung will das (bisher) nicht machen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...im Lastbetrieb m&#246;chte man das eigentlich auch nicht: ein ankommender Thread soll gem&#228;&#223; aktueller Situation klassifiziert werden, aber nicht erst mal um das Grooming-Token konkurrieren
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1699315054445" ID="ID_1061745270" MODIFIED="1699315073575" TEXT="diese Situation d&#xfc;rfte im Regelbetrieb nicht auftreten">
<node CREATED="1699315075175" ID="ID_1648796415" MODIFIED="1699315087836" TEXT="denn dort wird aus einem Managment-Job heraus weiter geplant"/>
<node CREATED="1699315088657" ID="ID_696658677" MODIFIED="1699315122019" TEXT="...und ein solcher Managment-Job h&#xe4;lt per Design stets das Grooming-Token"/>
<node CREATED="1699315122844" ID="ID_703845766" MODIFIED="1699315158131" TEXT="deshalb geht postDispatch sofort &#xfc;ber die Abk&#xfc;rzung &#x27f6; Priority-Queue"/>
<node CREATED="1699315163677" ID="ID_1445276544" MODIFIED="1699315495053" TEXT="sp&#xe4;testens der n&#xe4;chste &#xbb;Tick&#xab; w&#xfc;rde ebenfalls feedPrioritisation() aufrufen">
<arrowlink COLOR="#2b2ab6" DESTINATION="ID_1962711320" ENDARROW="Default" ENDINCLINATION="32;-22;" ID="Arrow_ID_747379729" STARTARROW="None" STARTINCLINATION="-224;9;"/>
</node>
<node CREATED="1699315202665" ID="ID_1173720570" MODIFIED="1699315242168" TEXT="au&#xdf;erdem w&#xfc;rde jeder aktive Dispatch das ausl&#xf6;sen"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1699314501904" ID="ID_39607284" MODIFIED="1699315340563" TEXT="das ist eine L&#xfc;cke im Konzept auf Ebene der Komponenten-Integration">
<icon BUILTIN="yes"/>
<node CREATED="1699315440090" ID="ID_1962711320" MODIFIED="1699315495053" TEXT="gem&#xe4;&#xdf; geplantem Nutzen nicht wirklich relevant">
<linktarget COLOR="#2b2ab6" DESTINATION="ID_1962711320" ENDARROW="Default" ENDINCLINATION="32;-22;" ID="Arrow_ID_747379729" SOURCE="ID_1445276544" STARTARROW="None" STARTINCLINATION="-224;9;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1699315536045" ID="ID_933385129" MODIFIED="1699325459158" TEXT="stellt aber eine latente Gefahr dar">
<arrowlink COLOR="#751420" DESTINATION="ID_179251569" ENDARROW="Default" ENDINCLINATION="-787;-76;" ID="Arrow_ID_272593119" STARTARROW="None" STARTINCLINATION="1260;101;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1699325057420" ID="ID_1792556883" MODIFIED="1699325504658" TEXT="Hochskalieren fehlt ebenfalls">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
....und das w&#252;rde in dem Fall das Problem durch den ersten &#187;Tick&#171; nebenbei beheben &#8212; aber nicht, falls der Scheduler bereits l&#228;uft und leer gefallen ist
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#662136" DESTINATION="ID_1435123962" ENDARROW="Default" ENDINCLINATION="304;54;" ID="Arrow_ID_928822414" STARTARROW="None" STARTINCLINATION="-206;16;"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697763699242" ID="ID_272943268" MODIFIED="1697763810547" TEXT="EngineObserver-Schnittstelle">
<arrowlink COLOR="#4f3156" DESTINATION="ID_1642973256" ENDARROW="Default" ENDINCLINATION="-628;-472;" ID="Arrow_ID_1213898118" STARTARROW="None" STARTINCLINATION="-1771;162;"/>
@ -84099,7 +84211,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#4d7fc3" DESTINATION="ID_768314841" ENDARROW="Default" ENDINCLINATION="362;-65;" ID="Arrow_ID_464500099" STARTARROW="None" STARTINCLINATION="213;11;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698543132047" ID="ID_1879818036" MODIFIED="1698543148250" TEXT="kann auch gleich noch feedPrioritisation() machen">
<node COLOR="#338800" CREATED="1698543132047" ID="ID_1879818036" MODIFIED="1699315955982" TEXT="kann auch gleich noch feedPrioritisation() machen">
<linktarget COLOR="#6da89c" DESTINATION="ID_1879818036" ENDARROW="Default" ENDINCLINATION="-328;17;" ID="Arrow_ID_1139875480" SOURCE="ID_428559788" STARTARROW="None" STARTINCLINATION="268;14;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
@ -84154,13 +84267,35 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1698530661134" ID="ID_345977666" MODIFIED="1698530674141" TEXT="mu&#xdf; Entgleisen der Steuermechanismen erkennen"/>
<node CREATED="1698530762981" ID="ID_1141545060" MODIFIED="1698530779783" TEXT="und dann die Verarbeitung sauber auslaufen lassen"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1698977581315" HGAP="36" ID="ID_1091029245" MODIFIED="1698977618208" TEXT="Grooming-Token korrekt handhaben" VSHIFT="8">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1698977581315" HGAP="36" ID="ID_1091029245" MODIFIED="1699315730013" TEXT="Grooming-Token korrekt handhaben" VSHIFT="8">
<linktarget COLOR="#c93834" DESTINATION="ID_1091029245" ENDARROW="Default" ENDINCLINATION="-545;39;" ID="Arrow_ID_1140675242" SOURCE="ID_179251569" STARTARROW="None" STARTINCLINATION="224;-19;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699325295132" ID="ID_745204926" MODIFIED="1699325566562" TEXT="WorkForce hochfahren">
<linktarget COLOR="#533354" DESTINATION="ID_745204926" ENDARROW="Default" ENDINCLINATION="-41;67;" ID="Arrow_ID_204394164" SOURCE="ID_1772549848" STARTARROW="None" STARTINCLINATION="-125;-5;"/>
<linktarget COLOR="#57496c" DESTINATION="ID_745204926" ENDARROW="Default" ENDINCLINATION="249;-377;" ID="Arrow_ID_55492946" SOURCE="ID_1435123962" STARTARROW="None" STARTINCLINATION="668;346;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1699325589332" ID="ID_25430169" MODIFIED="1699325606390" TEXT="WorkForce regelt sich selber herunter bei Leerlauf"/>
<node CREATED="1699325607274" ID="ID_718145429" MODIFIED="1699325631062">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
daher mu&#223; f&#252;r einen neuen Job ein <i>step up</i>&#160;erfolgen
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1699325634014" ID="ID_1493688459" MODIFIED="1699325647951" TEXT="bei Bedarf: ignite()"/>
</node>
</node>
<node COLOR="#338800" CREATED="1697982436029" ID="ID_288711039" MODIFIED="1698808212796" TEXT="Test">
<arrowlink COLOR="#56a5a9" DESTINATION="ID_1292738036" ENDARROW="Default" ENDINCLINATION="286;-465;" ID="Arrow_ID_367470516" STARTARROW="None" STARTINCLINATION="-752;0;"/>
@ -84302,6 +84437,30 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699315636119" ID="ID_179251569" MODIFIED="1699325459159" TEXT="Feed und Grooming-Token">
<arrowlink COLOR="#c93834" DESTINATION="ID_1091029245" ENDARROW="Default" ENDINCLINATION="-545;39;" ID="Arrow_ID_1140675242" STARTARROW="None" STARTINCLINATION="224;-19;"/>
<linktarget COLOR="#751420" DESTINATION="ID_179251569" ENDARROW="Default" ENDINCLINATION="-787;-76;" ID="Arrow_ID_272593119" SOURCE="ID_933385129" STARTARROW="None" STARTINCLINATION="1260;101;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1699315801850" ID="ID_581012515" MODIFIED="1699315893539" TEXT="sicherstellen da&#xdf; ActivationEvents durch die Queues laufen">
<icon BUILTIN="yes"/>
<node CREATED="1699325705381" ID="ID_1180089206" MODIFIED="1699325717675" TEXT="dazu mu&#xdf; WorkForce bereitstehen"/>
<node CREATED="1699325718270" ID="ID_715250586" MODIFIED="1699325728452" TEXT="und die Eingangs-Queue mu&#xdf; bearbeitet werden"/>
<node CREATED="1699325765253" ID="ID_1589040875" MODIFIED="1699325801226" TEXT="das wiederum setzt Grooming-Token vorraus">
<linktarget COLOR="#526574" DESTINATION="ID_1589040875" ENDARROW="Default" ENDINCLINATION="-22;26;" ID="Arrow_ID_833310716" SOURCE="ID_111514031" STARTARROW="None" STARTINCLINATION="131;6;"/>
</node>
</node>
<node CREATED="1699315836183" ID="ID_428559788" MODIFIED="1699315976229" TEXT="sicherstellen da&#xdf; der aktuelle Zustand bewertet wird">
<arrowlink COLOR="#6da89c" DESTINATION="ID_1879818036" ENDARROW="Default" ENDINCLINATION="-328;17;" ID="Arrow_ID_1139875480" STARTARROW="None" STARTINCLINATION="268;14;"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699315847219" ID="ID_111514031" MODIFIED="1699325810017" TEXT="von API- und Livecycle-Funktionen: Grooming-Token beachten">
<arrowlink COLOR="#526574" DESTINATION="ID_1589040875" ENDARROW="Default" ENDINCLINATION="-22;26;" ID="Arrow_ID_833310716" STARTARROW="None" STARTINCLINATION="131;6;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1699325360487" ID="ID_1772549848" MODIFIED="1699325558259" TEXT="nach Einplanen von neuen Jobs: Kapazit&#xe4;t bereitstellen">
<arrowlink COLOR="#533354" DESTINATION="ID_745204926" ENDARROW="Default" ENDINCLINATION="-41;67;" ID="Arrow_ID_204394164" STARTARROW="None" STARTINCLINATION="-125;-5;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698532771174" ID="ID_840040649" MODIFIED="1698532780891" TEXT="Gesundheit / Notstand">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698533674384" ID="ID_1227874220" MODIFIED="1698534658603" TEXT="Scheduler-Emergency vorsehen">
@ -84920,7 +85079,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1689170064181" FOLDED="true" HGAP="5" ID="ID_987966047" MODIFIED="1697427690899" TEXT="WorkForce zur Ausf&#xfc;hrung" VSHIFT="7">
<node COLOR="#338800" CREATED="1689170064181" FOLDED="true" HGAP="5" ID="ID_987966047" MODIFIED="1699368391115" TEXT="WorkForce zur Ausf&#xfc;hrung" VSHIFT="7">
<linktarget COLOR="#397cb2" DESTINATION="ID_987966047" ENDARROW="Default" ENDINCLINATION="-962;-41;" ID="Arrow_ID_818972822" SOURCE="ID_1537960830" STARTARROW="None" STARTINCLINATION="-609;73;"/>
<linktarget COLOR="#3974b2" DESTINATION="ID_987966047" ENDARROW="Default" ENDINCLINATION="-1039;-52;" ID="Arrow_ID_7965989" SOURCE="ID_1957090536" STARTARROW="None" STARTINCLINATION="-1231;87;"/>
<icon BUILTIN="button_ok"/>
@ -87392,7 +87551,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="yes"/>
<node CREATED="1693792127590" ID="ID_399407420" MODIFIED="1693792149871" TEXT="St&#xe4;rke kann variiert werden">
<node CREATED="1693792157926" ID="ID_429801566" MODIFIED="1693792193345" TEXT="komplett heruntergeregelt &#x27f9; Render-Engine deaktiviert"/>
<node CREATED="1693792250942" ID="ID_1000686206" MODIFIED="1693792285653" TEXT="Obergrenze &#x2259; Hardware-concurrency * Provisionierungs-Faktor"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1693792250942" ID="ID_1000686206" MODIFIED="1699368575685" TEXT="Obergrenze &#x2259; Hardware-concurrency * Provisionierungs-Faktor">
<linktarget COLOR="#64334e" DESTINATION="ID_1000686206" ENDARROW="Default" ENDINCLINATION="-739;-25;" ID="Arrow_ID_1025143985" SOURCE="ID_1177531499" STARTARROW="None" STARTINCLINATION="-283;494;"/>
<node CREATED="1699368519890" ID="ID_541315073" MODIFIED="1699368526897" TEXT="ist (insgeheim) &#xe4;nderbar"/>
<node CREATED="1699368527449" ID="ID_881775978" MODIFIED="1699368543161" TEXT="wird initialisiert auf Hardware-Wert"/>
</node>
<node CREATED="1693792308542" ID="ID_1678880734" MODIFIED="1693792318777" TEXT="Herunterregeln erfolgt kooperativ"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693792585515" FOLDED="true" ID="ID_464175339" MODIFIED="1697806953842" TEXT="geplant: dynamische Kapazit&#xe4;tsregelung">
<arrowlink COLOR="#75769b" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-667;72;" ID="Arrow_ID_1800712901" STARTARROW="None" STARTINCLINATION="-540;37;"/>
@ -92249,11 +92412,43 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#f4336b" DESTINATION="ID_1142273023" ENDARROW="Default" ENDINCLINATION="-737;663;" ID="Arrow_ID_891496003" STARTARROW="None" STARTINCLINATION="1218;-76;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1699243361425" ID="ID_565283839" MODIFIED="1699310662190" TEXT="ruft die work-Function direkt auf (keine WorkForce!)">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1699243361425" ID="ID_565283839" MODIFIED="1699328504602" TEXT="ruft die work-Function direkt auf">
<icon BUILTIN="flag-pink"/>
<node CREATED="1699328505477" ID="ID_1796712383" MODIFIED="1699328750570" TEXT="keine WorkForce">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1699328515692" ID="ID_649427536" MODIFIED="1699328747184" TEXT="das ist problematisch">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Aus Sicht des Testaufbaues w&#228;re es sehr w&#252;nschenswert. Aber da das Scheduler-API high-Level ist, sehe ich keine einfache M&#246;glichkeit, f&#252;r einen Test dazwischen zu gehen. Ein Mocking / Austauschen des Scheduler w&#228;re hier nicht zielf&#252;hrend (weil es genau auf die Interaktion mit der integrierten Scheduler-Implementierung ankommt).
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1699328525667" ID="ID_956033802" MODIFIED="1699328535177" TEXT="WorkForce skaliert automatisch">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1699328910407" ID="ID_337063855" MODIFIED="1699328936432" TEXT="Ausweg: WorkForce-St&#xe4;rke manipulieren">
<icon BUILTIN="idea"/>
<node CREATED="1699328956633" ID="ID_1757255005" MODIFIED="1699368367892" TEXT="das w&#xe4;re dann ein WorkForce-Betriebsparameter">
<arrowlink COLOR="#786a97" DESTINATION="ID_1177531499" ENDARROW="Default" ENDINCLINATION="-920;53;" ID="Arrow_ID_1670167461" STARTARROW="None" STARTINCLINATION="61;-138;"/>
</node>
<node CREATED="1699328938838" ID="ID_320672850" MODIFIED="1699328955077" TEXT="jetzt brauche ich nur noch eine gute Ausrede f&#xfc;r die Existenz"/>
<node CREATED="1699329004755" ID="ID_1129379540" MODIFIED="1699329037293" TEXT="Ausrede: &#x201e;Headroom f&#xfc;r andere Prozesse lassen&#x201c;">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1699243391733" ID="ID_1214068544" MODIFIED="1699310666524" TEXT="verifiziert Aufruf per Log">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1699313612489" ID="ID_550874585" MODIFIED="1699328444728" TEXT="Fehler in der Schedule/Dispatch-Logik">
<arrowlink COLOR="#f91d6b" DESTINATION="ID_1032033223" ENDARROW="Default" ENDINCLINATION="-973;63;" ID="Arrow_ID_46385590" STARTARROW="None" STARTINCLINATION="630;-68;"/>
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
</node>