На 13 март беше направено коригиращо издание 3.51.3 на компактната вградена СУБД. SQLite. Проектният код е написан на C и се разпространява като обществено достояние (public domain).
Поради проблеми с обратната съвместимост, свързани с някои нови функции, версията 3.52.0 (излязла на 6 март) беше отзована.
Списък на промените в версия 3.51.3:
- На 3 март един от разработчиците на SQLite (Dan) откри и отстрани грешка, която в редки случаи можеше да доведе до повреждане на базата данни и наречена «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
