Просмотр исходного кода

Merge pull request #48 from sharelatex/bg-check-doc-in-project-set

check if doc is missing from DocsIn set
Brian Gough 9 лет назад
Родитель
Сommit
7ecb4128de

+ 11 - 1
services/document-updater/app/coffee/RedisManager.coffee

@@ -113,7 +113,17 @@ module.exports = RedisManager =
 			if doc_project_id? and doc_project_id isnt project_id
 				logger.error project_id: project_id, doc_id: doc_id, doc_project_id: doc_project_id, "doc not in project"
 				return callback(new Errors.NotFoundError("document not found"))
-			callback null, docLines, version, ranges
+
+			# doc is not in redis, bail out
+			if !docLines?
+				return callback null, docLines, version, ranges
+
+			# doc should be in project set, check if missing (workaround for missing docs from putDoc)
+			rclient.sadd keys.docsInProject(project_id:project_id), doc_id, (error, result) ->
+				return callback(error) if error?
+				if result isnt 0 # doc should already be in set
+					logger.error project_id: project_id, doc_id: doc_id, doc_project_id: doc_project_id, "doc missing from docsInProject set"
+				callback null, docLines, version, ranges
 
 	getDocVersion: (doc_id, callback = (error, version) ->) ->
 		rclient.get keys.docVersion(doc_id: doc_id), (error, version) ->

+ 40 - 0
services/document-updater/test/unit/coffee/RedisManager/RedisManagerTests.coffee

@@ -58,6 +58,7 @@ describe "RedisManager", ->
 			@json_ranges = JSON.stringify @ranges
 			@rclient.get = sinon.stub()
 			@rclient.exec = sinon.stub().callsArgWith(0, null, [@jsonlines, @version, @hash, @project_id, @json_ranges])
+			@rclient.sadd = sinon.stub().yields(null, 0)
 
 		describe "successfully", ->
 			beforeEach ->
@@ -83,6 +84,11 @@ describe "RedisManager", ->
 					.calledWith("Ranges:#{@doc_id}")
 					.should.equal true
 
+			it "should check if the document is in the DocsIn set", ->
+				@rclient.sadd
+					.calledWith("DocsIn:#{@project_id}")
+					.should.equal true
+
 			it 'should return the document', ->
 				@callback
 					.calledWith(null, @lines, @version, @ranges)
@@ -92,6 +98,40 @@ describe "RedisManager", ->
 				@logger.error.calledWith()
 					.should.equal false
 
+		describe "when the document is not present", ->
+			beforeEach ->
+				@rclient.exec = sinon.stub().callsArgWith(0, null, [null, null, null, null, null])
+				@rclient.sadd = sinon.stub().yields()
+				@RedisManager.getDoc @project_id, @doc_id, @callback
+
+			it "should not check if the document is in the DocsIn set", ->
+				@rclient.sadd
+					.calledWith("DocsIn:#{@project_id}")
+					.should.equal false
+
+			it 'should return an empty result', ->
+				@callback
+					.calledWith(null, null, 0, {})
+					.should.equal true
+
+			it 'should not log any errors', ->
+				@logger.error.calledWith()
+					.should.equal false
+
+		describe "when the document is missing from the DocsIn set", ->
+			beforeEach ->
+				@rclient.sadd = sinon.stub().yields(null, 1)
+				@RedisManager.getDoc @project_id, @doc_id, @callback
+
+			it 'should log an error', ->
+				@logger.error.calledWith()
+					.should.equal true
+
+			it 'should return the document', ->
+				@callback
+					.calledWith(null, @lines, @version, @ranges)
+					.should.equal true
+
 		describe "with a corrupted document", ->
 			beforeEach ->
 				@badHash = "INVALID-HASH-VALUE"