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

Merge pull request #615 from sharelatex/bg-fix-locking-for-copy-project

add missing locking to copyFileFromExistingProject
Brian Gough пре 8 година
родитељ
комит
853d0ab108
1 измењених фајлова са 31 додато и 28 уклоњено
  1. 31 28
      services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee

+ 31 - 28
services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee

@@ -45,37 +45,40 @@ wrapWithLock = (methodWithoutLock) ->
 		methodWithLock
 
 module.exports = ProjectEntityUpdateHandler = self =
-	# this doesn't need any locking because it's only called by ProjectDuplicator
-	copyFileFromExistingProjectWithProject: (project, folder_id, originalProject_id, origonalFileRef, userId, callback = (error, fileRef, folder_id) ->)->
-		project_id = project._id
-		projectHistoryId = project.overleaf?.history?.id
-		logger.log { project_id, folder_id, originalProject_id, origonalFileRef }, "copying file in s3 with project"
-		return callback(err) if err?
-		ProjectEntityMongoUpdateHandler._confirmFolder project, folder_id, (folder_id)=>
-			if !origonalFileRef?
-				logger.err { project_id, folder_id, originalProject_id, origonalFileRef }, "file trying to copy is null"
-				return callback()
-			# convert any invalid characters in original file to '_'
-			fileRef = new File name : SafePath.clean(origonalFileRef.name)
-			FileStoreHandler.copyFile originalProject_id, origonalFileRef._id, project._id, fileRef._id, (err, fileStoreUrl)->
+	copyFileFromExistingProjectWithProject: wrapWithLock
+		beforeLock: (next) ->
+			(project, folder_id, originalProject_id, origonalFileRef, userId, callback = (error, fileRef, folder_id) ->)->
+				project_id = project._id
+				logger.log { project_id, folder_id, originalProject_id, origonalFileRef }, "copying file in s3 with project"
+				ProjectEntityMongoUpdateHandler._confirmFolder project, folder_id, (folder_id) ->
+					if !origonalFileRef?
+						logger.err { project_id, folder_id, originalProject_id, origonalFileRef }, "file trying to copy is null"
+						return callback()
+					# convert any invalid characters in original file to '_'
+					fileRef = new File name : SafePath.clean(origonalFileRef.name)
+					FileStoreHandler.copyFile originalProject_id, origonalFileRef._id, project._id, fileRef._id, (err, fileStoreUrl)->
+						if err?
+							logger.err { err, project_id, folder_id, originalProject_id, origonalFileRef }, "error coping file in s3"
+							return callback(err)
+						next(project, folder_id, originalProject_id, origonalFileRef, userId, fileRef, fileStoreUrl, callback)
+		withLock: (project, folder_id, originalProject_id, origonalFileRef, userId, fileRef, fileStoreUrl, callback = (error, fileRef, folder_id) ->)->
+			project_id = project._id
+			projectHistoryId = project.overleaf?.history?.id
+			ProjectEntityMongoUpdateHandler._putElement project, folder_id, fileRef, "file", (err, result, newProject) ->
 				if err?
-					logger.err { err, project_id, folder_id, originalProject_id, origonalFileRef }, "error coping file in s3"
+					logger.err { err, project_id, folder_id }, "error putting element as part of copy"
 					return callback(err)
-				ProjectEntityMongoUpdateHandler._putElement project, folder_id, fileRef, "file", (err, result)=>
+				TpdsUpdateSender.addFile { project_id, file_id:fileRef._id, path:result?.path?.fileSystem, rev:fileRef.rev, project_name:project.name}, (err) ->
 					if err?
-						logger.err { err, project_id, folder_id }, "error putting element as part of copy"
-						return callback(err)
-					TpdsUpdateSender.addFile { project_id, file_id:fileRef._id, path:result?.path?.fileSystem, rev:fileRef.rev, project_name:project.name}, (err) ->
-						if err?
-							logger.err { err, project_id, folder_id, originalProject_id, origonalFileRef }, "error sending file to tpds worker"
-						newFiles = [
-							file: fileRef
-							path: result?.path?.fileSystem
-							url: fileStoreUrl
-						]
-						DocumentUpdaterHandler.updateProjectStructure project_id, projectHistoryId, userId, {newFiles}, (error) ->
-							return callback(error) if error?
-							callback null, fileRef, folder_id
+						logger.err { err, project_id, folder_id, originalProject_id, origonalFileRef }, "error sending file to tpds worker"
+					newFiles = [
+						file: fileRef
+						path: result?.path?.fileSystem
+						url: fileStoreUrl
+					]
+					DocumentUpdaterHandler.updateProjectStructure project_id, projectHistoryId, userId, {newFiles, newProject}, (error) ->
+						return callback(error) if error?
+						callback null, fileRef, folder_id
 
 	updateDocLines: (project_id, doc_id, lines, version, ranges, callback = (error) ->)->
 		ProjectGetter.getProjectWithoutDocLines project_id, (err, project)->