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

Merge pull request #37 from sharelatex/bg-limit-ops-in-lock

put a limit on the number of ops per iteration
Brian Gough 8 лет назад
Родитель
Сommit
3d57976ef9

+ 4 - 2
services/document-updater/app/coffee/RealTimeRedisManager.coffee

@@ -3,11 +3,13 @@ rclient = require("redis-sharelatex").createClient(Settings.redis.realtime)
 Keys = Settings.redis.realtime.key_schema
 logger = require('logger-sharelatex')
 
+MAX_OPS_PER_ITERATION = 8 # process a limited number of ops for safety
+
 module.exports = RealTimeRedisManager =
 	getPendingUpdatesForDoc : (doc_id, callback)->
 		multi = rclient.multi()
-		multi.lrange Keys.pendingUpdates({doc_id}), 0 , -1
-		multi.del Keys.pendingUpdates({doc_id})
+		multi.lrange Keys.pendingUpdates({doc_id}), 0, (MAX_OPS_PER_ITERATION-1)
+		multi.ltrim Keys.pendingUpdates({doc_id}), MAX_OPS_PER_ITERATION, -1
 		multi.exec (error, replys) ->
 			return callback(error) if error?
 			jsonUpdates = replys[0]

+ 1 - 0
services/document-updater/app/coffee/UpdateManager.coffee

@@ -47,6 +47,7 @@ module.exports = UpdateManager =
 		profile = new Profiler("fetchAndApplyUpdates", {project_id, doc_id})
 		RealTimeRedisManager.getPendingUpdatesForDoc doc_id, (error, updates) =>
 			return callback(error) if error?
+			logger.log {project_id: project_id, doc_id: doc_id, count: updates.length}, "processing updates"
 			if updates.length == 0
 				return callback()
 			profile.log("getPendingUpdatesForDoc")

+ 4 - 4
services/document-updater/test/unit/coffee/RealTimeRedisManager/RealTimeRedisManagerTests.coffee

@@ -26,7 +26,7 @@ describe "RealTimeRedisManager", ->
 	describe "getPendingUpdatesForDoc", ->
 		beforeEach ->
 			@rclient.lrange = sinon.stub()
-			@rclient.del = sinon.stub()
+			@rclient.ltrim = sinon.stub()
 
 		describe "successfully", ->
 			beforeEach ->
@@ -40,12 +40,12 @@ describe "RealTimeRedisManager", ->
 			
 			it "should get the pending updates", ->
 				@rclient.lrange
-					.calledWith("PendingUpdates:#{@doc_id}", 0, -1)
+					.calledWith("PendingUpdates:#{@doc_id}", 0, 7)
 					.should.equal true
 
 			it "should delete the pending updates", ->
-				@rclient.del
-					.calledWith("PendingUpdates:#{@doc_id}")
+				@rclient.ltrim
+					.calledWith("PendingUpdates:#{@doc_id}", 8, -1)
 					.should.equal true
 
 			it "should call the callback with the updates", ->