Merge lp:~cjwatson/launchpad/ptuj-via-disk into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 18586
Proposed branch: lp:~cjwatson/launchpad/ptuj-via-disk
Merge into: lp:launchpad
Diff against target: 59 lines (+22/-10)
1 file modified
lib/lp/soyuz/model/packagetranslationsuploadjob.py (+22/-10)
To merge this branch: bzr merge lp:~cjwatson/launchpad/ptuj-via-disk
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+338894@code.launchpad.net

Commit message

Make PackageTranslationsUploadJob download librarian files to disk rather than memory.

Description of the change

This seems like a better idea for files that are potentially hundreds of megabytes (hi, LibreOffice). I suspect that the gzip module will still buffer in memory, but this is a start.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/soyuz/model/packagetranslationsuploadjob.py'
2--- lib/lp/soyuz/model/packagetranslationsuploadjob.py 2018-02-22 14:06:35 +0000
3+++ lib/lp/soyuz/model/packagetranslationsuploadjob.py 2018-03-26 09:24:08 +0000
4@@ -9,6 +9,8 @@
5 ]
6
7 import json
8+import os
9+import tempfile
10
11 from lazr.delegates import delegate_to
12 from zope.component import getUtility
13@@ -28,6 +30,7 @@
14 )
15 from lp.services.job.runner import BaseRunnableJob
16 from lp.services.librarian.interfaces import ILibraryFileAliasSet
17+from lp.services.librarian.utils import filechunks
18 from lp.services.mail.sendmail import format_address_for_person
19 from lp.soyuz.interfaces.packagetranslationsuploadjob import (
20 IPackageTranslationsUploadJob,
21@@ -149,19 +152,28 @@
22 def attachTranslationFiles(self, by_maintainer):
23 distroseries = self.distroseries
24 sourcepackagename = self.sourcepackagename
25+ libraryfilealias = self.libraryfilealias
26 only_templates = distroseries.getSourcePackage(
27 sourcepackagename).has_sharing_translation_templates
28 importer = self.requester
29- tarball = self.libraryfilealias.read()
30-
31- queue = getUtility(ITranslationImportQueue)
32-
33- queue.addOrUpdateEntriesFromTarball(
34- tarball, by_maintainer, importer,
35- sourcepackagename=sourcepackagename,
36- distroseries=distroseries,
37- filename_filter=_filter_ubuntu_translation_file,
38- only_templates=only_templates)
39+ with tempfile.NamedTemporaryFile(
40+ prefix='package-translations-upload-job-') as tarball:
41+ libraryfilealias.open()
42+ try:
43+ for chunk in filechunks(self.libraryfilealias):
44+ tarball.write(chunk)
45+ finally:
46+ libraryfilealias.close()
47+ tarball.seek(0, os.SEEK_SET)
48+
49+ queue = getUtility(ITranslationImportQueue)
50+
51+ queue.addOrUpdateEntriesFromTarball(
52+ tarball, by_maintainer, importer,
53+ sourcepackagename=sourcepackagename,
54+ distroseries=distroseries,
55+ filename_filter=_filter_ubuntu_translation_file,
56+ only_templates=only_templates)
57
58 def run(self):
59 self.attachTranslationFiles(True)