[devel] I: rpm in p8 had problems reading *.rpm files

Ivan Zakharyaschev imz на altlinux.org
Чт Июл 11 18:00:03 MSK 2019


Здравствуйте!

Из отдела тестирования сообщили, что в Workstation 8.2 i586 наблюдаются 
проблемы при чтении пакетов из репозитория p8, смонтированного по NFS.

# /usr/lib/rpm/rpmq -q -i --list --verbose --package -q --qf "[* %{CHANGELOGNAME}\n %{CHANGELOGTEXT}\n]" /mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm
ошибка: ошибка запроса /mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm

С обновлённым rpm-4.0.4-alt101.M80P.5.5 такой проблемы нет.

Я примерно понял, какой код там выполняется, а какой с обновлённым rpm, 
когда ошибки нет. (Они идут разным путём.)

Когда ошибка случается, вывод strace -fy -s1000 перед этим такой:

open("/mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm", 
O_RDONLY) = 
3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>
fcntl64(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
F_SETFD, FD_CLOEXEC) = 0
gettimeofday({tv_sec=1562834023, tv_usec=224425}, NULL) = 0
fstat64(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
{st_mode=S_IFREG|0644, st_size=122129, ...}) = 0
_newselect(4, 
[3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {tv_sec=1, tv_usec=0}) = 1 (in [3], left {tv_sec=0, 
tv_usec=999999})
gettimeofday({tv_sec=1562834023, tv_usec=224634}, NULL) = 0
read(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\355\253\356\333\3\0\0\0\0\1sssd-ad-1.16.4-alt1.M80P.1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 
96) = 96
gettimeofday({tv_sec=1562834023, tv_usec=224766}, NULL) = 0
_newselect(4, 
[3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {tv_sec=1, tv_usec=0}) = 1 (in [3], left {tv_sec=0, 
tv_usec=999999})
gettimeofday({tv_sec=1562834023, tv_usec=224870}, NULL) = 0
read(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\216\255\350\1\0\0\0\0\0\0\0\5\0\0\0\230", 16) = 16
gettimeofday({tv_sec=1562834023, tv_usec=224953}, NULL) = 0
_newselect(4, 
[3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {tv_sec=1, tv_usec=0}) = 1 (in [3], left {tv_sec=0, 
tv_usec=999999})
gettimeofday({tv_sec=1562834023, tv_usec=225069}, NULL) = 0
read(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\0\0\0>\0\0\0\7\0\0\0\210\0\0\0\20\0\0\1\r\0\0\0\6\0\0\0\0\0\0\0\1\0\0\3\350\0\0\0\4\0\0\0,\0\0\0\1\0\0\3\354\0\0\0\7\0\0\0000\0\0\0\20\0\0\3\355\0\0\0\7\0\0\0@\0\0\0H7ce3371ed3cb8e8bcea5a341a029ac364173f7ab\0\0\0\0\0\1\333\271\271v\nq\244\1\271&VY\242\257RH\260\220\210F\4\0\21\2\0\6\5\2]\33\225b\0\n\t\20\334\236\225\302#\21\24\263GF\0\237`,L\375\226t\370s\35\206\202\"\265k\364s:\206\v\31\0\240\256VMa\356w*M\352\36\374!Z^J\277\16\356\256?\0\0\0>\0\0\0\7\377\377\377\260\0\0\0\20", 
232) = 232
gettimeofday({tv_sec=1562834023, tv_usec=225146}, NULL) = 0
fstat64(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
{st_mode=S_IFREG|0644, st_size=122129, ...}) = 0
gettimeofday({tv_sec=1562834023, tv_usec=225226}, NULL) = 0
close(3</mnt/repo-nhcR/pub/distributions/ALTLinux/p8/branch/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>) 
= 0

Когда ошибки нет, аналогичный кусок у меня (правда, на x86_64) такой:

215253 open("/ALT/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm", 
O_RDONLY) = 
3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>
215253 
fcntl(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
F_SETFD, FD_CLOEXEC) = 0
215253 
fstat(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
{st_mode=S_IFREG|0644, st_size=122129, ...}) = 0
215253 
fadvise64(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
0, 0, POSIX_FADV_RANDOM) = 0
215253 select(4, 
[3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {1, 0}) = 1 (in [3], left {0, 999998})
215253 
read(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\355\253\356\333\3\0\0\0\0\1sssd-ad-1.16.4-alt1.M80P.1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 
96) = 96
215253 select(4, 
[3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {1, 0}) = 1 (in [3], left {0, 999998})
215253 
read(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\216\255\350\1\0\0\0\0\0\0\0\5\0\0\0\230", 16) = 16
215253 select(4, 
[3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {1, 0}) = 1 (in [3], left {0, 999998})
215253 
read(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\0\0\0>\0\0\0\7\0\0\0\210\0\0\0\20\0\0\1\r\0\0\0\6\0\0\0\0\0\0\0\1\0\0\3\350\0\0\0\4\0\0\0,\0\0\0\1\0\0\3\354\0\0\0\7\0\0\0000\0\0\0\20\0\0\3\355\0\0\0\7\0\0\0@\0\0\0H7ce3371ed3cb8e8bcea5a341a029ac364173f7ab\0\0\0\0\0\1\333\271\271v\nq\244\1\271&VY\242\257RH\260\220\210F\4\0\21\2\0\6\5\2]\33\225b\0\n\t\20\334\236\225\302#\21\24\263GF\0\237`,L\375\226t\370s\35\206\202\"\265k\364s:\206\v\31\0\240\256VMa\356w*M\352\36\374!Z^J\277\16\356\256?\0\0\0>\0\0\0\7\377\377\377\260\0\0\0\20", 
232) = 232
215253 
fstat(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
{st_mode=S_IFREG|0644, st_size=122129, ...}) = 0
215253 select(4, 
[3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>], 
NULL, NULL, {1, 0}) = 1 (in [3], left {0, 999998})
215253 
read(3</space/mirror/p8/files/i586/RPMS/sssd-ad-1.16.4-alt1.M80P.1.i586.rpm>, 
"\216\255\350\1\0\0\0\0\0\0\0004\0\0*`", 16) = 16
...

Обращает на себя внимание наличие при работе старого rpm вызовов 
gettimeofday(), а в обновлённом -- просто select(). Это свидетельствует, 
что в обновлённом rpm используется набор функций для работы с файлами 
"ufdio", а в старом -- "fdio". Наверное, "fdio" глючный. Вероятно, выбор в 
пользу "ufdio" поменялся в серии патчей Алексея Турбина at@ про Large File 
Support.

Вряд ли пакеты из репозитория как-то плохо сформированы, да этот пример 
вроде и не очень большого файла пакета.

Так что могу посоветовать всем пользователям p8 обновить сначала rpm, 
чтобы избегать таких проблем.

-- 
Best regards,
Ivan


Подробная информация о списке рассылки Devel