blob: feb913e1c7d8d98130ef293fe49ba259d642a967 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Code for benchmarking.
'use strict';
var async = require('async');
var syncbase = require('syncbase');
var nosql = syncbase.nosql;
var util = require('./util');
var wt = util.wt;
var LOG_EVERYTHING = false;
// Does n parallel puts with a common prefix, then returns the prefix.
function doPuts(ctx, tb, n, cb) {
cb = util.logFn('doPuts', cb);
var prefix = util.timestamp() + '.';
async.times(100, function(n, cb) {
// TODO(sadovsky): Remove this once we loosen Syncbase's naming rules.
prefix = prefix.replace(/:/g, '.');
var key = prefix + n;
var value = '';
if (LOG_EVERYTHING) console.log('put: ' + key);
tb.put(ctx, key, value, function(err) {
if (LOG_EVERYTHING) console.log('put done: ' + key);
cb(err);
});
}, function(err) {
return cb(err, prefix);
});
}
// Scans all records with the given prefix.
function doScan(ctx, tb, prefix, cb) {
cb = util.logFn('doScan(' + prefix + ')', cb);
var bytes = 0, streamErr = null;
tb.scan(ctx, nosql.rowrange.prefix(prefix), function(err) {
err = err || streamErr;
if (err) return cb(err);
console.log('scanned ' + bytes + ' bytes');
cb();
}).on('data', function(row) {
bytes += row.key.length + row.value.length;
if (LOG_EVERYTHING) console.log('scan: ' + JSON.stringify(row));
}).on('error', function(err) {
streamErr = streamErr || err.error;
});
}
// Creates a fresh hierarchy, then runs doPuts followed by doScan.
exports.runBenchmark = function(rt, name, cb) {
cb = util.logFn('runBenchmark', cb);
var ctx = rt.getContext();
var s = syncbase.newService(name);
var appName = 'bm.' + util.uid();
util.createHierarchy(ctx, s, appName, 'db', 'tb', function(err, db) {
if (err) return cb(err);
var tb = db.table('tb');
doPuts(wt(ctx), tb, 100, function(err, prefix) {
if (err) return cb(err);
doScan(wt(ctx), tb, prefix, cb);
});
});
};