Bug 990

Summary: Ошибка DB_PAGE_NOTFOUND: Requested page в конце работы apt-get
Product: Sisyphus Reporter: Andrew Fediushin <andrew>
Component: libaptAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P4 CC: boyarsh, eostapets, glebfm, imz, lav, ldv, mouse, placeholder, rider, sr, svd, wrar, zerg
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 3459, 5192, 7079    
Attachments:
Description Flags
Test of locking
none
rpm-4_0-4.0.4-lock-fixed.patch none

Description Andrew Fediushin 2002-06-11 11:30:27 MSD
Каждый раз при обновлении системы до Sisyphus обновление прерывается на последнем устанавливаемом пакете с диагностикой:
\&quot;ошибка: ошибка(4) db-30988 из dbcursor-&gt;c_get: DB_PAGE_NOTFOUND: Requested page not found\&quot;
---

---
Система: когда-то 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.