Historical bug tracker for the Pacman package manager.
The pacman bug tracker has moved to gitlab:
https://gitlab.archlinux.org/pacman/pacman/-/issues
This tracker remains open for interaction with historical bugs during the transition period. Any new bugs reports will be closed without further action.
The pacman bug tracker has moved to gitlab:
https://gitlab.archlinux.org/pacman/pacman/-/issues
This tracker remains open for interaction with historical bugs during the transition period. Any new bugs reports will be closed without further action.
FS#50298 - /var/cache being symlink causes /var/cache/pacman to "disappear" mid upgrade
Attached to Project:
Pacman
Opened by Ralph Corderoy (RalphCorderoy) - Sunday, 07 August 2016, 12:06 GMT
Last edited by Allan McRae (Allan) - Friday, 23 December 2022, 13:32 GMT
Opened by Ralph Corderoy (RalphCorderoy) - Sunday, 07 August 2016, 12:06 GMT
Last edited by Allan McRae (Allan) - Friday, 23 December 2022, 13:32 GMT
|
Detailspacman 5.0.1-4. I've two filesystems, / and /home. Overnight recently, a download-only of packages filled / so I created /home/var-cache, moved /var/cache's contents there, and made a /var/cache be a symlink. Everything continued working fine, including non-pacman users of /var/cache. The next evening, last night, four packages were downloaded into /home filesystem:
:: Retrieving packages... downloading fakeroot-1.21-2-x86_64.pkg.tar.xz... downloading fontconfig-2.12.1-3-x86_64.pkg.tar.xz... downloading mesa-12.0.1-6-x86_64.pkg.tar.xz... downloading python-setuptools-1:25.1.6-1-any.pkg.tar.xz... The problem appeared when I tried to install these: $ sudo -i pacman -Su [sudo] password for ralph: :: Starting full system upgrade... resolving dependencies... looking for conflicting packages... Packages (4) fakeroot-1.21-2 fontconfig-2.12.1-3 mesa-12.0.1-6 python-setuptools-1:25.1.6-1 Total Installed Size: 39.16 MiB Net Upgrade Size: -0.10 MiB :: Proceed with installation? [Y/n] (4/4) checking keys in keyring [######################] 100% (4/4) checking package integrity [######################] 100% (4/4) loading package files [######################] 100% (4/4) checking for file conflicts [######################] 100% (4/4) checking available disk space [######################] 100% :: Processing package changes... (1/4) upgrading fakeroot [######################] 100% error: cannot remove /var/cache/ (Not a directory) (2/4) upgrading fontconfig [######################] 100% updating font cache... done. error: could not open file /var/cache/pacman/pkg/mesa-12.0.1-6-x86_64.pkg.tar.xz: No such file or directory error: could not commit transaction error: failed to commit transaction (transaction aborted) Errors occurred, no packages were upgraded. $ The log file says: [2016-08-07 10:57] [PACMAN] Running 'pacman -Su' [2016-08-07 10:57] [PACMAN] starting full system upgrade [2016-08-07 10:58] [ALPM] transaction started [2016-08-07 10:58] [ALPM] upgraded fakeroot (1.21-1 -> 1.21-2) [2016-08-07 10:58] [ALPM] error: cannot remove /var/cache/ (Not a directory) [2016-08-07 10:58] [ALPM] upgraded fontconfig (2.12.1-1 -> 2.12.1-3) [2016-08-07 10:58] [ALPM-SCRIPTLET] updating font cache... done. [2016-08-07 10:58] [ALPM] transaction failed It's the aftermath that's odd, and left me with broken packages. /var/cache had been removed by something, despite the "cannot remove" above, and re-created as a directory. In it was just the fontconfig directory, containing a few files that were already in the "real" version sitting in /home. This mean /var/cache/pacman "disappeared" mid upgrade as far as pacman was concerned. /var/lib/pacman/local/mesa-12.0.1-6/ was left with no files, though `pacman -Q mesa' said it was the installed version. Attempting `pacman -Su' detected this: :: Starting full system upgrade... resolving dependencies... error: could not open file /var/lib/pacman/local/mesa-12.0.1-6/desc: No such file or directory looking for conflicting packages... Packages (1) python-setuptools-1:25.1.6-1 That only one package is left suggests it thinks the other three installed OK. `pacman -Qk' only complained about mesa. At this point, trying to do things to investigate was hampered, e.g. error while loading shared libraries: libEGL.so.1: cannot open shared object file: No such file or directory I resolved the problem by -Rdd mesa, followed by -S mesa. -Qk then complained about problems with nvidia-304xx-libgl so that was -S too. -qQkk's is now as expected. Several thoughts... The symlink shouldn't be removed, especially as it wasn't /var/cache/pacman but the directory above. The error during fakeroot's upgrade, 1/4, didn't stop /var/cache being mkdir'd and /var/cache/fontconfig, 2/4 from being created. The disappearance of /var/cache/pacman during the upgrade caused mesa, 3/4, to have no files in /var/lib/pacman/local/mesa-12.0.1-6. The Linux FHS says "The application must always be able to recover from manual deletion of these files (generally because of a disk space shortage)." — http://www.pathname.com/fhs/pub/fhs-2.3.html#VARCACHEAPPLICATIONCACHEDATA To me, that includes during an upgrade! :-) If it needs them to persist then perhaps they should be sat elsewhere. |
This task depends upon
Closed by Allan McRae (Allan)
Friday, 23 December 2022, 13:32 GMT
Reason for closing: Deferred
Additional comments about closing: Bug transferred to gitlab:
https://gitlab.archlinux.org/pacman/pacm an/-/issues/5
Friday, 23 December 2022, 13:32 GMT
Reason for closing: Deferred
Additional comments about closing: Bug transferred to gitlab:
https://gitlab.archlinux.org/pacman/pacm an/-/issues/5
FS#58804, pacman should be taught to abort with a file conflict error, when it detects that a package upgrade will overwrite an on-disk symlink with a directory.Second, Ralph has a good point IMO. pacman could gain from holding open an fd for each package archive it is preparing to to upgrade, thus ensuring that a cached file which disappears from disk mid-transaction does not result in aborting the transaction halfway through. This is actually independent of the cachedir, because it applies to -U operations as well, for example.
I think this latter case is something we should put on the TODO list to try to fix.