Bug 37531 - Не работает apt-get update после выполнения apt-cdrom add
Summary: Не работает apt-get update после выполнения apt-cdrom add
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: apt (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Ivan Zakharyaschev
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-11-22 20:54 MSK by obirvalger@altlinux.org
Modified: 2020-09-21 17:57 MSK (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description obirvalger@altlinux.org 2019-11-22 20:54:11 MSK
После выполнения apt-cdrom add при выполнении команды apt-get update возникает ошибка:
"E: The package lists or status file could not be parsed or opened."

Это появилось в версии alt70 пакета apt, а в alt69 работает.

Образ для тестирования apt-cdrom add взят из: https://lists.altlinux.org/pipermail/sisyphus/2019-November/368245.html

APT::Cache-Start и APT::Cache-Limit не влияют на результат (ошибку):

# rpm --rebuilddb && apt-get -o APT::Cache-Start=$(( (1024 + 512 + 256 + 128 +64 +32 +16 +8 +4 +2 +1) * 1024 * 1024 )) update
Get:1 http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64 release [1189B]
Fetched 1189B in 0s (13.6kB/s)
Hit http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64/task pkglist
Hit http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64/task release
Reading Package Lists... Done
E: The package lists or status file could not be parsed or opened.

# apt-get -o APT::Cache-Limit=$(( 2 * 1024 * 1024 * 1024 )) update                                                                 
Get:1 http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64 release [1189B]                                                     
Fetched 1189B in 0s (13.0kB/s)                                                                                                                     
Hit http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64/task pkglist                                                          
Hit http://git.altlinux.org APT::Cache-Starttasks/archive/done/_231/236755/build/repo/x86_64/task release                                                          
Reading Package Lists... Done
E: The package lists or status file could not be parsed or opened.
Comment 1 Ivan Zakharyaschev 2019-11-24 04:14:50 MSK
(In reply to comment #0)
> После выполнения apt-cdrom add при выполнении команды apt-get update возникает
> ошибка:
> "E: The package lists or status file could not be parsed or opened."
> 
> Это появилось в версии alt70 пакета apt, а в alt69 работает.
> 
> Образ для тестирования apt-cdrom add взят из:
> https://lists.altlinux.org/pipermail/sisyphus/2019-November/368245.html
> 
> APT::Cache-Start и APT::Cache-Limit не влияют на результат (ошибку):
> 
> # rpm --rebuilddb && apt-get -o APT::Cache-Start=$(( (1024 + 512 + 256 + 128
> +64 +32 +16 +8 +4 +2 +1) * 1024 * 1024 )) update
> Get:1 http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64
> release [1189B]
> Fetched 1189B in 0s (13.6kB/s)
> Hit http://git.altlinux.org
> tasks/archive/done/_231/236755/build/repo/x86_64/task pkglist
> Hit http://git.altlinux.org
> tasks/archive/done/_231/236755/build/repo/x86_64/task release
> Reading Package Lists... Done
> E: The package lists or status file could not be parsed or opened.
> 
> # apt-get -o APT::Cache-Limit=$(( 2 * 1024 * 1024 * 1024 )) update              
> Get:1 http://git.altlinux.org tasks/archive/done/_231/236755/build/repo/x86_64
> release [1189B]                                                     
> Fetched 1189B in 0s (13.0kB/s)                                                  
> Hit http://git.altlinux.org
> tasks/archive/done/_231/236755/build/repo/x86_64/task pkglist                   
> Hit http://git.altlinux.org
> APT::Cache-Starttasks/archive/done/_231/236755/build/repo/x86_64/task release   
> Reading Package Lists... Done
> E: The package lists or status file could not be parsed or opened.

Тут что-то не то вставилось во втором примере.

Насколько я помню, разница между двумя примерами была в том, что в одном случае случается ошибка

E: The package lists or status file could not be parsed or opened.

а в другом -- segfault (когда слишком много для твоей виртуалки памяти запрашивается).

Но segfault не видно в процитированном. (там ещё база данных rpm портилась, после чего приходилось делать rpm --rebuilddb).

Я заинтересовался отдельно случаем segfault при запросе большого количества памяти, но не смог у себя воспроизвести.

Как у тебя это происходит в точности?

Вот, например, что я могу наблюдать:

[root@prodesk /]# sh -c 'ulimit -v $(( 512 * 1024 )); rpm --rebuilddb && rm -fv /var/cache/apt/*.bin && apt-get -o APT::Cache-Start=$(( 2 * 1024 * 1024 * 1024 )) -o Debug::DynamicMMap::Grow=yes update'
removed '/var/cache/apt/pkgcache.bin'
removed '/var/cache/apt/srcpkgcache.bin'
Reading Package Lists... Error!
E: Unable to seek to 18446744071562067968
W: Unable to munmap
E: The package lists or status file could not be parsed or opened.
[root@prodesk /]# sh -c 'ulimit -v $(( 512 * 1024 )); rpm --rebuilddb && rm -fv /var/cache/apt/*.bin && apt-get -o APT::Cache-Start=$(( 1 * 1024 * 1024 * 1024 )) -o Debug::DynamicMMap::Grow=yes update'
removed '/var/cache/apt/pkgcache.bin'
Reading Package Lists... Error!
E: Couldn't make mmap of 1073741825 bytes - mmap (12 Cannot allocate memory)
E: The package lists or status file could not be parsed or opened.
[root@prodesk /]# df /var/
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/lx8-var   20G   12G  6,8G  63% /var
[root@prodesk /]# sh -c 'rpm --rebuilddb && rm -fv /var/cache/apt/*.bin && apt-get -o APT::Cache-Start=$(( 2 * 1024 * 1024 * 1024 )) -o Debug::DynamicMMap::Grow=yes update'
removed '/var/cache/apt/pkgcache.bin'
removed '/var/cache/apt/srcpkgcache.bin'
Reading Package Lists... Error!
E: Unable to seek to 18446744071562067968
W: Unable to munmap
E: The package lists or status file could not be parsed or opened.
[root@prodesk /]# sh -c 'rpm --rebuilddb && rm -fv /var/cache/apt/*.bin && apt-get -o APT::Cache-Start=$(( 1 * 1024 * 1024 * 1024 )) -o Debug::DynamicMMap::Grow=yes update'
removed '/var/cache/apt/pkgcache.bin'
Reading Package Lists... Done
Building Dependency Tree... Done
[root@prodesk /]# rpm -q apt
apt-0.5.15lorg2-alt71.x86_64
[root@prodesk /]#
Comment 2 Ivan Zakharyaschev 2019-11-24 05:54:11 MSK
По сути этой ошибки -- я могу у себя на другой системе вопроизвести, например, с образом server:

[root@prodesk /]# tail -1 /etc/fstab
/altspace/iso/9/alt-server-9.0-x86_64.iso       /media/ALTLinux auto    defaults
[root@prodesk /]# apt-cdrom add 
Using Media mount point /media/ALTLinux/
Unmounting Media
Please insert a Media and press enter 
Mounting Media
Identifying.. [96cd86323c5d47f02528857ebba119b8-2]
Scanning Media for index files..  Found 1 package indexes and 0 source indexes.
Found label 'ALT Server 9.0 x86_64 build 2019-10-23'
This Media is called:
 'ALT Server 9.0 x86_64 build 2019-10-23'
Reading Indexes... Done
Writing new source list
Source List entries for this Media are:
rpm cdrom:[ALT Server 9.0 x86_64 build 2019-10-23]/ ALTLinux main
Repeat this process for the rest of the Media in your set.
[root@prodesk /]# apt-get update
Reading Package Lists... Done      
E: The package lists or status file could not be parsed or opened.
[root@prodesk /]#
Comment 3 obirvalger@altlinux.org 2019-11-25 17:25:45 MSK
У меня segfault больше не воспроизводится.
Comment 4 Aleksei Nikiforov 2019-12-03 11:52:35 MSK
Проблема воспроизвелась тоже.

Прогнал git bisect, вот результат:

667677a7d268aaf0f84ce3bc0567c5350db20ec6 is the first bad commit
commit 667677a7d268aaf0f84ce3bc0567c5350db20ec6
Author: Aleksei Nikiforov <darktemplar@altlinux.org>
Date:   Thu Jun 13 12:35:49 2019 +0300

    Use special type to return allocation failure since 0 is a valid offset value

 apt.spec                         |   2 +-
 apt/apt-pkg/contrib/mmap.cc      |  33 ++++++------
 apt/apt-pkg/contrib/mmap.h       |   9 ++--
 apt/apt-pkg/pkgcachegen.cc       | 111 ++++++++++++++++++++++-----------------
 apt/apt-pkg/pkgcachegen.h        |  23 ++++----
 apt/apt-pkg/rpm/rpmindexfile.cc  |   4 +-
 apt/apt-pkg/rpm/rpmlistparser.cc |  78 ++++++++++++++++++++++-----
 apt/apt-pkg/rpm/rpmlistparser.h  |   3 +-
 8 files changed, 168 insertions(+), 95 deletions(-)

В данном коммите была улучшена обработка ошибок, что привело к выявлению ранее игнорируемой проблемы. Было обнаружено что apt-cdrom не копирует файлы release и release.$component, т.е. эти файлы фактически тихо игнорируются.

Вот файлы в примонтированном образе:

$ ls -la /media/ALTLinux/ALTLinux/base/*
-r--r--r-- 1 root root 3232236 окт 22 15:28 /media/ALTLinux/ALTLinux/base/pkglist.main.bz2
-r--r--r-- 1 root root 2943976 окт 22 15:28 /media/ALTLinux/ALTLinux/base/pkglist.main.xz
-r--r--r-- 1 root root     421 окт 22 15:28 /media/ALTLinux/ALTLinux/base/release
-r--r--r-- 1 root root     123 окт 22 15:28 /media/ALTLinux/ALTLinux/base/release.main

А вот файлы, скопированные через apt-cdrom:

$ ls -la /var/lib/apt/lists/*_ALTLinux_base_*
-rw-r--r-- 1 root root 7659681 дек  2 18:11 /var/lib/apt/lists/ALT%20Workstation%209.0%20x86%5f64%20build%202019-10-22_ALTLinux_base_pkglist.main
-rw-r--r-- 1 root root       0 дек  2 18:11 /var/lib/apt/lists/ALT%20Workstation%209.0%20x86%5f64%20build%202019-10-22_ALTLinux_base_release
-rw-r--r-- 1 root root       0 дек  2 18:11 /var/lib/apt/lists/ALT%20Workstation%209.0%20x86%5f64%20build%202019-10-22_ALTLinux_base_release.main

Можно заметить, что скопированные release и release.main пусты, хотя pkglist.main успешно распакован, а на образе эти файлы не пустые.

Фикс готов, сделал новый релиз с ним. После установки фикса необходимо будет заново запустить apt-cdrom add для всех дисков.

http://git.altlinux.org/people/darktemplar/packages/?p=apt.git;a=commitdiff;h=0112422491945ac78e58105b8bf3126ef3ddd38a

Ждите аппрува от мейнтейнеров пакета.
Comment 5 Repository Robot 2020-09-21 17:57:07 MSK
apt-0.5.15lorg2-alt71.3 -> sisyphus:

 Mon Sep 21 2020 Ivan Zakharyaschev <imz@altlinux> 0.5.15lorg2-alt71.3
 - Fixed copying release information from cdrom (thx Aleksei Nikiforov).
   (Closes: #37531)