[Yum] yumgroups failover patch

Jack Neely jjneely at pams.ncsu.edu
Sat Jun 21 19:32:36 UTC 2003


Folks,

Chatted with Seth and discoverd that handling the yumgroups.xml file was
a special case for the failover code.  Attached is a patch that I
*think* fixes the problem.  Hard to test for....Icon?

Jack
-- 
Jack Neely <slack at quackmaster.net>
Linux Realm Kit Administration and Development 
PAMS Computer Operations at NC State University
GPG Fingerprint: 1917 5AC1 E828 9337 7AA4  EA6B 213B 765F 3B6A 5B89
-------------- next part --------------
? archwork.pyc
? callback.pyc
? clientStuff.pyc
? comps.pyc
? config.pyc
? failover.pyc
? i18n.pyc
? keepalive.pyc
? logger.pyc
? nevral.pyc
? patch
? pkgaction.pyc
? rpmUtils.pyc
? urlgrabber.pyc
? yumcomps.pyc
? yumlock.pyc
? yummain.pyc
Index: clientStuff.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/clientStuff.py,v
retrieving revision 1.47.2.51
diff -u -r1.47.2.51 clientStuff.py
--- clientStuff.py	15 Jun 2003 17:52:25 -0000	1.47.2.51
+++ clientStuff.py	21 Jun 2003 19:28:13 -0000
@@ -600,7 +600,7 @@
         if not conf.cache:
             log(3, 'getting groups from server: %s' % serverid)
             try:
-                localgroupfile = grab(serverid, remotegroupfile, localgroupfile, copy_local=1)
+                localgroupfile = grab(serverid, remotegroupfile, localgroupfile, nofail=1, copy_local=1)
             except URLGrabError, e:
                 log(3, 'Error getting file %s' % remotegroupfile)
                 log(3, '%s' % e)
@@ -940,18 +940,25 @@
         size = size / 1000000000.0
         return "%.2f GB" % size
 
-def grab(serverID, url, filename=None, copy_local=0, close_connection=0,
+def grab(serverID, url, filename=None, nofail=0, copy_local=0, 
+          close_connection=0,
           progress_obj=None, throttle=None, bandwidth=None,
           numtries=3, retrycodes=[-1,2,4,5,6,7], checkfunc=None):
 
     """Wrap retry grab and add in failover stuff.  This needs access to
     the conf class as well as the serverID.
 
+    nofail -- Set to true to go through the failover object without
+       incrimenting the failures counter.  (Actually this just resets
+       the failures counter.)  Usefull in the yumgroups.xml special case.
+
     We do look at retrycodes here to see if we should return or failover.
     On fail we will raise the last exception that we got."""
 
     fc = conf.get_failClass(serverID)
     base = ''
+    findex = fc.get_index()
+    
     for root in conf.serverurl[serverID]:
         if string.find(url, root) == 0:
             # We found the current base this url is made of
@@ -965,6 +972,7 @@
     log(3, "failover: path = " + filepath)
 
     # don't trust the base that the user supplied
+    # this call will return the same thing as fc.get_serverurl(findex)
     base = fc.get_serverurl()
     while base != None:
         # Loop over baseURLs until one works or all are dead
@@ -979,8 +987,12 @@
         except URLGrabError, e:
             if e.errno in retrycodes:
                 errorlog(1, "retrygrab() failed for %s -- executing failover method" % base)
-                fc.server_failed()
-                base = fc.get_serverurl()
+                if nofail:
+                    findex = findex + 1
+                    base = fc.get_serverurl(findex)
+                else:
+                    fc.server_failed()
+                    base = fc.get_serverurl()
                 if base == None:
                     errorlog(1, "failover: out of servers to try")
                     raise
Index: failover.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/Attic/failover.py,v
retrieving revision 1.1.2.1
diff -u -r1.1.2.1 failover.py
--- failover.py	27 May 2003 17:32:21 -0000	1.1.2.1
+++ failover.py	21 Jun 2003 19:28:13 -0000
@@ -29,17 +29,33 @@
         self.serverID = serverID
         self.failures = 0
     
-    def get_serverurl(self):
-        "Returns a serverurl based on this failover method or None if complete failure."
+    def get_serverurl(self, i=None):
+        """Returns a serverurl based on this failover method or None 
+           if complete failure.  If i is given it is a direct index
+           to pull a server URL from instead of using the failures 
+           counter."""
         return None
         
     def server_failed(self):
         "Tells the failover method that the current server is failed."
         self.failures = self.failures + 1
         
-    def reset(self):
-        "Reset the failures counter."
-        self.failures = 0
+    def reset(self, i=0):
+        "Reset the failures counter to a given index."
+        self.failures = i
+
+    def get_index(self):
+        """Returns the current number of failures which is also the
+           index into the list this object represents.  ger_serverurl()
+           should always be used to translate an index into a URL
+           as this object may change how indexs map.  (See RoundRobin)"""
+
+        return self.failures
+   
+    def len(self):
+        """Returns the how many URLs we've got to cycle through."""
+
+        return len(self.conf.serverurl[self.serverID])
         
             
 
@@ -47,13 +63,18 @@
 
     """Chooses server based on the first success in the list."""
     
-    def get_serverurl(self):
+    def get_serverurl(self, i=None):
         "Returns a serverurl based on this failover method or None if complete failure."
         
-        if self.failures >= len(self.conf.serverurl[self.serverID]):
+        if i == None:
+            index = self.failures
+        else:
+            index = i
+        
+        if index >= len(self.conf.serverurl[self.serverID]):
             return None
         
-        return self.conf.serverurl[self.serverID][self.failures]
+        return self.conf.serverurl[self.serverID][index]
         
         
     
@@ -66,11 +87,18 @@
         random.seed()
         self.offset = random.randint(0, 37)
     
-    def get_serverurl(self):
+    def get_serverurl(self, i=None):
         "Returns a serverurl based on this failover method or None if complete failure."
+
+        if i == None:
+            index = self.failures
+        else:
+            index = i
         
-        if self.failures >= len(self.conf.serverurl[self.serverID]):
+        if index >= len(self.conf.serverurl[self.serverID]):
             return None
         
-        i = (self.failures + self.offset) % len(self.conf.serverurl[self.serverID])
-        return self.conf.serverurl[self.serverID][i]    
+        rr = (index + self.offset) % len(self.conf.serverurl[self.serverID])
+        return self.conf.serverurl[self.serverID][rr]   
+
+# SDG
Index: yummain.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yummain.py,v
retrieving revision 1.40.2.28
diff -u -r1.40.2.28 yummain.py
--- yummain.py	31 May 2003 16:30:01 -0000	1.40.2.28
+++ yummain.py	21 Jun 2003 19:28:13 -0000
@@ -332,4 +332,4 @@
     sys.exit(1)
     
 if __name__ == "__main__":
-    main()
+        main(sys.argv[1:])


More information about the Yum mailing list