109 lines
3.6 KiB
JavaScript
109 lines
3.6 KiB
JavaScript
//NOTE: this script require node.js v8+ to run (native async/await)
|
|
var uuid = require('uuid');
|
|
var client = require('../src/client');
|
|
var conn = client.createConnection({}, 'tcp://localhost:1113');
|
|
conn.on('connected', onConnected);
|
|
|
|
var batchSize = parseInt(process.argv[2], 10) || 500;
|
|
const MB = 1024*1024;
|
|
const adminCreds = new client.UserCredentials("admin", "changeit");
|
|
const nbEvents = 50000;
|
|
const events = [];
|
|
const streams = [];
|
|
const writeOneStream = 'testWrite-' + uuid.v4();
|
|
for(var i = 0; i < nbEvents; i++) {
|
|
streams.push('testWrite-' + uuid.v4());
|
|
events.push(client.createJsonEventData(uuid.v4(), {a:i, b:i+1, c:i+2}, null, 'myEvent'))
|
|
}
|
|
conn.connect();
|
|
|
|
function rssMB() {
|
|
return (process.memoryUsage().rss / MB).toFixed(2);
|
|
}
|
|
|
|
function reportResult(action, nbEvents, elapsedMs) {
|
|
console.log(action, nbEvents, 'events took', elapsedMs, 'ms, avg', (nbEvents/(elapsedMs/1000)).toFixed(2), '/s');
|
|
console.log('Memory usage:', rssMB(), 'MB\n');
|
|
}
|
|
|
|
async function testWriteOneStreamAnyVersion(batchSize) {
|
|
console.log(`Test Write One Stream Any Version (batchSize = ${batchSize})...`);
|
|
const start = Date.now();
|
|
const promises = [];
|
|
for(let i = 0; i < nbEvents; i += batchSize) {
|
|
promises.push(conn.appendToStream(writeOneStream, client.expectedVersion.any, events.slice(i, i + batchSize)))
|
|
}
|
|
await Promise.all(promises);
|
|
var diff = Date.now() - start;
|
|
reportResult("Writing", nbEvents, diff)
|
|
}
|
|
|
|
async function testWriteOneStreamWithVersion(batchSize) {
|
|
console.log(`Test Write One Stream With Version (batchSize = ${batchSize})...`);
|
|
const writeStream = 'testWrite-' + uuid.v4();
|
|
const start = Date.now();
|
|
const promises = [];
|
|
for(let i = 0; i < nbEvents; i += batchSize) {
|
|
promises.push(conn.appendToStream(writeStream, i-1, events.slice(i, i + batchSize)))
|
|
}
|
|
await Promise.all(promises);
|
|
var diff = Date.now() - start;
|
|
reportResult("Writing", nbEvents, diff)
|
|
}
|
|
|
|
async function testWriteMultipleStream() {
|
|
console.log('Test Write Multiple Streams...');
|
|
var start = Date.now();
|
|
var promises = [];
|
|
for(var i = 0; i < nbEvents; i++) {
|
|
promises.push(conn.appendToStream(streams[i], client.expectedVersion.emptyStream, events[i]))
|
|
}
|
|
await Promise.all(promises);
|
|
const diff = Date.now() - start;
|
|
reportResult("Writing", nbEvents, diff)
|
|
}
|
|
|
|
async function testRead(batchSize) {
|
|
console.log(`Test Read One Stream (batchSize = ${batchSize})...`);
|
|
const start = Date.now();
|
|
const promises = [];
|
|
for(let i = 0; i < nbEvents; i += batchSize) {
|
|
promises.push(conn.readStreamEventsForward(writeOneStream, i, batchSize, false));
|
|
}
|
|
const results = await Promise.all(promises);
|
|
const diff = Date.now() - start;
|
|
const readEvents = results.reduce((x,y) => x + y.events.length, 0);
|
|
reportResult("Reading", readEvents, diff)
|
|
}
|
|
|
|
async function testReadAll(batchSize) {
|
|
console.log(`Test Read from $all (batchSize = ${batchSize})...`);
|
|
const start = Date.now();
|
|
let pos = client.positions.start;
|
|
let eventsCount = 0;
|
|
for(;;) {
|
|
var result = await conn.readAllEventsForward(pos, batchSize, false, adminCreds);
|
|
pos = result.nextPosition;
|
|
eventsCount += result.events.length;
|
|
if (result.isEndOfStream) break;
|
|
}
|
|
const diff = Date.now() - start;
|
|
reportResult("Reading", eventsCount, diff)
|
|
}
|
|
|
|
async function onConnected() {
|
|
try {
|
|
await testWriteOneStreamAnyVersion(1);
|
|
await testWriteOneStreamAnyVersion(batchSize);
|
|
await testWriteOneStreamWithVersion(1);
|
|
await testWriteOneStreamWithVersion(batchSize);
|
|
await testWriteMultipleStream();
|
|
await testRead(1);
|
|
await testRead(batchSize);
|
|
await testReadAll(batchSize);
|
|
conn.close();
|
|
} catch (e) {
|
|
console.log('ERROR', e);
|
|
}
|
|
}
|