Make all portage access from one thread/process

Bug #564292 reported by René 'Necoro' Neumann on 2010-04-15
This bug affects 1 person
Affects Status Importance Assigned to Milestone

Bug Description

Currently portato uses several threads to access portage. This won't work with its sqlite cache backend ... and isn't supported either.

<zmedico> Necoro: hmm, I guess you need to do all your portage api access in a single thread. it's never been thread safe.

Here is an sql exception:

Exception in thread "Show Updates Thread":
Traceback (most recent call last):
  File "/usr/lib64/python2.6/site-packages/portato/gui/", line 40, in run
  File "/usr/lib64/python2.6/", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.6/site-packages/portato/gui/windows/", line 1685, in __update
  File "/usr/lib64/python2.6/site-packages/portato/gui/windows/", line 1700, in <lambda>
    lambda: (x.get_cpv() for x in system.get_updated_packages()),
  File "/usr/lib64/python2.6/site-packages/portato/backend/portage/", line 301, in get_updated_packages
    packages = self.get_new_packages(self.find_packages(pkgSet = self.SET_INSTALLED, with_version = False))
  File "/usr/lib64/python2.6/site-packages/portato/backend/portage/", line 275, in get_new_packages
    inst = self.find_packages(p, self.SET_INSTALLED)
  File "/usr/lib64/python2.6/site-packages/portato/backend/portage/", line 231, in find_packages
    return self.geneticize_list(self._get_set(pkgSet).find(key, masked, with_version, only_cpv), only_cpv or not with_version)
  File "/usr/lib64/python2.6/site-packages/portato/backend/portage/", line 187, in geneticize_list
    return [self.new_package(x) for x in list_of_packages]
  File "/usr/lib64/python2.6/site-packages/portato/backend/portage/", line 68, in new_package
    return PortagePackage(cpv)
  File "/usr/lib64/python2.6/site-packages/portato/backend/portage/", line 54, in __init__
    self._status = portage.getmaskingstatus(self.get_cpv(), settings = self._settings.settings)
  File "/usr/lib64/portage/pym/portage/package/ebuild/", line 40, in getmaskingstatus
    metadata = dict(zip(db_keys, portdb.aux_get(mycpv, db_keys)))
  File "/usr/lib64/portage/pym/portage/dbapi/", line 663, in aux_get
    mydata, st, emtime = self._pull_valid_cache(mycpv, myebuild, mylocation)
  File "/usr/lib64/portage/pym/portage/dbapi/", line 608, in _pull_valid_cache
    metadata = auxdb[cpv]
  File "/usr/lib64/portage/pym/portage/cache/", line 42, in __getitem__
  File "/usr/lib64/portage/pym/portage/cache/", line 162, in _getitem
ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 139805472351984 and this is thread id 139805080684816

Portato version: 0.14_alpha (git: 9f720636bbe5db2e0d21fe580357b92e65d7f269)
System: Gentoo
Python version: 2.6.4 (r264:75706, Mar 10 2010, 03:10:05)
[GCC 4.3.4]
Used backend: Portage
Used database type: sql
pygtk: 2.16.0 (using GTK+: 2.18.7)
pygobject: 2.18.0 (using GLib: 2.22.4)

Changed in portato:
importance: Undecided → Low
status: New → Confirmed
René 'Necoro' Neumann (necoro) wrote :

For the moment, sqlite backend of portage will make portato bail out in master and 0.14

To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers