///
var docopt = require('docopt');
var prettystream = require('bunyan-debug-stream');
import Promise = require('bluebird');
import bunyan = require('bunyan');
import path = require('path');
var Int64 = require('node-int64');
var fs : any = Promise.promisifyAll(require('fs'));
var thrift = require('thrift');
var StreamingSequencerServiceTypes = require('../lib/StreamingSequencerService_types.js');
var CommonTypes = require('../lib/Common_types.js');
var StreamingSequencerService = require('../lib/StreamingSequencerService.js');
var Measured = require('measured');
var invokedas : string = path.basename(process.argv[1]);
var doc : string = `Usage:
${ invokedas } [--iterations=] [--concurrency=]
${ invokedas } -h | --help | --version
Options:
--iterations= Number of iterations to test [default: 10000].
--concurrency= Maximum number of concurrent connections [default: 1000].
-v Show verbose log messages. (-vv for trace level)
-h --help Show this screen.
--version Show version number.
`;
var log : bunyan.Logger;
var opts = docopt.docopt(doc);
var globalCounter = new Int64(0x0);
initialize(opts).then(function () {
return checkPrereqs(opts)
.catch(function(e){
log.fatal("Prerequisite not met: " + e);
throw("Failed to start due to unmet prerequisite.");
}).then(function() {
//only one option: benchmark
var connection = thrift.createConnection(opts[''], opts['']);
connection.on('error', function(err) {
log.error("Error connecting to endpoint", err);
process.exit(1);
});
var client = thrift.createClient(StreamingSequencerService, connection);
client = Promise.promisifyAll(client);
log.info(`Running benchmark, run for ${opts['--iterations']} iterations at max concurrency ${opts['--concurrency']}`)
var timer = new Measured.Timer();
runBenchmark(client,connection,timer);
});
})
.catch(function(e) {
log.fatal("Failed to initialize: ", e);
});
var i = 0;
var c = 0;
function runBenchmark(client, connection, timer) {
while (c < opts['--concurrency'])
{
if (i + c >= opts['--iterations'])
{
break;
}
c++;
client.nextpos(1,
function (stopwatch) {
return function (e, r) {
i++;
c--;
stopwatch.end();
}
}(timer.start()));
}
if (i < opts['--iterations'])
{
setImmediate(function(){
runBenchmark(client,connection,timer);});
}
else
{
log.info(`Completed benchmark. ${i} iterations`, timer.toJSON());
connection.end();
process.exit(0);
}
}
function initialize(opts : any) : Promise
{
log = bunyan.createLogger({
name: 'corfudb-node-sequencer-benchmark',
streams: [{
level: opts['-v'][2] ? 'trace' :
opts['-v'][1] ? 'debug' : 'info',
stream: (process.stdout).isTTY ? prettystream({
basepath: __dirname,
colors: {
'trace': 'white'
}
}) : process.stdout,
type: (process.stdout).isTTY ? 'raw' : undefined,
}]
})
log.debug("Verbose logging enabled, options were:", opts);
log.trace("Trace logging enabled (warning: this is very verbose!)");
return new Promise(function (fulfill, reject){
fulfill(null);
});
}
function checkPrereqs(opts: any) : Promise
{
return new Promise(function (fulfill, reject){
fulfill(null);
});
}