From e0014387c5ed45935b29b36be821e42460fa83fa Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 10 May 2017 18:58:01 +0200 Subject: [PATCH] [FIX] report: always close pdf files after merge If an exception during the merges (such as a file descriptor overrun), we would otherwise depend on the next garbage collection to close the files. But the next GC may never come. For example if we ran out of OS file descriptors during merge, all future requests will crash for the same reason, and the process will never recover because the GC will never run. Much easier to explicitly close the files all the time. --- addons/report/models/report.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/addons/report/models/report.py b/addons/report/models/report.py index 3c7d19fcc3a..36200ce9839 100644 --- a/addons/report/models/report.py +++ b/addons/report/models/report.py @@ -560,19 +560,23 @@ class Report(osv.Model): """ writer = PdfFileWriter() streams = [] # We have to close the streams *after* PdfFilWriter's call to write() - for document in documents: - pdfreport = file(document, 'rb') - streams.append(pdfreport) - reader = PdfFileReader(pdfreport) - for page in range(0, reader.getNumPages()): - writer.addPage(reader.getPage(page)) + try: + for document in documents: + pdfreport = file(document, 'rb') + streams.append(pdfreport) + reader = PdfFileReader(pdfreport) + for page in range(0, reader.getNumPages()): + writer.addPage(reader.getPage(page)) - merged_file_fd, merged_file_path = tempfile.mkstemp(suffix='.html', prefix='report.merged.tmp.') - with closing(os.fdopen(merged_file_fd, 'w')) as merged_file: - writer.write(merged_file) - - for stream in streams: - stream.close() + merged_file_fd, merged_file_path = tempfile.mkstemp(suffix='.pdf', prefix='report.merged.tmp.') + with closing(os.fdopen(merged_file_fd, 'w')) as merged_file: + writer.write(merged_file) + finally: + for stream in streams: + try: + stream.close() + except Exception: + pass return merged_file_path