wrap project resync in project structure lock

This commit is contained in:
Hayden Faulds 2018-03-07 11:02:29 +00:00
parent 4d2f0218af
commit 926f91dd3b
3 changed files with 32 additions and 28 deletions

View file

@ -205,22 +205,7 @@ module.exports = DocumentUpdaterHandler =
logger.error {project_id, doc_id, thread_id}, "doc updater returned a non-success status code: #{res.statusCode}" logger.error {project_id, doc_id, thread_id}, "doc updater returned a non-success status code: #{res.statusCode}"
callback new Error("doc updater returned a non-success status code: #{res.statusCode}") callback new Error("doc updater returned a non-success status code: #{res.statusCode}")
resyncProject: (project_id, callback) -> resyncProject: (project_id, docs, files, callback) ->
ProjectEntityHandler = require "../Project/ProjectEntityHandler"
ProjectGetter.getProject project_id, rootFolder: true, (error, project) ->
return callback(error) if error?
ProjectEntityHandler.getAllEntitiesFromProject project, (error, docs, files) ->
return callback(error) if error?
docs = _.map docs, (doc) ->
doc: doc.doc._id
path: doc.path
files = _.map files, (file) ->
file: file.file._id
path: file.path
url: FileStoreHandler._buildUrl(project_id, file.file._id)
request.post request.post
url: "#{settings.apis.documentupdater.url}/project/#{project_id}/resync" url: "#{settings.apis.documentupdater.url}/project/#{project_id}/resync"
json: { docs, files } json: { docs, files }

View file

@ -2,8 +2,8 @@ logger = require "logger-sharelatex"
request = require "request" request = require "request"
settings = require "settings-sharelatex" settings = require "settings-sharelatex"
AuthenticationController = require "../Authentication/AuthenticationController" AuthenticationController = require "../Authentication/AuthenticationController"
DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler"
ProjectDetailsHandler = require "../Project/ProjectDetailsHandler" ProjectDetailsHandler = require "../Project/ProjectDetailsHandler"
ProjectEntityUpdateHandler = require "../Project/ProjectEntityUpdateHandler"
HistoryManager = require "./HistoryManager" HistoryManager = require "./HistoryManager"
module.exports = HistoryController = module.exports = HistoryController =
@ -66,6 +66,6 @@ module.exports = HistoryController =
resyncProject: (req, res, next = (error) ->) -> resyncProject: (req, res, next = (error) ->) ->
project_id = req.params.Project_id project_id = req.params.Project_id
DocumentUpdaterHandler.resyncProject project_id, (error) -> ProjectEntityUpdateHandler.resyncProject project_id, (error) ->
return next(error) if error? return next(error) if error?
res.sendStatus 204 res.sendStatus 204

View file

@ -313,6 +313,25 @@ module.exports = ProjectEntityUpdateHandler = self =
TpdsUpdateSender.moveEntity({project_id, startPath, endPath, project_name, rev}) TpdsUpdateSender.moveEntity({project_id, startPath, endPath, project_name, rev})
DocumentUpdaterHandler.updateProjectStructure project_id, userId, changes, callback DocumentUpdaterHandler.updateProjectStructure project_id, userId, changes, callback
# This doesn't directly update project structure but we need to take the lock
# to prevent anything else being queued before the resync update
resyncProject: wrapWithLock (project_id, callback) ->
ProjectGetter.getProject project_id, rootFolder: true, (error, project) ->
return callback(error) if error?
ProjectEntityHandler.getAllEntitiesFromProject project, (error, docs, files) ->
return callback(error) if error?
docs = _.map docs, (doc) ->
doc: doc.doc._id
path: doc.path
files = _.map files, (file) ->
file: file.file._id
path: file.path
url: FileStoreHandler._buildUrl(project_id, file.file._id)
DocumentUpdaterHandler.resyncProject project_id, docs, files, callback
_cleanUpEntity: (project, entity, entityType, path, userId, callback = (error) ->) -> _cleanUpEntity: (project, entity, entityType, path, userId, callback = (error) ->) ->
if(entityType.indexOf("file") != -1) if(entityType.indexOf("file") != -1)
self._cleanUpFile project, entity, path, userId, callback self._cleanUpFile project, entity, path, userId, callback