mirror of
https://github.com/hanzoai/datastore.git
synced 2026-09-26 13:55:07 +00:00
75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
import { assert } from 'https://cdn.jsdelivr.net/npm/chai/chai.js';
|
|
|
|
import { EventSimulator } from '../EventSimulator.js';
|
|
import { WorkerPool } from '../WorkerPool.js';
|
|
import { MergeTree } from '../MergeTree.js';
|
|
import { MergeTreeMerger } from '../MergeTreeMerger.js';
|
|
import { MergeTreeUtilityVisualizer, MergeTreeTimeVisualizer } from '../MergeTreeVisualizer.js';
|
|
|
|
export async function testMergeTreeMerger()
|
|
{
|
|
// Merge selector for test. It merges every two adjacent active parts.
|
|
function* testSelector()
|
|
{
|
|
const mt = yield {type: 'getMergeTree'};
|
|
while (true)
|
|
{
|
|
if (mt.active_part_count < 2)
|
|
return; // no more merges possible
|
|
const active_parts = mt.parts.filter(d => d.active).sort((a, b) => a.begin - b.begin);
|
|
let merge_started = false;
|
|
for (let i = 0; i < active_parts.length - 1; i++)
|
|
{
|
|
const left = active_parts[i];
|
|
const right = active_parts[i + 1];
|
|
if (!left.merging && !right.merging)
|
|
{
|
|
yield {type: 'merge', parts_to_merge: [left, right]};
|
|
merge_started = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!merge_started)
|
|
yield {type: 'wait'}; // we have to wait for any merge to finish before proceeding
|
|
}
|
|
}
|
|
|
|
const sim = new EventSimulator();
|
|
const pool = new WorkerPool(sim, 4); // 4 workers available for parallel execution of level-1 merges
|
|
const mt = new MergeTree();
|
|
|
|
let expected_bytes = 0;
|
|
for (let i = 1; i <= 8; i++)
|
|
{
|
|
const bytes = i * (100 << 20);
|
|
mt.insertPart(bytes);
|
|
expected_bytes += bytes;
|
|
}
|
|
|
|
const merger = new MergeTreeMerger(sim, mt, pool, testSelector());
|
|
await merger.start();
|
|
await sim.run();
|
|
|
|
assert.deepEqual(mt.parts.filter(d => d.active).map(d => d.bytes), [expected_bytes]);
|
|
|
|
console.log('Test 1 passed: MergeTreeMerger');
|
|
|
|
// Show result
|
|
d3.select("body")
|
|
.append("div")
|
|
.attr("class", "container-fluid")
|
|
.append("div")
|
|
.attr("class", "row")
|
|
.call(function(row) {
|
|
row.append("div")
|
|
.attr("class", "col-md-6")
|
|
.attr("id", "merge-tree-merge-time-container");
|
|
row.append("div")
|
|
.attr("class", "col-md-6")
|
|
.attr("id", "merge-tree-merge-util-container");
|
|
});
|
|
|
|
new MergeTreeUtilityVisualizer(mt, d3.select("#merge-tree-merge-util-container"));
|
|
new MergeTreeTimeVisualizer(mt, d3.select("#merge-tree-merge-time-container"));
|
|
}
|