[packagekit] yum2 error fixes

Robin Norwood rnorwood at redhat.com
Fri Feb 15 07:23:03 PST 2008


On Thu, 14 Feb 2008 12:46:09 -0500
Robin Norwood <rnorwood at redhat.com> wrote:

> On Thu, 14 Feb 2008 07:41:37 +0000
> Richard Hughes <hughsient at gmail.com> wrote:
> 
> > In the yum2 backend we have loads of these:
> > 
> >             except yum.Errors.InstallError,e:
> >                 msgs = ';'.join(e)
> >                 self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,msgs)
> >                 self.Exit()
> > 
> > i.e. in an error, send error code, and exit the script.
> > 
> > What we probably need to do is:
> > 
> > Not fatal errors (i.e. the script can continue):
> > 
> >    self.ErrorCode(ERROR_PACKAGE_ALREADY_INSTALLED,"foo")
> >    self.Finished(EXIT_FAILED)
> >    return
> > 
> > and for fatal errors:
> > 
> >    self.ErrorCode(ERROR_INTERNAL_ERROR,"foo")
> >    self.Finished(EXIT_FAILED)
> >    self.Exit()
> > 
> > I think we are exiting quite a bit without needing to - and we
> > certainly need to send finished else bad things happen to the
> > daemon.
> 
> Yeah, I'll fix this today.  A result of me just copying the existing
> behavior wholesale.

Ok, these are fixed.

Now, the only time when we actually exit on error is when we catch an
exception and decide that the 'yum cache is invalid'.

         except yum.Errors.RepoError,e:
             self.ErrorCode(ERROR_NO_CACHE,"Yum cache is invalid")
             self.Finished(EXIT_FAILED)
             self.Exit()

We do this whenever we get a RepoError - a couple of questions for the
yum guys:

o Is 'yum cache invalid' a correct description for any RepoError, or
are there other error cases that throw RepoErrors?

o Is there anything we can do inside PK to recover from this?

o It looks like we wait 200 seconds to get a yum lock:

    def doLock(self):
        ''' Lock Yum'''
        retries = 0
        while not self.isLocked():
            try: # Try to lock yum
                self.yumbase.doLock( YUM_PID_FILE )
                PackageKitBaseBackend.doLock(self)
            except:
                if retries == 0:
                    self.StatusChanged(STATUS_WAIT)
                time.sleep(2)
                retries += 1
                if retries > 100:
                    self.ErrorCode(ERROR_INTERNAL_ERROR,'Yum is locked
by another application') self.Finished(EXIT_FAILED)
                    return

That seems a bit long to expect the user to wait.  Any objections to me
lowering the retry limit to, say 20?

Also, I ended up having to change the semantics of _runYumTransaction()
so that it returns False upon failure, and True upon success.  This is
because the old version called Exit() and killed the process.  I'm not
sure that this is particularly pythonic, so if anyone has a better
suggestion, have at it.

-RN

-- 
Robin Norwood
Red Hat, Inc.

"The Sage does nothing, yet nothing remains undone."
-Lao Tzu, Te Tao Ching



More information about the PackageKit mailing list