diff --git a/src/core/resources/presence/index.js b/src/core/resources/presence/index.js index 5ed844d6..b13e8b8f 100644 --- a/src/core/resources/presence/index.js +++ b/src/core/resources/presence/index.js @@ -234,6 +234,7 @@ Presence.prototype.fullRead = function (callback) { Presence.prototype.destroy = function () { this.manager.destroy() + Resource.prototype.destroy.call(this) } Presence.setBackend = function (backend) { diff --git a/src/core/resources/presence/presence_manager.js b/src/core/resources/presence/presence_manager.js index 1b386f1b..f6b67a38 100644 --- a/src/core/resources/presence/presence_manager.js +++ b/src/core/resources/presence/presence_manager.js @@ -61,8 +61,6 @@ PresenceManager.prototype.destroy = function () { if (this.handleRedisReply) { this.handleRedisReply = function () {} } - - delete this.store } // FIXME: Method signature is getting unmanageable PresenceManager.prototype.addClient = function (clientSessionId, userId, userType, diff --git a/src/core/resources/resource.js b/src/core/resources/resource.js index b8d2744a..888a826b 100644 --- a/src/core/resources/resource.js +++ b/src/core/resources/resource.js @@ -135,7 +135,9 @@ Resource.prototype.handleMessage = function (clientSession, message) { } } -Resource.prototype.destroy = function () {} +Resource.prototype.destroy = function () { + this.destroyed = true +} Resource.setBackend = function (backend) { // noop diff --git a/src/server/server.js b/src/server/server.js index 9307d20e..0fe8847f 100644 --- a/src/server/server.js +++ b/src/server/server.js @@ -197,6 +197,10 @@ Server.prototype._onSentryDown = function (sentryId) { var started = Date.now() nonblocking(presences).forEach(function (presence) { + if (presence.destroyed) { + return + } + var clientSessionIds = presence.manager.store.clientSessionIdsForSentryId(sentryId) expected += clientSessionIds.length diff --git a/test/presence.unit.test.js b/test/presence.unit.test.js index d7829a2c..97877525 100644 --- a/test/presence.unit.test.js +++ b/test/presence.unit.test.js @@ -5,6 +5,7 @@ var Persistence = require('persistence') var Common = require('./common.js') var Presence = require('../src/core/resources/presence') var sinon = require('sinon') +var expect = require('chai').expect describe('given a presence resource', function () { var presence, client, client2 @@ -535,6 +536,14 @@ describe('given a presence resource', function () { presence.get(fakeClient, { options: { version: 2 } }) }) }) + + describe('#destroy()', function () { + it('sets resource.destroyed flag to true', function () { + expect(!presence.destroyed).to.equal(true) + presence.destroy() + expect(presence.destroyed).to.equal(true) + }) + }) }) describe('a presence resource', function () { diff --git a/test/server.unit.test.js b/test/server.unit.test.js index 307ecba4..f47b9587 100644 --- a/test/server.unit.test.js +++ b/test/server.unit.test.js @@ -286,6 +286,16 @@ describe('given a server', function () { }) }) + it('ignores presences that are destroyed during processing', function (done) { + radarServer._onSentryDown('sentry1') + radarServer.resources[234].destroyed = true + radarServer.on('profiling', function () { + expect(radarServer.resources[123].manager.disconnectRemoteClient).to.have.been.calledTwice + expect(radarServer.resources[234].manager.disconnectRemoteClient).not.to.have.been.called + done() + }) + }) + it('emits profiling event', function (done) { radarServer._onSentryDown('sentry1') radarServer.on('profiling', function (e) {