When installing dev-db/mysql-5.0.90-r2, I get this error : ">>> Completed installing mysql-5.0.90-r2 into /var/tmp/portage/dev-db/mysql-5.0.90-r2/image/ [...] >>> Installing (1 of 1) dev-db/mysql-5.0.90-r2 Traceback (most recent call last): File "/usr/bin/emerge", line 42, in <module> retval = emerge_main() File "/usr/lib64/portage/pym/_emerge/main.py", line 1410, in emerge_main myopts, myaction, myfiles, spinner) File "/usr/lib64/portage/pym/_emerge/actions.py", line 434, in action_build retval = mergetask.merge() File "/usr/lib64/portage/pym/_emerge/Scheduler.py", line 914, in merge rval = self._merge() File "/usr/lib64/portage/pym/_emerge/Scheduler.py", line 1222, in _merge self._main_loop() File "/usr/lib64/portage/pym/_emerge/Scheduler.py", line 1362, in _main_loop self._poll_loop() File "/usr/lib64/portage/pym/_emerge/PollScheduler.py", line 134, in _poll_loop handler(f, event) File "/usr/lib64/portage/pym/_emerge/SpawnProcess.py", line 198, in _output_handler self._unregister_if_appropriate(event) File "/usr/lib64/portage/pym/_emerge/AbstractPollTask.py", line 27, in _unregister_if_appropriate self.wait() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 42, in wait self._wait_hook() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 115, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/portage/pym/_emerge/EbuildPhase.py", line 94, in _post_phase_exit self.wait() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 42, in wait self._wait_hook() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 115, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/portage/pym/_emerge/TaskSequence.py", line 44, in _task_exit_handler self.wait() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 42, in wait self._wait_hook() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 115, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/portage/pym/_emerge/CompositeTask.py", line 106, in _default_final_exit return self.wait() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 42, in wait self._wait_hook() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 115, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/portage/pym/_emerge/EbuildBuild.py", line 174, in _build_exit self.wait() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 42, in wait self._wait_hook() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 115, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/portage/pym/_emerge/CompositeTask.py", line 106, in _default_final_exit return self.wait() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 42, in wait self._wait_hook() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 115, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/portage/pym/_emerge/Scheduler.py", line 1201, in _build_exit self._schedule() File "/usr/lib64/portage/pym/_emerge/PollScheduler.py", line 43, in _schedule return self._schedule_tasks() File "/usr/lib64/portage/pym/_emerge/Scheduler.py", line 1391, in _schedule_tasks if q.schedule(): File "/usr/lib64/portage/pym/_emerge/SequentialTaskQueue.py", line 56, in schedule task.start() File "/usr/lib64/portage/pym/_emerge/AsynchronousTask.py", line 24, in start self._start() File "/usr/lib64/portage/pym/_emerge/PackageMerge.py", line 44, in _start self.returncode = self.merge.merge() File "/usr/lib64/portage/pym/_emerge/MergeListItem.py", line 148, in merge retval = self._install_task.install() File "/usr/lib64/portage/pym/_emerge/EbuildBuild.py", line 276, in install rval = merge.execute() File "/usr/lib64/portage/pym/_emerge/EbuildMerge.py", line 27, in execute blockers=self.find_blockers) File "/usr/lib64/portage/pym/portage/dbapi/vartree.py", line 3331, in merge mydbapi=mydbapi, prev_mtimes=prev_mtimes) File "/usr/lib64/portage/pym/portage/dbapi/vartree.py", line 3212, in merge mydbapi=mydbapi, prev_mtimes=prev_mtimes) File "/usr/lib64/portage/pym/portage/dbapi/vartree.py", line 3221, in _merge cleanup=cleanup, mydbapi=mydbapi, prev_mtimes=prev_mtimes) File "/usr/lib64/portage/pym/portage/dbapi/vartree.py", line 2355, in treewalk retval = self._security_check(others_in_slot) File "/usr/lib64/portage/pym/portage/dbapi/vartree.py", line 2169, in _security_check s = os.lstat(path) File "/usr/lib64/portage/pym/portage/__init__.py", line 228, in __call__ rval = self._func(*wrapped_args, **wrapped_kwargs) OSError: [Errno 40] Too many levels of symbolic links: '/var/lib/mysql/.keep_dev-db_mysql-0' I reinstalled portage a few times, but same error. Portage Installed version: 2.1.8.3 Python Installed version: 2.6.4-r1
This is a strange error, maybe due to filesystem corruption related to '/var/lib/mysql/.keep_dev-db_mysql-0'. Is that file or any of it's parent directories a symlink? Please post the output for these commands: ls -ld /var ls -ld /var/lib ls -ld /var/lib/mysql ls -ld /var/lib/mysql/.keep_dev-db_mysql-0
Thank you Zac, you're right I had forgotten the symlink I made here: # ls -ld /var/lib/mysql lrwxrwxrwx 1 root root 5 Mar 7 08:32 /var/lib/mysql -> mysql # ls -l /var/lib/mysql/ ls: cannot access /var/lib/mysql/: Too many levels of symbolic links It's an old symlink I don't use anymore. My mysql datadir is somewhere else. So all should be fine. Thanks again!
probably not backtracing would still be nice
It seems like it might be difficult to handle Errno 40 since it could be triggered in many different places. It might not be worth the effort to try to avoid a traceback.
It's not possible in Python to catch any error and print some nice Portage-originated error header with the message and or additional information where it occurred? Maybe dumping the backtrace in some file for post analysis? Always looks more polished than a raw backtrace. But I agree, it's only cosmetics.
Yeah, I guess we could add a blanket Errno 40 exception handler for all the merge code and have it display an eerror message like "you need to check this path and its parents for circular symbolic links" before bails out from the merge. It could then continue on with other merges if you have --keep-going enabled.
Created attachment 380336 [details] build.log I encountered this problem after timezone-data failed to emerge in bug 487192. I was left with the symlinks posix -> .gentoo-upgrade and .gentoo-upgrade -> .gentoo-upgrade in /usr/share/zoneinfo/ which caused all subsequent attempts to install timezone-data to fail with "[Errno 40] Too many levels of symbolic links: '/usr/share/zoneinfo/posix/Asia/Thimbu'"