From ab565c80f9abf1582fc312e6c16c3cd5b0dfbbdf Mon Sep 17 00:00:00 2001 From: Ondrej Brinkel Date: Wed, 15 Apr 2015 11:33:24 +0200 Subject: [PATCH 1/2] session-level db adapter: first worker now creates server while other workers connect --- lib/cluster/master_dispatch.js | 6 +++++ lib/sessions/stores/level.js | 43 +++++++++++++++++----------------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/lib/cluster/master_dispatch.js b/lib/cluster/master_dispatch.js index 28cb9b2e..7346560a 100644 --- a/lib/cluster/master_dispatch.js +++ b/lib/cluster/master_dispatch.js @@ -52,6 +52,12 @@ var dispatch = { } } +, 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..aef6606c 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,27 @@ 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) { + //console.log('foo', typeof 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(); From 2b82a587b154997b98428671a8f8b2b3bce8db18 Mon Sep 17 00:00:00 2001 From: Ondrej Brinkel Date: Wed, 15 Apr 2015 11:33:59 +0200 Subject: [PATCH 2/2] removed debug comment --- lib/sessions/stores/level.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/sessions/stores/level.js b/lib/sessions/stores/level.js index aef6606c..7d85ddab 100644 --- a/lib/sessions/stores/level.js +++ b/lib/sessions/stores/level.js @@ -101,7 +101,6 @@ Level.prototype = new (function () { else { // let the server spin up first process.addListener('message', function (data) { - //console.log('foo', typeof 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();