Bug 990 - Ошибка DB_PAGE_NOTFOUND: Requested page в конце работы apt-get
Summary: Ошибка DB_PAGE_NOTFOUND: Requested page в конце работы apt-get
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: libapt (show other bugs)
Version: unstable
Hardware: all Linux
: P4 major
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
: 1215 2674 4323 5197 (view as bug list)
Depends on:
Blocks: 3459 5192 7079
  Show dependency tree
 
Reported: 2002-06-11 11:30 MSD by Andrew Fediushin
Modified: 2008-07-17 20:19 MSD (History)
13 users (show)

See Also:


Attachments
Test of locking (789 bytes, application/x-tgz)
2004-06-09 18:01 MSD, Sergey V Turchin
no flags Details
rpm-4_0-4.0.4-lock-fixed.patch (631 bytes, patch)
2005-06-14 15:53 MSD, Anton Farygin
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Andrew Fediushin 2002-06-11 11:30:27 MSD
Каждый раз при обновлении системы до Sisyphus обновление прерывается на последнем устанавливаемом пакете с диагностикой:
\"ошибка: ошибка(4) db-30988 из dbcursor->c_get: DB_PAGE_NOTFOUND: Requested page not found\"
---

---
Система: когда-то Junior 1.1, периодически обновляемый до текущего состояния Sisyphus (apt-get dist-upgrade).
Ошибка появилась в последние две недели.
Comment 1 Dmitry V. Levin 2002-08-05 21:04:41 MSD
Имеет место не вполне корректная работа с блокировками базы данных /var/lib/rpm/Packages.

Ситуация может возникнуть, например, при обновлении пакета, содержащего menu entry.
Comment 2 Dmitry V. Levin 2002-08-05 21:04:41 MSD
Имеет место не вполне корректная работа с блокировками базы данных /var/lib/rpm/Packages.

Ситуация может возникнуть, например, при обновлении пакета, содержащего menu entry.
Comment 3 Dmitry V. Levin 2004-06-09 17:56:47 MSD
*** Bug 4323 has been marked as a duplicate of this bug. ***
Comment 4 Sergey V Turchin 2004-06-09 18:01:09 MSD
Created attachment 429 [details]
Test of locking
Comment 5 Dmitry V. Levin 2004-06-27 03:39:44 MSD
Zerg, твой тест демонстрирует вполне нормальную блокировку rpm'а.
Comment 6 Sergey V Turchin 2004-06-29 14:11:45 MSD
(In reply to comment #5) 
> Zerg, твой тест демонстрирует вполне нормальную блокировку rpm'а. 
Не понял, в процессе установки пакетов база должна быть разблокирована для 
чтения? 
 
Comment 7 Dmitry V. Levin 2004-08-27 20:57:17 MSD
Zerg, твой тест демонстрирует вполне нормальную работу блокировок rpm'а, и
ненормальную работу блокировок apt'а, поскольку последний после создания
блокировки запускает подпроцессы, и в результате блокировка теряется.
Comment 8 Dmitry V. Levin 2004-09-19 19:31:24 MSD
На самом деле проблема в libapt, блокировка теряется при запуске подпроцессов,
поскольку дескриптор, на котором эта блокировка, CLOEXEC.
Comment 9 Dmitry V. Levin 2004-09-19 19:32:55 MSD
*** Bug 5197 has been marked as a duplicate of this bug. ***
Comment 10 Sergey V Turchin 2005-03-29 11:59:25 MSD
*** Bug 2674 has been marked as a duplicate of this bug. ***
Comment 11 Sergey V Turchin 2005-06-10 13:21:59 MSD
Сделать хотя бы какой-нибудь любой другой лок, который не будет слетать.  
Comment 12 Anton Farygin 2005-06-14 15:25:48 MSD
Отлично видно как слетает блокировка при работе apt-shell:
1) запускаем apt-shell
2) в другом терминале пробуем rpm -q <установленный пакет>, обламываемся на
заблокированной базе
3) устанавливаем или удаляем пакет в apt-shell (например install ntdate и commit -y)
4) пытаемся в соседнем терминале запросить информацию о пакете.. наблюдаем
успешно разблокированную базу

включаем максимальный уровень отладки у librpm через rpmIncreaseVerbosity();,
вызываем в libapt

наблюдаем в логах только одну попытку залочить базу:
 fgrep "/var/lib/rpm/Packages" Log 
D: opening  db environment /var/lib/rpm/Packages create:mpool
D: opening  db index       /var/lib/rpm/Packages  mode=0x2
D: locked   db index       /var/lib/rpm/Packages
D: closed   db index       /var/lib/rpm/Packages
D: closed   db environment /var/lib/rpm/Packages
D: removed  db environment /var/lib/rpm/Packages
D: verified db index       /var/lib/rpm/Packages
D: opening  db environment /var/lib/rpm/Packages create:mpool
D: opening  db index       /var/lib/rpm/Packages  mode=0x2
D: closed   db index       /var/lib/rpm/Packages
D: closed   db environment /var/lib/rpm/Packages
D: removed  db environment /var/lib/rpm/Packages
D: verified db index       /var/lib/rpm/Packages
D: opening  db environment /var/lib/rpm/Packages create:mpool
D: opening  db index       /var/lib/rpm/Packages  mode=0x2
D: closed   db index       /var/lib/rpm/Packages
D: closed   db environment /var/lib/rpm/Packages
D: removed  db environment /var/lib/rpm/Packages
D: verified db index       /var/lib/rpm/Packages

сам apt-get использует для блокировки базы rpmdbOpen(), кода fork() я в нем не
нашел (может плохо искал?)

все-таки возникает подозрение, что блокировку не устанавливает заново librpm
Comment 13 Anton Farygin 2005-06-14 15:34:39 MSD
да, забыл добавить:
судя по всему не прокатывает одно из условий в librpmdb:

в rpmdb/db3.c добавлен следущий код:
            printf("db3open, fcntl:%i\n", (rc == 0 && dbi->dbi_lockdbfd &&
                (!dbi->dbi_use_dbenv || _lockdbfd++ == 0)));

соответственно вот вывод работы apt-shell:

  LD_LIBRARY_PATH=./ apt-shell 2>Log
RPMDBHandler:WriteLock1
rpmdbOpen:2, 1a4
Enter to db3open
db3open, fcntl:1
LockRpm:1
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Добро пожаловать в APT shell. Используйте команду "help" для дополнительной
информации.
apt> remove icewm
apt> commit -y
Следующие пакеты будут УДАЛЕНЫ:
  icewm
0 будет обновлено, 0 новых установлено, 1 пакетов будет удалено и 1 не будет
обновлено.
Необходимо получить 0B архивов.
После распаковки будет освобождено 984kB дискового пространства.
UnLockRpm:0
rpmdbOpen:2, 1a4
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Совершаем изменения...
Preparing...                     Enter to db3open
db3open, fcntl:0
###################################################################################################
[100%]
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Enter to db3open
db3open, fcntl:0
Завершено.
RPMDBHandler:WriteLock1
rpmdbOpen:2, 1a4
Enter to db3open
db3open, fcntl:0
LockRpm:1
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
apt> 

Comment 14 Anton Farygin 2005-06-14 15:53:09 MSD
Created attachment 937 [details]
rpm-4_0-4.0.4-lock-fixed.patch

Патч, исправляющий эту ошибку в librpmdb.

Пояснение: static переменная, которую я убрал не позволяет провести вторую
блокировку в случае, когда librpm используется кем-то вроде apt'а, который
несколько раз открывает и закрывает базу rpm.

в коде для db1 такой переменной не обнаружено.

rpm с таким патчем работает нормально, apt-get, apt-shell - тоже.

в случае apt-shell при наличии этого патча поведение меняется следущим образом:

1) открывается база rpm
2) в момент commit'а база закрывается и запускается процесс установки пакетов,
который снова открывает и лочит базу
3) после установки пакетов база закрывается (блокировка снимается)
4) базу снова открывает apt-shell и восстанавливает блокировку.
Comment 15 Anton Farygin 2005-06-14 15:55:46 MSD
Вот как это выглядит с патчем (просьба не обращать внимания на разную отладочную
информацию. fcntl_mod: 2 означает установку блокировки на базу.
после работы commit'а база получается залоченной (как оно и должно быть).

#  LD_LIBRARY_PATH=./ apt-shell 2>Log
RPMDBHandler:WriteLock1
rpmdbOpen:2, 1a4
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 1, 1, 0
db3open, fcntl3:0, 1, 1, 1
fcntl_mod: 2
LockRpm:1
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Добро пожаловать в APT shell. Используйте команду "help" для дополнительной
информации.
apt> remove icewm
Пакет icewm не установлен, и не может быть удалён.
apt> install icewm
apt> commit
Следующие НОВЫЕ пакеты будут установлены:
  icewm
0 будет обновлено, 1 новых установлено, 0 пакетов будет удалено и 1 не будет
обновлено.
Необходимо получить 0B/398kB архивов.
После распаковки потребуется дополнительно 984kB дискового пространства.
Продолжить? [Y/n] 
UnLockRpm:0    
rpmdbOpen:2, 1a4
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 1, 1, 0
db3open, fcntl3:0, 1, 1, 1
fcntl_mod: 2
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Совершаем изменения...
Preparing...                    
###################################################################################################
[100%]
1: icewm                        
###################################################################################################
[100%]
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 0, 1, 0
Завершено.
RPMDBHandler:WriteLock1
rpmdbOpen:2, 1a4
Enter to db3open
db3open, fcntl:0
db3open, fcntl2:0, 1, 1, 0
db3open, fcntl3:0, 1, 1, 1
fcntl_mod: 2
LockRpm:1
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
apt>


Comment 16 Dmitry V. Levin 2005-06-15 22:01:54 MSD
Hopefully fixed in slightly different way.
Please test rpm-4.0.4-alt44.