seth vidal wrote:
Hey,
 I was putting together a plugin[1] for something jesse did when I
noticed that the particular plugin was taking MINUTES to run. And
considering how little the plugin does - that seemed silly.

so after a little bit of notice - I looked at plugins.py

in the delPackage() method in MainPluginConduit. It calls:
        self._base.pkgSack.delPackage(po)

b/c of all the functions we end up calling when we call delPackage() on
the MetaSack  it takes very long (1-2 seconds per package)

the way around this is to call the delPackage() routine per-sack,
alternatively to call it like this:

po.repo.sack.delPackage(po) (yes, that looks as silly to me, too)

but it gets WAY faster when you do it that way. Anyway there are a
couple of things we can do to fix this:

1. patch plugins.py to call the above when 'delPackage() is called. -
this is easy, it doesn't break api and it kinda makes sense
2. add a method exclude() to YumAvailablePackage that will call
self.repo.sack.delPackage(self) on itself. This seems like a good thing
for later anyway - but we can't expect things to use this method right
now.
3. patch all the plugins to step around this manually (ick)

Anyone have a preference?

I personally like 1 & 2.
1, Make a lot of sense and it will make other excluding plugins faster to.
2, Make also a lot of sense, it will be logical, if the package object know how to exclude itself.

So i think that both 1 & 2, is the way to go.
Alternatively, if there is something I've missed on why
pkgSack.delPackage() takes so long - let me know.
I have tried to track it down and i get a little confused, it look like the conduit.delPackges ends up calling

po.repo.sack.delPackage(po)

conduit.delPackage(po)
-> self._base.pkgSack.delPackage(po) = MetaSack.delPackage (self._base.pkgSack = self._base._pkgSack = self._base.repos.pkgSack = MetaSack()) -> po.repo.sack.delPackage(po) = YumSqlitePackageSack.delPackage (po.repo.sack = YumSqlitePackageSack() )
      ->  def delPackage(self, obj):
               if not self.excludes.has_key(obj.repo):
                  self.excludes[obj.repo] = {}
               self.excludes[obj.repo][obj.pkgId] = 1
               self.pkglist = None


I took a look a the change history for MetaSack, it look like it have be fixed a earlier this year.
http://devel.linux.duke.edu/gitweb/?p=yum.git;a=history;f=yum/packageSack.py;h=fce183f6a3450d0bb9f3627607cee5064eb0d20d;hb=HEAD

So now i totally confused, please enligthen me :)

Tim
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to