1
0
Fork 0
mirror of https://github.com/overleaf/overleaf.git synced 2025-04-08 07:11:58 +00:00

Merge pull request from overleaf/em-send-output-files-on-timeout

Send output files on timeout
This commit is contained in:
Eric Mc Sween 2019-10-23 08:21:24 -04:00 committed by GitHub
commit 82ff646904
4 changed files with 22 additions and 17 deletions

View file

@ -26,21 +26,19 @@ module.exports = CompileController =
status = "terminated"
else if error?.validate
status = "validation-#{error.validate}"
else if error?.timedout
status = "timedout"
logger.log err: error, project_id: request.project_id, "timeout running compile"
else if error?
if error.timedout
status = "timedout"
logger.log err: error, project_id: request.project_id, "timeout running compile"
else
status = "error"
code = 500
logger.warn err: error, project_id: request.project_id, "error running compile"
status = "error"
code = 500
logger.warn err: error, project_id: request.project_id, "error running compile"
else
status = "failure"
for file in outputFiles
if file.path?.match(/output\.pdf$/)
status = "success"
if status == "failure"
logger.warn project_id: request.project_id, outputFiles:outputFiles, "project failed to compile successfully, no output.pdf generated"
@ -49,6 +47,9 @@ module.exports = CompileController =
if file.path is "core"
logger.error project_id:request.project_id, req:req, outputFiles:outputFiles, "core file found in output"
if error?
outputFiles = error.outputFiles || []
timer.done()
res.status(code or 200).send {
compile:

View file

@ -106,10 +106,11 @@ module.exports = CompileManager =
error = new Error("compilation")
error.validate = "fail"
# compile was killed by user, was a validation, or a compile which failed validation
if error?.terminated or error?.validate
if error?.terminated or error?.validate or error?.timedout
OutputFileFinder.findOutputFiles resourceList, compileDir, (err, outputFiles) ->
return callback(err) if err?
callback(error, outputFiles) # return output files so user can check logs
error.outputFiles = outputFiles # return output files so user can check logs
callback(error)
return
# compile completed normally
return callback(error) if error?

View file

@ -78,7 +78,7 @@ module.exports = DockerRunner =
_callback(args...)
# Only call the callback once
_callback = () ->
name = options.name
streamEnded = false
@ -115,7 +115,7 @@ module.exports = DockerRunner =
_getContainerOptions: (command, image, volumes, timeout, environment) ->
timeoutInSeconds = timeout / 1000
dockerVolumes = {}
for hostVol, dockerVol of volumes
dockerVolumes[dockerVol] = {}
@ -148,7 +148,7 @@ module.exports = DockerRunner =
"Ulimits": [{'Name': 'cpu', 'Soft': timeoutInSeconds+5, 'Hard': timeoutInSeconds+10}]
"CapDrop": "ALL"
"SecurityOpt": ["no-new-privileges"]
if Settings.path?.synctexBinHostPath?
options["HostConfig"]["Binds"].push("#{Settings.path.synctexBinHostPath}:/opt/synctex:ro")
@ -276,7 +276,7 @@ module.exports = DockerRunner =
logger.log container_id: containerId, "timeout reached, killing container"
container.kill(() ->)
, timeout
logger.log container_id: containerId, "waiting for docker container"
container.wait (error, res) ->
if error?
@ -355,4 +355,4 @@ module.exports = DockerRunner =
, oneHour = 60 * 60 * 1000
, randomDelay
DockerRunner.startContainerMonitor()
DockerRunner.startContainerMonitor()

View file

@ -15,7 +15,7 @@ describe "Timed out compile", ->
\\documentclass{article}
\\begin{document}
\\def\\x{Hello!\\par\\x}
\\x
\\x
\\end{document}
'''
]
@ -29,3 +29,6 @@ describe "Timed out compile", ->
it "should return a timedout status", ->
@body.compile.status.should.equal "timedout"
it "should return the log output file name", ->
outputFilePaths = @body.compile.outputFiles.map((x) => x.path)
outputFilePaths.should.include('output.log')