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:
Fischlurch 2023-12-26 15:00:35 +01:00
parent 09f0e92ea3
commit af680cdfd9
4 changed files with 168 additions and 109 deletions

View file

@ -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

View file

@ -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;

View file

@ -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();

View file

@ -86041,9 +86041,7 @@ Date:&#160;&#160;&#160;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&#xfc;hrung einsteigt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
dies folgt aus der Eigenschaft, da&#223; wir (bisher) eine Abk&#252;rzung an der Queue vorbei nehmen, wenn ein Job bereits hinter seiner Startzeit liegt &#8212; denn im Zuge der normalen Job-Verarbeitung wird der &#187;Managment-Modus&#171; regul&#228;r verlassen, in einem expliziten Proze&#223;-Schritt. Zusammen bewirkt das eine Unsicherheit, ob auf Ebene des Planungs-Jobs das Grooming-Token gehalten wird, und ob es dort gehalten werden mu&#223;. Diese Unsicherheit steht im Widerspruch zum Konzept, welches diesen Belang an die Zugeh&#246;rigkeit zu Zonen gebunden hat, um auf eine aufwendige, feingranulare Steuerung verzichten zu k&#246;nnen. Und die Beobachtungen in den ersten Lasttests scheinen diese Entscheidung zu best&#228;tigen: anscheinend kann das Pr&#252;fen und Wechseln des Grooming-Tokens zu Verz&#246;gerungen im Bereich 100&#181;s f&#252;hren (wohl durch stall und Cache-Effekte), sobald das System concurrent l&#228;uft.
@ -86072,16 +86070,13 @@ Date:&#160;&#160;&#160;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&#246;chte gef&#252;hlsm&#228;&#223;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:&#160;&#160;&#160;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="&#x27f9; dann in die andere Richtung aufr&#xe4;umen">
<node COLOR="#338800" CREATED="1703528385628" ID="ID_1549305315" MODIFIED="1703599735061" TEXT="&#x27f9; dann in die andere Richtung aufr&#xe4;umen">
<node CREATED="1703528413573" ID="ID_1425159481" MODIFIED="1703528439759" TEXT="durch die Krezung mehrerer Belange an einem Eingang mu&#xdf;te zus&#xe4;tzlich gepr&#xfc;ft werden"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1703528461439" ID="ID_880886217" MODIFIED="1703528487003" TEXT="was w&#xe4;ren die Konsequenzen wenn nun stets alles in die Queue geht?">
<node COLOR="#435e98" CREATED="1703528461439" ID="ID_880886217" MODIFIED="1703556457456" TEXT="was w&#xe4;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&#xf6;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 &#xfc;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&#xe4;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&#223; 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&#xe4;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&#xe4;llt weg">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1703530207708" ID="ID_124637537" MODIFIED="1703599747946" TEXT="invokeWorkFunction : erster Fall f&#xe4;llt weg">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -86258,7 +86271,7 @@ Date:&#160;&#160;&#160;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&#xe4;tzliche Kontext-Verkn&#xfc;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&#xe4;nge"/>
@ -86270,8 +86283,8 @@ Date:&#160;&#160;&#160;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:&#160;&#160;&#160;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&#xfc;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&#xfc;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&#xdf; 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&#xe4;tzliche Abdeckung?">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#338800" CREATED="1703532305027" ID="ID_878706399" MODIFIED="1703598799930" TEXT="zus&#xe4;tzliche Abdeckung?">
<node CREATED="1703532379897" ID="ID_1721310006" MODIFIED="1703532384945" TEXT="w&#xe4;re theoretisch notwendig"/>
<node CREATED="1703532385536" ID="ID_656090347" MODIFIED="1703532396330" TEXT="w&#xfc;rde aber den Stil / Level des Tests &#xe4;ndern"/>
<node CREATED="1703532967018" ID="ID_556373234" MODIFIED="1703532979972" TEXT="also: nur einfacher Test mit pr&#xe4;parierter Queue">
<node CREATED="1703532981040" ID="ID_1954422049" MODIFIED="1703532993635" TEXT="zeigt da&#xdf; die Work-Funktion die Queue pullt"/>
<node CREATED="1703532994565" ID="ID_390941069" MODIFIED="1703533007536" TEXT="zeigt da&#xdf; scatteredDelay eine Verz&#xf6;gerung macht"/>
<node COLOR="#338800" CREATED="1703532967018" ID="ID_556373234" MODIFIED="1703598805622" TEXT="also: nur einfacher Test mit pr&#xe4;parierter Queue">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1703532981040" ID="ID_1954422049" MODIFIED="1703598822977" TEXT="zeigt da&#xdf; die Work-Funktion die Queue pullt">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1703598854220" ID="ID_278063487" MODIFIED="1703598871170" TEXT="zeigt da&#xdf; kein Dispatch m&#xf6;glich ist wenn Grooming-Token geblockt">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#5b280f" CREATED="1703532994565" ID="ID_390941069" MODIFIED="1703598830418" TEXT="zeigt da&#xdf; scatteredDelay eine Verz&#xf6;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:&#160;&#160;&#160;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&#xe4;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1703437521285" ID="ID_775703939" MODIFIED="1703440908947" TEXT="eine sehr seltene und spezielle Situation &#x2014; und sehr t&#xfc;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&#252;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&#223; sein Zustand auf einem h&#246;heren Layer in eine Abstraktion materialisiert wird. Deshalb wird er im Zuge einer &#220;berlauf-Behandlung seine internen Strukturen reorganisieren und damit das Handle auf dem h&#246;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 &#220;berlauf nach sich ziehen, und dadurch viele Handles entwerten &#8212; der Effekt <b>ist nicht lokal</b>
@ -86477,16 +86493,13 @@ Date:&#160;&#160;&#160;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 &#xdc;berlauf selber aktualisiert wird"/>
<node CREATED="1703439349257" ID="ID_1007174293" MODIFIED="1703439545433" TEXT="so die Theorie &#x2014; die leider nicht einfach zu &#xfc;berpr&#xfc;fen ist">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es handelt sich n&#228;mlich hier um einen hoch problematischen Durchgriff durch die Layer-Struktur des Allokators &#8212; und zu allem &#220;berflu&#223; 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="&#xd83d;&#xdc7b; Horror">
<font NAME="SansSerif" SIZE="15"/>
@ -86507,9 +86520,7 @@ Date:&#160;&#160;&#160;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&#xf6;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Falls die Neu-Allokation nicht so gro&#223; ist, <b>verschiebt</b>&#160;sich dadurch idx &#8222;nur&#8220; in eine Epoche mit <b>fr&#252;herer Deadline</b>. Ab dem Punkt gehen alle weitere Allokationen in diese fr&#252;here Epoche, ohne da&#223; 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&#246;cklicher: entweder der Extent ist noch uninitialisierte Storage und der Positionszeiger schickt uns dann <i>irgendwohin</i>&#160; 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&#252;hren, die dann irgendwann sp&#228;ter ohne Vorank&#252;ndigung mit einer neuen Nutzung &#252;berschrieben wird.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -86540,9 +86547,7 @@ Date:&#160;&#160;&#160;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&#228;hrdung <i>k&#246;nnte </i>man reparieren
@ -86551,24 +86556,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
&#160;&#8212; fremd-Gef&#228;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&#xfc;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>&#160;und <b>nicht zu diagnostizieren</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
@ -86582,36 +86583,36 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1703443375198" ID="ID_1083582649" MODIFIED="1703443451296" TEXT="man k&#xf6;nnte auf das Weiterverwenden fremder Handles verzichten"/>
<node CREATED="1703443452052" ID="ID_1726805134" MODIFIED="1703443502139" TEXT="das hat aber sicher einen merklichen Einflu&#xdf; auf die Performance">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das Weiterverwenden der Handles ist der gr&#246;&#223;te Hebel, mit dem der Allocator &#252;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&#xfc;rde zus&#xe4;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>&#160;f&#252;r <b>jeden Zugriff</b>&#160;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&#xdf;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&#xfc;hrungszeit)">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>