Преглед изворни кода

Add a "flush: false" option to the doc delete endpoint

This will delete the document from Redis without flushing to web,
docstore or history. To be used when something is broken.
Eric Mc Sween пре 6 година
родитељ
комит
c09bc0e868

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

@@ -54,7 +54,7 @@ app.post   '/project/:project_id/get_and_flush_if_old',                 HttpCont
 app.post   '/project/:project_id/clearState',                           HttpController.clearProjectState
 app.post   '/project/:project_id/doc/:doc_id',                          HttpController.setDoc
 app.post   '/project/:project_id/doc/:doc_id/flush',                    HttpController.flushDocIfLoaded
-app.delete '/project/:project_id/doc/:doc_id',                          HttpController.flushAndDeleteDoc
+app.delete '/project/:project_id/doc/:doc_id',                          HttpController.deleteDoc
 app.delete '/project/:project_id',                                      HttpController.deleteProject
 app.delete '/project',                                                  HttpController.deleteMultipleProjects
 app.post   '/project/:project_id',                                      HttpController.updateProject

+ 4 - 0
services/document-updater/app/coffee/DocumentManager.coffee

@@ -222,6 +222,10 @@ module.exports = DocumentManager =
 		UpdateManager = require "./UpdateManager"
 		UpdateManager.lockUpdatesAndDo DocumentManager.flushAndDeleteDoc, project_id, doc_id, callback
 
+	deleteDocWithLock: (project_id, doc_id, callback) ->
+		UpdateManager = require "./UpdateManager"
+		UpdateManager.lockUpdatesAndDo RedisManager.removeDocFromMemory, project_id, doc_id, callback
+
 	acceptChangesWithLock: (project_id, doc_id, change_ids, callback = (error) ->) ->
 		UpdateManager = require "./UpdateManager"
 		UpdateManager.lockUpdatesAndDo DocumentManager.acceptChanges, project_id, doc_id, change_ids, callback

+ 18 - 10
services/document-updater/app/coffee/HttpController.coffee

@@ -103,20 +103,28 @@ module.exports = HttpController =
 			logger.log project_id: project_id, doc_id: doc_id, "flushed doc via http"
 			res.send 204 # No Content
 
-	flushAndDeleteDoc: (req, res, next = (error) ->) ->
+	deleteDoc: (req, res, next = (error) ->) ->
 		doc_id = req.params.doc_id
 		project_id = req.params.project_id
-		logger.log project_id: project_id, doc_id: doc_id, "deleting doc via http"
+		flush = req.body.flush ? true
+		logger.log project_id: project_id, doc_id: doc_id, flush: flush, "deleting doc via http"
 		timer = new Metrics.Timer("http.deleteDoc")
-		DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) ->
-			timer.done()
-			# There is no harm in flushing project history if the previous call
-			# failed and sometimes it is required
-			HistoryManager.flushProjectChangesAsync project_id
+		if flush
+			DocumentManager.flushAndDeleteDocWithLock project_id, doc_id, (error) ->
+				timer.done()
+				# There is no harm in flushing project history if the previous call
+				# failed and sometimes it is required
+				HistoryManager.flushProjectChangesAsync project_id
 
-			return next(error) if error?
-			logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http"
-			res.send 204 # No Content
+				return next(error) if error?
+				logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http"
+				res.send 204 # No Content
+		else
+			DocumentManager.deleteDocWithLock project_id, doc_id, (error) ->
+				timer.done()
+				return next(error) if error?
+				logger.log project_id: project_id, doc_id: doc_id, "deleted doc via http"
+				res.send 204 # No Content
 
 	flushProject: (req, res, next = (error) ->) ->
 		project_id = req.params.project_id

+ 18 - 5
services/document-updater/test/unit/coffee/HttpController/HttpControllerTests.coffee

@@ -264,18 +264,19 @@ describe "HttpController", ->
 				@next
 					.calledWith(new Error("oops"))
 					.should.equal true
-	
-	describe "flushAndDeleteDoc", ->
+
+	describe "deleteDoc", ->
 		beforeEach ->
 			@req =
 				params:
 					project_id: @project_id
 					doc_id: @doc_id
+				body: {}
 
 		describe "successfully", ->
 			beforeEach ->
 				@DocumentManager.flushAndDeleteDocWithLock = sinon.stub().callsArgWith(2)
-				@HttpController.flushAndDeleteDoc(@req, @res, @next)
+				@HttpController.deleteDoc(@req, @res, @next)
 
 			it "should flush and delete the doc", ->
 				@DocumentManager.flushAndDeleteDocWithLock
@@ -294,16 +295,28 @@ describe "HttpController", ->
 
 			it "should log the request", ->
 				@logger.log
-					.calledWith(doc_id: @doc_id, project_id: @project_id, "deleting doc via http")
+					.calledWith(doc_id: @doc_id, project_id: @project_id, flush: true, "deleting doc via http")
 					.should.equal true
 
 			it "should time the request", ->
 				@Metrics.Timer::done.called.should.equal true
 
+		describe "without flush", ->
+			beforeEach ->
+				@req.body.flush = false
+				@DocumentManager.deleteDocWithLock = sinon.stub().yields()
+				@HttpController.deleteDoc(@req, @res, @next)
+
+			it "should delete the doc", ->
+				@DocumentManager.deleteDocWithLock.calledWith(@project_id, @doc_id).should.equal true
+
+			it "should return a successful No Content response", ->
+				@res.send.calledWith(204).should.equal true
+
 		describe "when an errors occurs", ->
 			beforeEach ->
 				@DocumentManager.flushAndDeleteDocWithLock = sinon.stub().callsArgWith(2, new Error("oops"))
-				@HttpController.flushAndDeleteDoc(@req, @res, @next)
+				@HttpController.deleteDoc(@req, @res, @next)
 
 			it "should flush project history", ->
 				@HistoryManager.flushProjectChangesAsync