На 13 март се състоя коригираща версия 3.51.3 на компактната вградена СУБД. SQLite. Проектният код е написан на C и се разпространява като обществено достояние (public domain).
Заради проблеми с обратна съвместимост, свързани с някои нови функции, версията 3.52.0 (излязла на 6 март) беше оттеглена.
Списък с промените в версия 3.51.3:
- На 3 март един от разработчиците на SQLite (Дан) откри и отстрани грешка, която в редки случаи можеше да доведе до повреждане на базата данни и беше наречена грешка "WAL-reset bug".:
- Тази грешка възниква само в бази данни, работещи в режим WAL, ако към един и същи файл има свързани две или повече връзки в различни потоци или процеси и ако тези две връзки се опитват да запишат или създадат контролна точка едновременно.
- Грешката е свързана с конфликт в достъпа до данните при строги времеви ограничения. В нормални условия на експлоатация тя възниква изключително рядко. Разработчиците не успяха да възпроизведат тази грешка в реални условия и им се наложи да добавят в SQLite специална логика за тестване, която умишлено създава условия за възникване на грешката, за да се уверят, че проблемът е отстранен.
- Грешката възниква, когато:
- Една връзка извършва проверка на контролна точка. Тази първа проверка трябва да бъде завършена. С други думи, по време на проверката трябва успешно да се копира всичкото съдържание на файла WAL обратно в базата данни и да се доведе файлът WAL в състояние, в което да може да бъде нулиран.
- Веднага след завършване на първата контролна точка се стартира втора.
- Докато се стартира втората контролна точка от стъпка 2, друга връзка към базата данни фиксира транзакция, която нулира файла WAL и записва ново съдържание в началото на файла WAL.
- Поради конфликта в достъпа до данните, втората контролна точка от стъпка 2 не отчита, че файлът WAL е бил нулиран в резултат на фиксацията на транзакцията от стъпка 3. Втората контролна точка задава неверно стойност за което и да е от полетата в заглавката на WAL. Това поле показва, че част от файла WAL вече е била фиксирана в контролна точка, докато в действителност не е така.
- Фиксирането на допълнителни транзакции води до увеличаване на броя на страниците във файла WAL, който надвишава броя на страниците, съществували към момента на първата контролна точка от стъпка 1.
- По-късно, когато се появи третата контролна точка, тя пропуска цялата или част от транзакцията, записана на етап 3. По този начин частите от транзакцията на етап 3 не попиват в файла на базата данни, което води до повреда на файла на базата данни.
- Грешката вероятно присъства във всички версии на SQLite, започвайки от 3.7.0 (21.07.2010) до 3.51.2. Също така са публикувани корекции за някои по-ранни версии: 3.44.6 и 3.50.7.
- Други незначителни корекции.
Източник: linux.org.ru
