[Yum-devel] [PATCH 2/4] use pipe instead of tempfiles.. ~5% speedup

Zdeněk Pavlas zpavlas at redhat.com
Fri Nov 23 15:28:17 UTC 2012


---
 createrepo/__init__.py |   45 ++++++++++++---------------------------------
 1 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/createrepo/__init__.py b/createrepo/__init__.py
index 167d384..622e442 100644
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -26,7 +26,6 @@ import tempfile
 import stat
 import fcntl
 import subprocess
-from select import select
 
 from yum import misc, Errors
 from yum.repoMDObject import RepoMD, RepoData
@@ -636,38 +635,30 @@ class MetaDataGenerator:
                 f.write('\n'.join(worker_chunks[worker_num]))
                 f.close()
                 
-                # make the worker directory
                 workercmdline = []
                 workercmdline.extend(base_worker_cmdline)
-                thisdir = self._worker_tmp_path + '/' + str(worker_num)
-                if checkAndMakeDir(thisdir):
-                    workercmdline.append('--tmpmdpath=%s' % thisdir)
-                else:
-                    raise MDError, "Unable to create worker path: %s" % thisdir
                 workercmdline.append('--pkglist=%s/pkglist-%s' % (self._worker_tmp_path, worker_num))
                 worker_cmd_dict[worker_num] = workercmdline
-            
-                
 
-            fds = {}
             for (num, cmdline) in worker_cmd_dict.items():
                 if not self.conf.quiet:
                     self.callback.log("Spawning worker %s with %s pkgs" % (num, 
                                                       len(worker_chunks[num])))
-                job = subprocess.Popen(cmdline, stdout=subprocess.PIPE,
-                                        stderr=subprocess.PIPE)
+                job = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
                 worker_jobs[num] = job
-                fds[job.stdout.fileno()] = num, job.stdout, self.callback.log
-                fds[job.stderr.fileno()] = num, job.stderr, self.callback.errorlog
             
-            while fds:
-                for fd in select(fds, [], [])[0]:
-                    num, stream, logger = fds[fd]
+            files = self.primaryfile, self.flfile, self.otherfile
+            for i, pkg in enumerate(pkgfiles):
+                num = i % self.conf.workers
+                stream = worker_jobs[num].stdout
+                while True:
                     line = stream.readline()
-                    if line == '':
-                        del fds[fd]
-                        continue
-                    logger('Worker %s: %s' % (num, line.rstrip()))
+                    if line.startswith('*** '): break
+                    self.callback.log('Worker %s: %s' % (num, line.rstrip()))
+
+                # save the output to local files
+                for out, size in zip(files, line[4:].split()):
+                    out.write(stream.read(int(size)))
 
             for (num, job) in worker_jobs.items():
                 if job.wait() != 0:
@@ -677,18 +668,6 @@ class MetaDataGenerator:
                     
             if not self.conf.quiet:
                 self.callback.log("Workers Finished")
-            # finished with workers
-            # go to their dirs and add the contents
-            if not self.conf.quiet:
-                self.callback.log("Gathering worker results")
-            for num in range(self.conf.workers):
-                for (fn, fo) in (('primary.xml', self.primaryfile), 
-                           ('filelists.xml', self.flfile),
-                           ('other.xml', self.otherfile)):
-                    fnpath = self._worker_tmp_path + '/' + str(num) + '/' + fn
-                    if os.path.exists(fnpath):
-                        fo.write(open(fnpath, 'r').read())
-
                     
             for pkgfile in pkgfiles:
                 if self.conf.deltas:
-- 
1.7.4.4



More information about the Yum-devel mailing list