13 marca odbyła się korekta wydania 3.51.3 kompaktowej wbudowanej bazy danych SQLite. Kod projektu został napisany w języku C i jest rozpowszechniany jako własność publiczna (public domain).
W związku z problemami z wsteczną kompatybilnością związanymi z niektórymi nowymi funkcjami, wersja 3.52.0 (wydana 6 marca) została wycofana.
Lista zmian w wersji 3.51.3:
- 3 marca jeden z deweloperów SQLite (Dan) odkrył i naprawił błąd, który w rzadkich przypadkach mógł prowadzić do uszkodzenia bazy danych i nazwany „błąd resetowania WAL”:
- Błąd ten występuje tylko w bazach danych działających w trybie WAL, jeśli do tego samego pliku otwarto dwa lub więcej połączeń w różnych wątkach lub procesach, a te dwa połączenia jednocześnie próbują wykonać zapis lub utworzyć punkt kontrolny.
- Błąd związany jest z konfliktem dostępu do danych przy ścisłych ograniczeniach czasowych. W normalnych warunkach eksploatacji występuje niezwykle rzadko. Deweloperom nie udało się odtworzyć tego błędu w naturalnych warunkach, więc musieli dodać do SQLite specjalną logikę testowania, która celowo tworzy warunki do wystąpienia błędu, aby upewnić się, że problem został rozwiązany.
- Błąd występuje, gdy:
- Jedno połączenie wykonuje sprawdzenie punktu kontrolnego. To pierwsze sprawdzenie musi być zakończone. Inaczej mówiąc, w trakcie sprawdzenia należy pomyślnie skopiować całą zawartość pliku WAL z powrotem do bazy danych i doprowadzić plik WAL do stanu, w którym można go zresetować.
- Natychmiast po zakończeniu pierwszego punktu kontrolnego uruchamia się drugi.
- Podczas uruchamiania drugiego punktu kontrolnego z kroku 2, inne połączenie z bazą danych rejestruje transakcję, która resetuje plik WAL i zapisuje nową zawartość na początku pliku WAL.
- W wyniku konfliktu dostępu do danych drugi punkt kontrolny z kroku 2 nie uwzględnia, że plik WAL został zresetowany w wyniku rejestracji transakcji w kroku 3. Drugi punkt kontrolny ustawia błędną wartość dla jednego z pól w nagłówku indeksu WAL. To pole wskazuje, że część pliku WAL została już zarejestrowana w punkcie kontrolnym, chociaż w rzeczywistości tak nie jest.
- Zatrzymanie dodatkowych transakcji prowadzi do zwiększenia liczby stron w pliku WAL, które przekracza liczbę stron, jakie istniały w momencie pierwszego punktu kontrolnego z kroku 1.
- Później, gdy pojawia się trzeci punkt kontrolny, pomija całą lub część transakcji zapisanej w etapie 3. W ten sposób części transakcji z etapu 3 nie trafiają do pliku bazy danych, co prowadzi do uszkodzenia pliku bazy danych.
- Błąd prawdopodobnie występuje we wszystkich wersjach SQLite, począwszy od 3.7.0 (21.07.2010) do 3.51.2. Poprawki zostały także wydane dla niektórych wcześniejszych wersji: 3.44.6 i 3.50.7.
- Inne drobne poprawki.
Źródło: linux.org.ru
