10avr. 2009

Emerge IOError: [Errno 21] Is a directory [sys-apps/portage]

J'ai procédé à un upgrade apparemment sans problème de sys-apps/portage-2.1.4.5 vers sys-apps/portage-2.1.6.7.

Finalement au bout de quelques jours j'ai eu besoin d'installer et de mettre à jour un paquet et c'est là que tout ce complique, la fameuse erreur IOError: [Errno 21] Is a directory est apparu.

raga ~ # emerge -av tcpdump
 
These are the packages that would be merged, in order:
 
Calculating dependencies
Traceback (most recent call last):
File "/usr/bin/emerge", line 40, in <module>
retval = _emerge.emerge_main()
File "//usr/lib/portage/pym/_emerge/__init__.py", line 14670, in emerge_main
myopts, myaction, myfiles, spinner)
File "//usr/lib/portage/pym/_emerge/__init__.py", line 13587, in action_build
mydepgraph = depgraph(settings, trees, myopts, myparams, spinner)
File "//usr/lib/portage/pym/_emerge/__init__.py", line 4373, in __init__
pkg_cache=self._pkg_cache)
File "//usr/lib/portage/pym/_emerge/__init__.py", line 1074, in __init__
real_dbapi.flush_cache()
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 368, in flush_cache
self._owners.populate() # index any unindexed contents
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 748, in populate
self._populate()
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 774, in _populate
owners_cache.add(cpv)
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 698, in add
contents = self._vardb._dblink(cpv).getcontents()
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 1162, in getcontents
myc = open(contents_file,"r")
IOError: [Errno 21] Is a directory

Cette erreur ne donnant rien de concret sur les moteurs de recherches, je me suis tourné vers le chan officiel Gentoo, un problème de compilation avec python a été évoqué, néanmoins je reste sceptique à cette hypothèse, en effet le portage recover en version 2.1.4.5 fonctionne parfaitement. Cependant en l'utilisant je reste limité à l'utilisation de paquet dans la branche EAPI=1.

Je me suis donc intéressé de plus près au fameux dossier /var/db/pkg contenant toutes les informations sur les paquets installés nécessaires à portage. Après suppression de ce dossier (un backup a été effectué), emerge a l'air de fonctionner néanmoins je ne valide pas l'installation du paquet.

En procédant par élimination (d'où l'intérêt du backup), je remonte jusqu'au dossier /var/db/pkg/sys-libs/timezone-data-2006a, après suppression de ce dernier et une réinstallation de sys-libs/timezone-data-2009b, tout fonctionne parfaitement.