Scheduler-test: adapt tests to changed logic at entrance
- now there can not be any direct dispatch anymore when entering events - thus there is no decision logic at entrance anymore - rather the work-function implementation moved down into Layer-2 - so add a unit-test like coverage there (integration in SchedulerService_test)
This commit is contained in:
parent
09f0e92ea3
commit
af680cdfd9
4 changed files with 168 additions and 109 deletions
|
|
@ -100,6 +100,7 @@ namespace test {
|
|||
verify_findWork();
|
||||
verify_Significance();
|
||||
verify_postChain();
|
||||
verify_dispatch();
|
||||
integratedWorkCycle();
|
||||
}
|
||||
|
||||
|
|
@ -123,7 +124,10 @@ namespace test {
|
|||
// prepare scenario: some activity is enqueued
|
||||
queue.instruct ({activity, when, dead});
|
||||
|
||||
//// sched.postChain (sched.findWork(queue,now), detector.executionCtx,queue);///////////////TODO
|
||||
// retrieve one event from queue and dispatch it
|
||||
ActivationEvent act = sched.findWork(queue,now);
|
||||
ActivityLang::dispatchChain (act, detector.executionCtx);
|
||||
|
||||
CHECK (detector.verifyInvocation("CTX-tick").arg(now));
|
||||
CHECK (queue.empty());
|
||||
|
||||
|
|
@ -484,18 +488,15 @@ namespace test {
|
|||
// no one holds the GroomingToken
|
||||
___ensureGroomingTokenReleased(sched);
|
||||
auto myself = std::this_thread::get_id();
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
CHECK (sched.acquireGoomingToken());
|
||||
|
||||
// no effect when empty / no Activity given (usually this can happen due to lock contention)
|
||||
CHECK (activity::KICK == sched.postChain (ActivationEvent(), queue));
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
|
||||
// Activity immediately dispatched when on time and GroomingToken can be acquired ///////////////////////////TODO
|
||||
// Activity with start time way into the past is enqueued, but then discarded
|
||||
CHECK (activity::PASS == sched.postChain (makeEvent(past), queue));
|
||||
CHECK (detector.verifyInvocation("testActivity").timeArg(now)); // was invoked immediately
|
||||
CHECK ( sched.holdsGroomingToken (myself));
|
||||
CHECK ( queue.empty());
|
||||
detector.incrementSeq(); // Seq-point-1 in the detector log
|
||||
CHECK (detector.ensureNoInvocation("testActivity")); // not invoked
|
||||
CHECK (queue.peekHead()); // still in the queue...
|
||||
CHECK (not sched.findWork (queue,now)); // but it is not retrieved due to deadline
|
||||
CHECK (not queue.peekHead()); // and thus was dropped
|
||||
CHECK (queue.empty());
|
||||
|
||||
// future Activity is enqueued by short-circuit directly into the PriorityQueue if possible
|
||||
CHECK (activity::PASS == sched.postChain (makeEvent(future), queue));
|
||||
|
|
@ -520,12 +521,11 @@ namespace test {
|
|||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
CHECK (not queue.peekHead()); // was enqueued, not executed
|
||||
|
||||
// Note: this test achieved one single direct invocation;
|
||||
// all further cases after Seq-point-1 were queued only
|
||||
CHECK (detector.ensureNoInvocation("testActivity")
|
||||
.afterSeqIncrement(1));
|
||||
// Note: this test did not cause any direct invocation;
|
||||
// all provided events were queued only
|
||||
CHECK (detector.ensureNoInvocation("testActivity"));
|
||||
|
||||
// As sanity-check: after the point where we purged the queue,
|
||||
// As sanity-check: the first event was enqueued and the picked up;
|
||||
// two further cases where enqueued; we could retrieve them if
|
||||
// re-acquiring the GroomingToken and using suitable query-time
|
||||
unblockGroomingToken();
|
||||
|
|
@ -542,6 +542,71 @@ namespace test {
|
|||
|
||||
|
||||
|
||||
/** @test verify basic functionality to dequeue and dispatch entries.
|
||||
* @remark this is actually the core of the [»work-function«](\ref Scheduler::doWork),
|
||||
* and can not easily be demonstrated on a unit-test level, due to the interplay
|
||||
* with timing and load distribution. So this test is limited to show _that_ an entry
|
||||
* passes through the queues and is dispatched
|
||||
* @see SchedulerService_test::invokeWorkFunction() for a more comprehensive integration test
|
||||
*/
|
||||
void
|
||||
verify_dispatch()
|
||||
{
|
||||
// rigged execution environment to detect activations--------------
|
||||
ActivityDetector detector;
|
||||
Activity& activity = detector.buildActivationProbe ("testActivity");
|
||||
// set a dummy deadline to pass the sanity check
|
||||
SchedulerInvocation queue;
|
||||
SchedulerCommutator sched;
|
||||
LoadController lCtrl;
|
||||
|
||||
Time start{0,1};
|
||||
Time dead{0,10};
|
||||
// prepare the queue with one activity
|
||||
CHECK (Time::NEVER == queue.headTime());
|
||||
queue.instruct ({activity, start, dead});
|
||||
queue.feedPrioritisation();
|
||||
CHECK (start == queue.headTime());
|
||||
|
||||
// for the first testcase,
|
||||
// set Grooming-Token to be blocked
|
||||
blockGroomingToken(sched);
|
||||
auto myself = std::this_thread::get_id();
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
|
||||
// invoking the dequeue and dispatch requires some wiring
|
||||
// with functionality provided by other parts of the scheduler
|
||||
auto getSchedTime = detector.executionCtx.getSchedTime;
|
||||
auto executeActivity = [&](ActivationEvent event)
|
||||
{
|
||||
return ActivityLang::dispatchChain (event, detector.executionCtx);
|
||||
};
|
||||
|
||||
// Invoke the pull-work functionality directly from this thread
|
||||
// (in real usage, this function is invoked from a worker)
|
||||
CHECK (activity::KICK == sched.dispatchCapacity (queue
|
||||
,lCtrl
|
||||
,executeActivity
|
||||
,getSchedTime));
|
||||
CHECK (not queue.empty());
|
||||
// the first invocation was kicked back,
|
||||
// since the Grooming-token could not be acquired.
|
||||
unblockGroomingToken();
|
||||
|
||||
// ...now this thread can acquire, fetch from queue and dispatch....
|
||||
CHECK (activity::PASS == sched.dispatchCapacity (queue
|
||||
,lCtrl
|
||||
,executeActivity
|
||||
,getSchedTime));
|
||||
|
||||
CHECK (queue.empty());
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
CHECK (detector.verifyInvocation("testActivity"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/** @test step-wise perform the typical sequence of planning and worker activation
|
||||
* - use the Render-Job scenario from SchedulerActivity_test::scenario_RenderJob()
|
||||
* - use similar instrumentation to trace Activities
|
||||
|
|
@ -585,7 +650,7 @@ namespace test {
|
|||
TimeVar now{Time::ZERO};
|
||||
|
||||
// rig the ExecutionCtx to allow manipulating "current scheduler time"
|
||||
detector.executionCtx.getSchedTime = [&]{ return Time{now}; };///////////////////////////TODO RLY?
|
||||
detector.executionCtx.getSchedTime = [&]{ return Time{now}; };
|
||||
// rig the λ-work to verify GroomingToken and to drop it then
|
||||
detector.executionCtx.work.implementedAs(
|
||||
[&](Time, size_t)
|
||||
|
|
@ -611,7 +676,8 @@ namespace test {
|
|||
CHECK (sched.holdsGroomingToken (myself)); // acquired the GroomingToken
|
||||
CHECK (isSameObject(*act, anchor)); // "found" the rigged Activity as next piece of work
|
||||
|
||||
sched.postChain (act, queue); ////////////////////////TODO must dispatch here
|
||||
// dispatch the Activity-chain just retrieved from the queue
|
||||
ActivityLang::dispatchChain (act, detector.executionCtx);
|
||||
|
||||
CHECK (queue.empty());
|
||||
CHECK (not sched.holdsGroomingToken (myself)); // the λ-work was invoked and dropped the GroomingToken
|
||||
|
|
|
|||
|
|
@ -366,17 +366,9 @@ namespace test {
|
|||
};
|
||||
|
||||
|
||||
cout << "Scheduled right away..."<<endl;
|
||||
start = RealClock::now();
|
||||
post(start); // Post the testProbe to be scheduled "now"
|
||||
CHECK (wasInvoked(start)); // Result: invoked directly, not enqueued at all
|
||||
CHECK (scheduler.empty());
|
||||
|
||||
|
||||
cout << "pullWork() on empty queue..."<<endl;
|
||||
pullWork(); // Call the work-Function on empty Scheduler queue
|
||||
CHECK (activity::WAIT == res); // the result instructs this thread to go to sleep immediately
|
||||
CHECK (delay_us < 40);
|
||||
|
||||
|
||||
cout << "Due at pullWork()..."<<endl;
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ namespace test {
|
|||
double performanceTime =
|
||||
testLoad.setupSchedule(scheduler)
|
||||
.withLoadTimeBase(LOAD_BASE)
|
||||
.withJobDeadline(100ms)
|
||||
.withJobDeadline(150ms)
|
||||
.withPlanningStep(200us)
|
||||
.withChunkSize(20)
|
||||
.launch_and_wait();
|
||||
|
|
|
|||
|
|
@ -86041,9 +86041,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1703428373707" ID="ID_217499360" MODIFIED="1703429011426" TEXT="das wird problematisch, sobald der Planungs-Job selbst direkt in die Job-Ausführung einsteigt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
dies folgt aus der Eigenschaft, daß wir (bisher) eine Abkürzung an der Queue vorbei nehmen, wenn ein Job bereits hinter seiner Startzeit liegt — denn im Zuge der normalen Job-Verarbeitung wird der »Managment-Modus« regulär verlassen, in einem expliziten Prozeß-Schritt. Zusammen bewirkt das eine Unsicherheit, ob auf Ebene des Planungs-Jobs das Grooming-Token gehalten wird, und ob es dort gehalten werden muß. Diese Unsicherheit steht im Widerspruch zum Konzept, welches diesen Belang an die Zugehörigkeit zu Zonen gebunden hat, um auf eine aufwendige, feingranulare Steuerung verzichten zu können. Und die Beobachtungen in den ersten Lasttests scheinen diese Entscheidung zu bestätigen: anscheinend kann das Prüfen und Wechseln des Grooming-Tokens zu Verzögerungen im Bereich 100µs führen (wohl durch stall und Cache-Effekte), sobald das System concurrent läuft.
|
||||
|
|
@ -86072,16 +86070,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1703436862637" ID="ID_274927823" MODIFIED="1703436886387">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>möchte gefühlsmäßig </i>trotzdem daran festhalten
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<node CREATED="1703436891770" ID="ID_1993487936" MODIFIED="1703436902723" TEXT="es entspricht dem Service-Gedanken"/>
|
||||
<node CREATED="1703436930587" ID="ID_1432609846" MODIFIED="1703436976385" TEXT="dadurch konvergiert der gesamte Scheduler an einer Stelle"/>
|
||||
<node CREATED="1703528248780" ID="ID_1560883060" MODIFIED="1703528262827" TEXT="Vereinheitlichung bedingt aber auch Kosten">
|
||||
|
|
@ -86180,23 +86175,41 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1703528385628" ID="ID_1549305315" MODIFIED="1703528397587" TEXT="⟹ dann in die andere Richtung aufräumen">
|
||||
<node COLOR="#338800" CREATED="1703528385628" ID="ID_1549305315" MODIFIED="1703599735061" TEXT="⟹ dann in die andere Richtung aufräumen">
|
||||
<node CREATED="1703528413573" ID="ID_1425159481" MODIFIED="1703528439759" TEXT="durch die Krezung mehrerer Belange an einem Eingang mußte zusätzlich geprüft werden"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1703528461439" ID="ID_880886217" MODIFIED="1703528487003" TEXT="was wären die Konsequenzen wenn nun stets alles in die Queue geht?">
|
||||
<node COLOR="#435e98" CREATED="1703528461439" ID="ID_880886217" MODIFIED="1703556457456" TEXT="was wären die Konsequenzen wenn nun stets alles in die Queue geht?">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1703530119496" ID="ID_1809710106" MODIFIED="1703530128942" TEXT="wenige Test-Anpassungen nötig">
|
||||
<node CREATED="1703530136503" ID="ID_1275369187" MODIFIED="1703530136503" TEXT="SchedulerCommutator_test">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703530171760" ID="ID_1127369062" MODIFIED="1703530185673" TEXT="verify_DispatchDecision : anzupassen an die neue Logik">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#5b280f" CREATED="1703530171760" ID="ID_1127369062" MODIFIED="1703595328182" TEXT="verify_DispatchDecision : anzupassen an die neue Logik">
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1127369062" ENDARROW="Default" ENDINCLINATION="367;18;" ID="Arrow_ID_1342385043" SOURCE="ID_120006368" STARTARROW="None" STARTINCLINATION="1235;-106;"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1703595329343" ID="ID_1803420957" MODIFIED="1703595341239" TEXT="da bleibt ja nix mehr übrig von der Logik..."/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1703595343539" HGAP="93" ID="ID_1140120522" MODIFIED="1703595355512" TEXT="also weg damit!" VSHIFT="-13">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1703530145711" ID="ID_265980648" MODIFIED="1703595375024" TEXT="verify_postDispatch : erster Fall fällt weg">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1703595389501" HGAP="28" ID="ID_1340174960" MODIFIED="1703595422320" VSHIFT="10">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
stattdessen zeigen,
|
||||
</p>
|
||||
<p>
|
||||
daß die Deadline wirkt
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703530145711" ID="ID_265980648" MODIFIED="1703530185672" TEXT="verify_postDispatch : erster Fall fällt weg">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1703530188991" ID="ID_531449758" MODIFIED="1703530193164" TEXT="SchedulerService_test">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703530207708" ID="ID_124637537" MODIFIED="1703530213758" TEXT="invokeWorkFunction : erster Fall fällt weg">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1703530207708" ID="ID_124637537" MODIFIED="1703599747946" TEXT="invokeWorkFunction : erster Fall fällt weg">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -86258,7 +86271,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1703531554976" ID="ID_252423110" MODIFIED="1703531567199" TEXT="geht dann wieder in den Haupt-Eingang"/>
|
||||
<node CREATED="1703531568694" ID="ID_228894033" MODIFIED="1703531579098" TEXT="macht aber die zusätzliche Kontext-Verknüpfung"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1703531710183" ID="ID_1180732993" MODIFIED="1703531769802" TEXT="Fazit">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1703531710183" ID="ID_1180732993" MODIFIED="1703556451481" TEXT="Fazit">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1703531713115" ID="ID_1157706172" MODIFIED="1703531723093" TEXT="wir bekommen gar nicht zwei Eingänge"/>
|
||||
|
|
@ -86270,8 +86283,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1703531840922" ID="ID_1908033761" MODIFIED="1703548787102" TEXT="Implementierung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1703531840922" ID="ID_1908033761" MODIFIED="1703599723903" TEXT="Implementierung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1703531959282" ID="ID_1260641992" MODIFIED="1703532770661" TEXT="neue Namen festlegen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1703532057721" ID="ID_1885753077" MODIFIED="1703532699780">
|
||||
|
|
@ -86391,20 +86404,31 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703532249537" ID="ID_720917805" MODIFIED="1703532260634" TEXT="Tests anpassen und durchprüfen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703532263283" ID="ID_1975881594" MODIFIED="1703532275811" TEXT="SchedulerCommutator_test">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703533095108" ID="ID_120006368" MODIFIED="1703533102488" TEXT="bestehende Tests vereinfachen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1703532249537" ID="ID_720917805" MODIFIED="1703599666189" TEXT="Tests anpassen und durchprüfen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1703532263283" ID="ID_1975881594" MODIFIED="1703598876124" TEXT="SchedulerCommutator_test">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1703533095108" ID="ID_120006368" MODIFIED="1703595434121" TEXT="bestehende Tests vereinfachen">
|
||||
<arrowlink COLOR="#a9b4c1" DESTINATION="ID_1127369062" ENDARROW="Default" ENDINCLINATION="367;18;" ID="Arrow_ID_1342385043" STARTARROW="None" STARTINCLINATION="1235;-106;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1703557356840" ID="ID_769666700" MODIFIED="1703595454613" TEXT="muß Dispatch direkt mit ActivityLang machen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703532305027" ID="ID_878706399" MODIFIED="1703533103056" TEXT="zusätzliche Abdeckung?">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1703532305027" ID="ID_878706399" MODIFIED="1703598799930" TEXT="zusätzliche Abdeckung?">
|
||||
<node CREATED="1703532379897" ID="ID_1721310006" MODIFIED="1703532384945" TEXT="wäre theoretisch notwendig"/>
|
||||
<node CREATED="1703532385536" ID="ID_656090347" MODIFIED="1703532396330" TEXT="würde aber den Stil / Level des Tests ändern"/>
|
||||
<node CREATED="1703532967018" ID="ID_556373234" MODIFIED="1703532979972" TEXT="also: nur einfacher Test mit präparierter Queue">
|
||||
<node CREATED="1703532981040" ID="ID_1954422049" MODIFIED="1703532993635" TEXT="zeigt daß die Work-Funktion die Queue pullt"/>
|
||||
<node CREATED="1703532994565" ID="ID_390941069" MODIFIED="1703533007536" TEXT="zeigt daß scatteredDelay eine Verzögerung macht"/>
|
||||
<node COLOR="#338800" CREATED="1703532967018" ID="ID_556373234" MODIFIED="1703598805622" TEXT="also: nur einfacher Test mit präparierter Queue">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1703532981040" ID="ID_1954422049" MODIFIED="1703598822977" TEXT="zeigt daß die Work-Funktion die Queue pullt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1703598854220" ID="ID_278063487" MODIFIED="1703598871170" TEXT="zeigt daß kein Dispatch möglich ist wenn Grooming-Token geblockt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1703532994565" ID="ID_390941069" MODIFIED="1703598830418" TEXT="zeigt daß scatteredDelay eine Verzögerung macht">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1703533039064" ID="ID_867207750" MODIFIED="1703533064748" TEXT="scatteredDelay selber ist nicht sinnvoll Unit-testbar">
|
||||
<icon BUILTIN="yes"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
|
|
@ -86414,12 +86438,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703533105455" ID="ID_1123639737" MODIFIED="1703533110831" TEXT="SchedulerService_test">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703533114670" ID="ID_452698979" MODIFIED="1703533157061" TEXT="einen Testfall entfernen">
|
||||
<node COLOR="#338800" CREATED="1703533105455" ID="ID_1123639737" MODIFIED="1703599667266" TEXT="SchedulerService_test">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1703533114670" ID="ID_452698979" MODIFIED="1703599672093" TEXT="einen Testfall entfernen">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703533129208" ID="ID_770027386" MODIFIED="1703533157061" TEXT="sollte ansonsten ohne Anpassungen weiterhin laufen">
|
||||
<node BACKGROUND_COLOR="#ced292" COLOR="#435e98" CREATED="1703533129208" ID="ID_770027386" MODIFIED="1703599712863" TEXT="läuft ansonsten ohne Anpassungen weiterhin">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1703533139995" ID="ID_1808284456" MODIFIED="1703533148159" TEXT="das ist ein Konsistenz-Check der Umbauten">
|
||||
|
|
@ -86433,35 +86457,27 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1703437521285" ID="ID_775703939" MODIFIED="1703440908947" TEXT="eine sehr seltene und spezielle Situation — und sehr tückisch">
|
||||
<node CREATED="1703437588221" ID="ID_607223766" MODIFIED="1703438380011" TEXT="folgt aus der Struktur mit einem Deadline-gebundenen AllocatorHandle">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
deshalb treffen hier ein Zustand im Epochen-Pool zusammen mit einem kontextuellen Zustand aus dem Handle, welches aus Performance-Gründen eben die internen Koordinaten aus dem Epochen-Pool verdeckt einbettet
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1703437615065" ID="ID_1049714784" MODIFIED="1703438380014" TEXT="zusammen mit der relativen Autonomie durch Layering">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...der untere Layer kann und darf nichts wissen davon, daß sein Zustand auf einem höheren Layer in eine Abstraktion materialisiert wird. Deshalb wird er im Zuge einer Überlauf-Behandlung seine internen Strukturen reorganisieren und damit das Handle auf dem höheren Layer indirekt invalidieren
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1703437902075" ID="ID_1886319162" MODIFIED="1703438368065" TEXT="aktiviert durch fortgesetzten Gebrauch des Handles">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...also nicht nur in dem Fall, an dem ich das Problem entdeckt habe; generell kann das Handle durch jede Allokation invalidiert werden, denn jede Allokation kann eine Kettenreaktion mit Überlauf nach sich ziehen, und dadurch viele Handles entwerten — der Effekt <b>ist nicht lokal</b>
|
||||
|
|
@ -86477,16 +86493,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1703438753256" ID="ID_16828994" MODIFIED="1703438776315" TEXT="welches in diesem Fall dann druch den Überlauf selber aktualisiert wird"/>
|
||||
<node CREATED="1703439349257" ID="ID_1007174293" MODIFIED="1703439545433" TEXT="so die Theorie — die leider nicht einfach zu überprüfen ist">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
es handelt sich nämlich hier um einen hoch problematischen Durchgriff durch die Layer-Struktur des Allokators — und zu allem Überfluß auch noch mitten aus einer anderen Operation heraus als Seiteneffekt, welcher explizit nicht Teil des Iterator-Konzepts ist und daran vorbei auf das Basis-API zugreift. Mit einem Wort, <b>schrecklich</b>.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1703439871027" ID="ID_460066445" MODIFIED="1703440203946" TEXT="�� Horror">
|
||||
<font NAME="SansSerif" SIZE="15"/>
|
||||
|
|
@ -86507,9 +86520,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1703441847875" ID="ID_1538357910" MODIFIED="1703442040508" TEXT="danach zeigt idx möglicherweise auf einen anderen Extent">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
und zwar wenn isWrapped() und idx im oberen Bereich hinter start_
|
||||
|
|
@ -86518,21 +86529,17 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Falls die Neu-Allokation nicht so groß ist, <b>verschiebt</b> sich dadurch idx „nur“ in eine Epoche mit <b>früherer Deadline</b>. Ab dem Punkt gehen alle weitere Allokationen in diese frühere Epoche, ohne daß der Aufrufkontext davon etwas mitbekommt.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1703441876431" ID="ID_1440888523" MODIFIED="1703442206814" TEXT="oder gar in einen derzeit ungenutzten Extent">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und dann wird die Lage noch schröcklicher: entweder der Extent ist noch uninitialisierte Storage und der Positionszeiger schickt uns dann <i>irgendwohin</i>  und in die allgemeine Speicherkorruption, oder es handelt sich um einen alten, re-cycleten Extent, dessen Werte noch plausibel sind und zu einer funktionierenden Allokation führen, die dann irgendwann später ohne Vorankündigung mit einer neuen Nutzung überschrieben wird.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -86540,9 +86547,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1703441726687" ID="ID_286694748" MODIFIED="1703441791122">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
selbst-Gefährdung <i>könnte </i>man reparieren
|
||||
|
|
@ -86551,24 +86556,20 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
 — fremd-Gefährdung nicht
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1703442228013" ID="ID_67901251" MODIFIED="1703442254920" TEXT="der Fall ist relativ unwahrscheinlich"/>
|
||||
<node CREATED="1703442257588" ID="ID_605953415" MODIFIED="1703442273129" TEXT="er dürfte typischerweise in Extremsituationen auftreten (Lastspitze)"/>
|
||||
<node CREATED="1703442284952" ID="ID_1836401222" MODIFIED="1703442349899" TEXT="und selbst dann besteht noch eine erhebliche Wahrscheinlichkeit, nichts zu bemerken"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1703442351575" ID="ID_1354252873" MODIFIED="1703442418045">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>wenn aber </i>etwas passiert, sind die Folgen <b>destruktiv</b> und <b>nicht zu diagnostizieren</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -86582,36 +86583,36 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1703443375198" ID="ID_1083582649" MODIFIED="1703443451296" TEXT="man könnte auf das Weiterverwenden fremder Handles verzichten"/>
|
||||
<node CREATED="1703443452052" ID="ID_1726805134" MODIFIED="1703443502139" TEXT="das hat aber sicher einen merklichen Einfluß auf die Performance">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
das Weiterverwenden der Handles ist der größte Hebel, mit dem der Allocator überhaupt in eine akzeptable Perfromance-Zone kommt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1703443528218" ID="ID_1938921873" MODIFIED="1703443534129" TEXT="ein Sicherheits-Check...">
|
||||
<node CREATED="1703443535257" ID="ID_1911255194" MODIFIED="1703443555190" TEXT="würde zusätzliche Storage im Handle erfordern (verschmerzbar)"/>
|
||||
<node CREATED="1703443555942" ID="ID_1584728969" MODIFIED="1703443588335">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
aber einen <b>Check</b> für <b>jeden Zugriff</b> erfordern (teuer)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1703443633196" ID="ID_530908402" MODIFIED="1703452989916" TEXT="und alle diese Maßnahmen untergraben die Abstraktion">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1703556475582" ID="ID_957677073" MODIFIED="1703556503251" TEXT="die rettende Idee: die Extends selber bleiben an stabiler Addresse im Speicher">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703556506473" ID="ID_1106474590" MODIFIED="1703556535688" TEXT="also kann man im high-level-Iterator diese Adresse cachen (spart sogar noch Ausführungszeit)">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue