fix u-m-d-l

Matt Domsch Matt_Domsch at dell.com
Sat Apr 25 05:16:55 UTC 2009


On Fri, Apr 24, 2009 at 11:59:14PM -0500, Matt Domsch wrote:
> --- update-master-directory-list	2009-04-07 03:53:55.000000000 +0000
> +++ /home/fedora/mdomsch/update-master-directory-list	2009-04-25 04:50:18.000000000 +0000
> @@ -168,8 +168,9 @@
>      
>  
>  def make_repomd_file_details(dir):
> -    repodataDir = dir.name + '/repodata'
> -    repomd_fname = os.path.join(rootdir, dir.name, 'repodata', 'repomd.xml')
> +    if not dir.name.endswith('/repodata'):
> +        return
> +    repomd_fname = os.path.join(rootdir, dir.name, 'repomd.xml')
>      if not os.path.exists(repomd_fname):
>          return
>      try:


Shortly after this hunk it was referencing the (now-deleted)
repodataDir value and crashed.  It doesn't need to do so anymore, so I
deleted that line.

Fixed patch below.

-- 
Matt Domsch
Linux Technology Strategist, Dell Office of the CTO
linux.dell.com & www.dell.com/linux

--- update-master-directory-list	2009-04-07 03:53:55.000000000 +0000
+++ /home/fedora/mdomsch/update-master-directory-list	2009-04-25 05:05:14.000000000 +0000
@@ -168,8 +168,9 @@ def make_file_details_from_checksums(dir
     
 
 def make_repomd_file_details(dir):
-    repodataDir = dir.name + '/repodata'
-    repomd_fname = os.path.join(rootdir, dir.name, 'repodata', 'repomd.xml')
+    if not dir.name.endswith('/repodata'):
+        return
+    repomd_fname = os.path.join(rootdir, dir.name, 'repomd.xml')
     if not os.path.exists(repomd_fname):
         return
     try:
@@ -188,7 +189,6 @@ def make_repomd_file_details(dir):
     if 'timestamp' not in yumrepo.__dict__:
         set_repomd_timestamp(yumrepo)
     timestamp = yumrepo.timestamp
-    dir = Directory.byName(repodataDir)
     try:
         fd = FileDetail.selectBy(directory=dir, filename='repomd.xml', sha1=sha1, md5=md5, sha256=sha256, sha512=sha512,
                                  timestamp=timestamp, size=size)[0]
@@ -267,7 +267,7 @@ def make_one_directory(line, category, p
         try:
             category_directories[parent_dname]['isRepository'] = True
         except KeyError:
-            category_directories[parent_dname] = {'files':{}, 'isRepository':True, 'readable':readable}
+            category_directories[parent_dname] = {'files':{}, 'isRepository':True, 'readable':readable, 'ctime':ctime}
             
     return dname, category_directories
 
@@ -328,16 +328,17 @@ def sync_category_directories(category, 
         except SQLObjectNotFound:
             dir = Directory(name=dirpath,readable=value['readable'], ctime=value['ctime'])
             dir.addCategory(category)
-        if dir.files != short_filelist(value['files']):
-            dir.files = short_filelist(value['files'])
+        if value['changed']:
+            if dir.files != short_filelist(value['files']):
+                dir.files = short_filelist(value['files'])
         make_file_details_from_checksums(dir)
 
     # this has to be a second pass to be sure the child repodata/ dir is created in the db first
     for dirpath, value in category_directories.iteritems():
+        dir = Directory.byName(dirpath)
         if value['isRepository']:
-            dir = Directory.byName(dirpath)
             make_repository(dir, category)
-            make_repomd_file_details(dir)
+        make_repomd_file_details(dir)
     ageFileDetails()
 
 def parse_rsync_listing(cname, f):
@@ -417,27 +418,31 @@ def sync_directories_from_directory(dire
         dname = dname.rstrip('/')
         try:
             d = Directory.byName(dname)
-            if d.ctime == ctime:
-                # break out here because nothing has changed
-                continue
+            d_ctime = d.ctime
         except SQLObjectNotFound:
             # we'll need to create it
-            pass
+            d_ctime = 0
 
-        print "%s has changed" % dname
         mode = s.st_mode
         readable = (mode & stat.S_IRWXO & (stat.S_IROTH|stat.S_IXOTH))
         if not readable:
             unreadable_dirs[dname] = True
         isRepo = 'repodata' in dirnames
-        category_directories[dname] = {'files':{}, 'isRepository':isRepo, 'readable':readable, 'ctime':ctime}
-        for f in filenames:
-            try:
-                s = os.stat(os.path.join(dirpath, f))
-            except OSError:
-                continue
-            category_directories[dname]['files'][f] = {'size':str(s.st_size),
-                                                       'stat':s[stat.ST_CTIME]}
+
+        changed = (d_ctime != ctime)
+        if changed:
+            print "%s has changed" % dname
+        category_directories[dname] = {'files':{}, 'isRepository':isRepo, 'readable':readable, 'ctime':ctime, 'changed':changed}
+
+        # skip per-file stat()s if the directory hasn't changed
+        if changed:
+            for f in filenames:
+                try:
+                    s = os.stat(os.path.join(dirpath, f))
+                except OSError:
+                    continue
+                category_directories[dname]['files'][f] = {'size':str(s.st_size),
+                                                           'stat':s[stat.ST_CTIME]}
 
     sync_category_directories(category, category_directories)
 
@@ -451,9 +456,9 @@ def main():
     if len(sys.argv) >= 3:
         rootdir=sys.argv[2]
 
-    if manage_pidfile(pidfile):
-        print "another instance is running, try again later."
-        sys.exit(1)
+#    if manage_pidfile(pidfile):
+#        print "another instance is running, try again later."
+#        sys.exit(1)
 
     for i in config.get('umdl.master_directories'):
         try:
@@ -471,7 +476,7 @@ def main():
             excludes = i.get('excludes', [])
             sync_directories_from_directory(i['path'], i['category'], excludes)
 
-    remove_pidfile(pidfile)
+#    remove_pidfile(pidfile)
     return 0
 
 if __name__ == "__main__":




More information about the infrastructure mailing list