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
