BufferProvider: test setup to verify heuristic clean-up
This test should confirm that such a clean-up happened, which is not yet implemented (I have a concept draft in mind)
This commit is contained in:
parent
3b9641597f
commit
37fc78b027
3 changed files with 139 additions and 20 deletions
|
|
@ -75,7 +75,6 @@ namespace test {
|
|||
verify_announce();
|
||||
verify_allocate();
|
||||
verify_release();
|
||||
verify_heuristic();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -370,20 +369,90 @@ namespace test {
|
|||
|
||||
|
||||
|
||||
/** @test
|
||||
/** @test heuristic clean-up after releasing several allocations
|
||||
* - at first, a de-allocated block remains available in the local pool
|
||||
* - after a number of usages, defined as _turnover_, clean-up is triggered
|
||||
* - this test scenario requests 3 buffers, but repeatedly uses only one
|
||||
* - after the third round with this usage pattern, the local pool is reduced
|
||||
*/
|
||||
void
|
||||
verify_release()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** @test
|
||||
*/
|
||||
void
|
||||
verify_heuristic()
|
||||
{
|
||||
// »central BufferPool« (transient instance for this test)
|
||||
lib::DependInject<EngineBufferManager>::Local<EngineBufferManager> globalPool;
|
||||
|
||||
// *test subject*
|
||||
LocalBufferStore localStore;
|
||||
BufferProviderSetup::Store& storeAPI = localStore;
|
||||
|
||||
const size_t BUFFSIZ = 1024;
|
||||
const HashVal TYPEID = 12345;
|
||||
|
||||
// coordination of test steps
|
||||
std::atomic_uint step{1};
|
||||
|
||||
Thread testWorker{[&] /* === Scenario: test subject requests allocation immediately === */
|
||||
{
|
||||
// Step-1 : first round
|
||||
uint avail = storeAPI.prepareBuffers(TYPEID, 3, BUFFSIZ);
|
||||
CHECK (0 == avail);
|
||||
CHECK (watch(localStore).isEmpty());
|
||||
|
||||
BuffAlloc slot1 = storeAPI.provideBuffer (TYPEID, BUFFSIZ, 0,0);
|
||||
auto& [storage,buffSiz,_] = slot1;
|
||||
CHECK (storage);
|
||||
|
||||
storeAPI.detachBuffer (TYPEID, slot1);
|
||||
// Result: got three allocations and all three are in the local pool
|
||||
CHECK (watch(localStore).size() == 3);
|
||||
CHECK (watch(localStore).cntFree() == 3);
|
||||
|
||||
++step;
|
||||
// Step-2 : repeat same pattern
|
||||
BuffAlloc slot2 = storeAPI.provideBuffer (TYPEID, BUFFSIZ, 0,0);
|
||||
CHECK (slot2 == slot1);
|
||||
CHECK (watch(localStore).size() == 3);
|
||||
CHECK (watch(localStore).cntFree() == 2);
|
||||
|
||||
storeAPI.detachBuffer (TYPEID, slot1);
|
||||
CHECK (watch(localStore).size() == 3);
|
||||
CHECK (watch(localStore).cntFree() == 3);
|
||||
|
||||
++step;
|
||||
// Step-3 : repeat for a third time
|
||||
BuffAlloc slot3 = storeAPI.provideBuffer (TYPEID, BUFFSIZ, 0,0);
|
||||
CHECK (slot3 == slot1);
|
||||
CHECK (watch(localStore).size() == 3);
|
||||
CHECK (watch(localStore).cntFree() == 2);
|
||||
|
||||
storeAPI.detachBuffer (TYPEID, slot1);
|
||||
// this completed a "turnover" of three buffers
|
||||
SHOW_EXPR(watch(localStore).size());
|
||||
|
||||
++step;
|
||||
// main thread will now see the partial clean-up
|
||||
|
||||
}}; // block automatically sent back after thread end
|
||||
|
||||
|
||||
/* === Main thread: observe effects in the global pool === */
|
||||
|
||||
// wait until Step-2
|
||||
while (step < 2)
|
||||
sleep_for(1ms);
|
||||
CHECK (watch(*globalPool).numAllocs() == 3);
|
||||
|
||||
// re-check after Step-2
|
||||
while (step <= 2)
|
||||
sleep_for(1ms);
|
||||
// nothing changed; local pool operates independently
|
||||
CHECK (watch(*globalPool).numAllocs() == 3);
|
||||
|
||||
// re-check after Step-3
|
||||
while (step <= 3)
|
||||
sleep_for(1ms);
|
||||
globalPool->processPendingRequests();
|
||||
SHOW_EXPR(watch(*globalPool).numAllocs())
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ namespace test {
|
|||
simpleUse();
|
||||
verify_matchAlloc();
|
||||
verify_selectAlloc();
|
||||
verify_turnoverTrigger();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -273,7 +274,7 @@ namespace test {
|
|||
// perform a rather aggressive clean-up
|
||||
cnt = pool.cleanup(0.7 ,returnAlloc); // max score is 15, so anything below 0.7*15 ≡ 10 will be expunged
|
||||
CHECK (cnt == 3);
|
||||
CHECK (join(returned) == "12, 33, 32"_expect); // MEM12, MEM33 and MEM32 returned, since their score as <= 10
|
||||
CHECK (join(returned) == "12, 33, 32"_expect); // MEM12, MEM33 and MEM32 returned, since their score was <= 10
|
||||
CHECK (watch(pool).cntFree() == 1);
|
||||
CHECK (watch(pool).size() == 2);
|
||||
|
||||
|
|
@ -297,6 +298,20 @@ namespace test {
|
|||
CHECK (join(returned) == "12, 33, 32, 31, 11"_expect);
|
||||
CHECK (pool.empty());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** @test heuristic trigger mechanism for pool clean-up
|
||||
* - create abbreviated notation to play through various scenarios
|
||||
* - watch how turnover and max-score are computed for each step
|
||||
* - document the trigger points for heuristic clean-up.
|
||||
*/
|
||||
void
|
||||
verify_turnoverTrigger()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -108803,7 +108803,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734633240020" ID="ID_1096327457" MODIFIED="1736039593131" TEXT="Dokumentation NodeBuilder">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734633240020" ID="ID_1096327457" MODIFIED="1779664645933" TEXT="Dokumentation NodeBuilder">
|
||||
<linktarget COLOR="#82878e" DESTINATION="ID_1096327457" ENDARROW="Default" ENDINCLINATION="-1293;117;" ID="Arrow_ID_1693662542" SOURCE="ID_164798551" STARTARROW="None" STARTINCLINATION="1447;0;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1736039852212" ID="ID_607701776" MODIFIED="1736039857079" TEXT="node-builder.hpp">
|
||||
|
|
@ -145434,7 +145434,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1778947001639" ID="ID_78533321" MODIFIED="1778947098163" TEXT="Idee: »turnover« — jedem Block eine Chance geben">
|
||||
<node CREATED="1778947001639" ID="ID_78533321" MODIFIED="1779665464192" TEXT="Idee: »turnover« — jedem Block eine Chance geben">
|
||||
<linktarget COLOR="#4f65bc" DESTINATION="ID_78533321" ENDARROW="Default" ENDINCLINATION="-548;697;" ID="Arrow_ID_1519732497" SOURCE="ID_1461846299" STARTARROW="Default" STARTINCLINATION="286;13;"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1778947114570" ID="ID_914679223" MODIFIED="1778947126240" TEXT="ankommende Blöcke erhöhen den Turnover"/>
|
||||
<node CREATED="1778947127539" ID="ID_253931638" MODIFIED="1778947136630" TEXT="jede de-Allokation veringert den Turnover"/>
|
||||
|
|
@ -145669,11 +145670,28 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
</node>
|
||||
<node CREATED="1778968918381" ID="ID_752345967" MODIFIED="1778968922655" TEXT="verify_release">
|
||||
<node CREATED="1778969042432" ID="ID_1262962638" MODIFIED="1778969052166" TEXT="hier sollte auch ein clean-up provoziert werden"/>
|
||||
<node CREATED="1779665675415" ID="ID_1685534215" MODIFIED="1779665691018" TEXT="zu zeigen ist daß dieser Clean-up mit Rücksendung stattfindet"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1778969102656" ID="ID_249806133" MODIFIED="1779664543753" TEXT="verify_heuristic">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
meine Idee der Heuristik umsetzen
|
||||
</p>
|
||||
<p>
|
||||
mit einzelnen Grenz-Szenarien durchspielen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1779664546343" HGAP="25" ID="ID_453821075" MODIFIED="1779665655342" TEXT="dieser Test gehört zum LocalMemPool" VSHIFT="18">
|
||||
<arrowlink COLOR="#765294" DESTINATION="ID_1242239297" ENDARROW="Default" ENDINCLINATION="-1163;-399;" ID="Arrow_ID_1851213418" STARTARROW="None" STARTINCLINATION="-413;30;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1778969102656" ID="ID_249806133" MODIFIED="1778969116594" TEXT="verify_heuristic">
|
||||
<node CREATED="1778979230293" ID="ID_683051783" MODIFIED="1778979241071" TEXT="meine Idee der Heuristik umsetzen"/>
|
||||
<node CREATED="1778979241959" ID="ID_959604784" MODIFIED="1778979251687" TEXT="mit einzelnen Grenz-Szenarien durchspielen"/>
|
||||
<node CREATED="1778979252922" ID="ID_1913037138" MODIFIED="1778979264429" TEXT="Verhalten sollte deterministisch vorhersagbar sein"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1778800594638" ID="ID_267050112" LINK="#ID_318881353" MODIFIED="1778800638798" TEXT="siehe EngineBufferManager_test"/>
|
||||
|
|
@ -146750,7 +146768,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1777050453251" FOLDED="true" ID="ID_1529547535" MODIFIED="1778788655476" TEXT="Implementieren">
|
||||
<node COLOR="#338800" CREATED="1777050453251" ID="ID_1529547535" MODIFIED="1779664626549" TEXT="Implementieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1777052048904" ID="ID_1403107789" MODIFIED="1777084853433" TEXT="die Eingangs-Queue wird komplett (transparent) integriert">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -146856,6 +146874,15 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
<node CREATED="1777164514849" ID="ID_489761092" MODIFIED="1777164525297" TEXT="und gewählt wird nach maximalem selectionScore"/>
|
||||
<node CREATED="1777164528024" ID="ID_1047876896" MODIFIED="1777164541639" TEXT="dieser gewählte Buffer bekommt dann einen Score-Update"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1779664650625" ID="ID_1141255727" MODIFIED="1779664857110" TEXT="Dazu einen 2.Layer ⟹ Heuristik zum Triggern">
|
||||
<linktarget COLOR="#4d5f6c" DESTINATION="ID_1141255727" ENDARROW="Default" ENDINCLINATION="-376;22;" ID="Arrow_ID_514664149" SOURCE="ID_1129342480" STARTARROW="None" STARTINCLINATION="-76;-210;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1779664722365" ID="ID_1461846299" MODIFIED="1779665464192" TEXT="im Kontext vom LocalBufferStore : erweiterte Heuristik skizziert">
|
||||
<arrowlink COLOR="#4f65bc" DESTINATION="ID_78533321" ENDARROW="Default" ENDINCLINATION="-548;697;" ID="Arrow_ID_1519732497" STARTARROW="Default" STARTINCLINATION="286;13;"/>
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1777206625753" ID="ID_1782953860" MODIFIED="1777245252573" TEXT="Vor-Reservierung implementieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -146954,6 +146981,14 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
<arrowlink COLOR="#f2ddc1" DESTINATION="ID_1195705832" ENDARROW="Default" ENDINCLINATION="16;47;" ID="Arrow_ID_296050493" STARTARROW="None" STARTINCLINATION="85;12;"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node CREATED="1778969102656" ID="ID_1242239297" MODIFIED="1779665655342" TEXT="verify_heuristic">
|
||||
<linktarget COLOR="#765294" DESTINATION="ID_1242239297" ENDARROW="Default" ENDINCLINATION="-1163;-399;" ID="Arrow_ID_1851213418" SOURCE="ID_453821075" STARTARROW="None" STARTINCLINATION="-413;30;"/>
|
||||
<node CREATED="1778979230293" ID="ID_1129342480" MODIFIED="1779664866045" TEXT="meine Idee der Heuristik umsetzen">
|
||||
<arrowlink COLOR="#4d5f6c" DESTINATION="ID_1141255727" ENDARROW="Default" ENDINCLINATION="-376;22;" ID="Arrow_ID_514664149" STARTARROW="None" STARTINCLINATION="-76;-210;"/>
|
||||
</node>
|
||||
<node CREATED="1778979241959" ID="ID_241540634" MODIFIED="1778979251687" TEXT="mit einzelnen Grenz-Szenarien durchspielen"/>
|
||||
<node CREATED="1778979252922" ID="ID_155080806" MODIFIED="1778979264429" TEXT="Verhalten sollte deterministisch vorhersagbar sein"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#a4c8cf" COLOR="#22695a" CREATED="1776819109351" ID="ID_1998897998" MODIFIED="1779579198844" TEXT="EngineBufferManager">
|
||||
|
|
@ -171129,7 +171164,7 @@ std::cout << tmpl.render({"what", "World"}) << s
|
|||
<arrowlink COLOR="#82878e" DESTINATION="ID_1833389965" ENDARROW="Default" ENDINCLINATION="-1293;117;" ID="Arrow_ID_1228391309" STARTARROW="None" STARTINCLINATION="1447;0;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734633109131" ID="ID_164798551" MODIFIED="1736039585332" TEXT="NodeBuilder">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734633109131" ID="ID_164798551" MODIFIED="1779664645933" TEXT="NodeBuilder">
|
||||
<arrowlink COLOR="#82878e" DESTINATION="ID_1096327457" ENDARROW="Default" ENDINCLINATION="-1293;117;" ID="Arrow_ID_1693662542" STARTARROW="None" STARTINCLINATION="1447;0;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue