core/plugins/c9.ide.collab/server/sqlite_fsync_comparison.js
2017-02-06 12:40:24 +00:00

88 lines
2.2 KiB
JavaScript

"use strict";
var Sequelize = require("sequelize");
var async = require("async");
var sequelize;
var User;
function wrapSeq(fun, next) {
return fun.success(function () {
next.apply(null, [null].concat(Array.prototype.slice.apply(arguments)));
}).error(next);
}
function initDB(callback) {
sequelize = new Sequelize("c9-collab", "c9", "c9-collab-secret", {
// the sql dialect of the database
dialect: "sqlite",
storage: __dirname + "/c9-collab-test.db",
logging: false,
// use pooling in order to reduce db connection overload and to increase speed
// currently only for mysql and postgresql (since v1.5.0)
pool: { maxConnections: 5, maxIdleTime: 30 }
});
User = sequelize.define("User", {
uid: { type: Sequelize.STRING, primaryKey: true },
fullname: { type: Sequelize.STRING },
email: { type: Sequelize.STRING }
}, {
timestamps: true, paranoid: true
});
wrapSeq(User.sync(), callback);
}
var i;
// http://www.sqlite.org/pragma.html#pragma_synchronous
function stressTestFSync(sync, callback) {
var st;
async.series([
initDB,
function (next) {
wrapSeq(User.sync({ force: true }), next);
},
function (next) {
st = new Date();
i = 1;
wrapSeq(sequelize.query("PRAGMA synchronous = " + sync + ";"), next);
},
createUsers,
function (next) {
console.log("SQLITE3 STRESS SYNC:", sync, " - TIME:", new Date() - st, "ms");
next();
}
],
callback);
}
async.series([
stressTestFSync.bind(null, 0),
stressTestFSync.bind(null, 1),
stressTestFSync.bind(null, 2)
],
function (err) {
if (err)
console.log(err);
});
var TEST_SIZE = 1000;
function createUsers(done) {
wrapSeq(User.create({
uid: i + 1,
fullname: "name_" + i,
email: "email_" + i + "@something.com"
}), function (err) {
if (err) {
console.log(err);
process.exit(1);
}
if (i++ <= TEST_SIZE)
createUsers(done);
else
done();
});
}