Co nie działało
Sonic to szybki backend wyszukiwania napisany w Rust, który autorzy opisują jako alternatywę dla Elasticsearch działającą na kilku megabajtach pamięci. Indeks trzyma w RocksDB (magazyn KV) i w plikach FST. Komenda TRIGGER backup miała robić kopię obu, ale zawodziła w dwóch sytuacjach opisanych w zgłoszeniu #274.
Pierwsza: kopia zaraz po zapisie danych komendą PUSH. Zapis otwiera bazę RocksDB i zostawia ją otwartą w puli magazynów, a kod kopii próbował otworzyć ją drugi raz. RocksDB na to nie pozwala, bo plik LOCK jest już zajęty. Druga: świeży serwer, na którym nic jeszcze nie zapisano, więc katalogi magazynów w ogóle nie istniały.
Co zmieniliśmy
Jeśli magazyn jest już otwarty w puli, kopia powstaje z tej instancji. Przed kopią dane są zrzucane z pamięci na dysk, bo bufory w pamięci mogą trzymać zapisy, których nie ma jeszcze w plikach:
Gdy katalog magazynu KV albo FST jeszcze nie istnieje, kopia po prostu go pomija zamiast zwracać błąd.
Jak to sprawdziliśmy
Test trigger_backup był wcześniej wyłączony z adnotacją, że klient go nie obsługuje, a w środku miał todo!(). Napisaliśmy go od nowa: kopia na pustym serwerze, potem PUSH, potem kopia przy otwartym magazynie i sprawdzenie, że w katalogu kopii jest dokładnie jeden niepusty backup KV.
Efekt
Zmianę scalono 5 października 2026. Tego samego dnia przyjęto też naszą drugą poprawkę (#432): od jednej z wcześniejszych zmian pętla po kubełkach FST sprawdzała zły wpis, więc backup zgłaszał sukces, ale nie zapisywał plików FST, a odtwarzanie niczego nie odtwarzało.