diff --git a/lib/cluster/master_dispatch.js b/lib/cluster/master_dispatch.js index 69b410d9..bdbe3185 100644 --- a/lib/cluster/master_dispatch.js +++ b/lib/cluster/master_dispatch.js @@ -55,6 +55,12 @@ } } + , broadcast: function (msg) { + var self = this; + Object.keys(this.workers.items).forEach(function (workerId) { + self.workers.items[workerId].worker.send(msg); + }); + } }; module.exports = dispatch; diff --git a/lib/sessions/stores/level.js b/lib/sessions/stores/level.js index bcb63d01..7d85ddab 100644 --- a/lib/sessions/stores/level.js +++ b/lib/sessions/stores/level.js @@ -67,25 +67,10 @@ Level.prototype = new (function () { this.setup = function (callback) { var con; var sessionsPath = path.join(process.cwd(), 'sessions'); - var lockfile = path.join(sessionsPath, geddy.config.sessions.key, 'LOCK'); - - var locked = false; - var fh; - - if (fs.existsSync(lockfile)) { - try { - fh = fs.openSync(lockfile, 'w'); - } catch (e) { - locked = true; - } - - if (fh) { - fs.closeSync(fh); - } - } + var isMaster = geddy.config.workerNumber === 1; // master cluster creates level db, while workers connect to it - if (!locked) { + if (isMaster) { // create level db if (!fs.existsSync(sessionsPath)) { file.mkdirP(sessionsPath); @@ -103,13 +88,26 @@ Level.prototype = new (function () { // create multilevel server net.createServer(function (con) { con.pipe(multilevel.server(_db)).pipe(con); - }).listen(geddy.config.sessions.port); - geddy.log.info('Sessions DB listening on port ' + geddy.config.sessions.port); + }).listen(geddy.config.sessions.port, function () { + geddy.log.info('Sessions DB server listening on port ' + geddy.config.sessions.port); + // inform all clients that server is ready + geddy.worker.sendMessage({ + workerId: process.pid, + method: 'broadcast', + action: 'sessionsServerReady' + }); + }); } else { - _db = multilevel.client(); - var con = net.connect(geddy.config.sessions.port); - con.pipe(_db.createRpcStream()).pipe(con); + // let the server spin up first + process.addListener('message', function (data) { + if (data && data.method === 'broadcast' && data.action === 'sessionsServerReady') { + geddy.log.info('Sessions DB client connecting on port ' + geddy.config.sessions.port); + _db = multilevel.client(); + var con = net.connect(geddy.config.sessions.port); + con.pipe(_db.createRpcStream()).pipe(con); + } + }); } callback();