From 59883023ca7d84d5d735ead96e1ce2911a138515 Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 6 Jul 2016 14:24:27 +0100 Subject: [PATCH] Ignore different order of results from smembers --- .../app/coffee/RedisBackend.coffee | 10 +++++++--- .../RedisBackend/RedisBackendTests.coffee | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/services/document-updater/app/coffee/RedisBackend.coffee b/services/document-updater/app/coffee/RedisBackend.coffee index da51cbbacf..b33021689c 100644 --- a/services/document-updater/app/coffee/RedisBackend.coffee +++ b/services/document-updater/app/coffee/RedisBackend.coffee @@ -102,7 +102,7 @@ class MultiClient if error? logger.error {err: error}, "error in redis backend" else - compareResults(results) + compareResults(results, "exec") callback(primaryError, primaryResult) COMMANDS = { @@ -153,7 +153,7 @@ for command, key_pos of COMMANDS if error? logger.error {err: error}, "error in redis backend" else - compareResults(results) + compareResults(results, command) callback(primaryError, primaryResult...) MultiClient.prototype[command] = (args...) -> @@ -164,10 +164,14 @@ for command, key_pos of COMMANDS args_with_key[key_pos] = key client.rclient[command] args_with_key... -compareResults = (results) -> +compareResults = (results, command) -> return if results.length < 2 first = results[0] + if command == "smembers" + first = first.slice().sort() for result in results.slice(1) + if command == "smembers" + result = result.slice().sort() if not _.isEqual(first, result) logger.error results: results, "redis backend conflict" Metrics.inc "backend-conflict" diff --git a/services/document-updater/test/unit/coffee/RedisBackend/RedisBackendTests.coffee b/services/document-updater/test/unit/coffee/RedisBackend/RedisBackendTests.coffee index e5d2c1756b..0ffc0d72d7 100644 --- a/services/document-updater/test/unit/coffee/RedisBackend/RedisBackendTests.coffee +++ b/services/document-updater/test/unit/coffee/RedisBackend/RedisBackendTests.coffee @@ -66,6 +66,7 @@ describe "RedisBackend", -> @client = @RedisBackend.createClient() @doc_id = "mock-doc-id" + @project_id = "mock-project-id" it "should create a redis client", -> @redis.createClient @@ -138,6 +139,24 @@ describe "RedisBackend", -> .calledWith("backend-conflict") .should.equal true + describe "with differently ordered results from smembers", -> + beforeEach (done) -> + @rclient_redis.smembers = sinon.stub() + @rclient_redis.smembers.withArgs("DocsIn:#{@project_id}").yields(null, ["one", "two"]) + @rclient_ioredis.smembers = sinon.stub() + @rclient_ioredis.smembers.withArgs("DocsIn:{#{@project_id}}").yields(null, ["two", "one"]) + @client.smembers RedisKeyBuilder.docsInProject({project_id: @project_id}), (error, @result) => + setTimeout () -> # Let all background requests complete + done(error) + + it "should return the primary result", -> + @result.should.deep.equal ["one", "two"] + + it "should send a metric indicating a match", -> + @Metrics.inc + .calledWith("backend-match") + .should.equal true + describe "when the secondary errors", -> beforeEach (done) -> @rclient_redis.get = sinon.stub()