[bug] Ошибка сохранения снимает dirty и отключает повторную попытку #6

Closed
opened 2026-10-29 11:44:03 +00:00 by chexit · 1 comment
Owner

Проверено на 90379f6.

Статический разбор: если storage::set() возвращает ошибку, save() пишет предупреждение, но затем безусловно выполняет self.dirty = false. При следующем тике контрольная сумма уже совпадает с health_mark, поэтому без новых изменений повторной попытки не будет. Изменения могут потеряться при выходе/переходе в другой мир.

Воспроизведение для будущего host-теста: хранилище возвращает Err при первой записи и Ok при второй; после первой ошибки dirty должен остаться true, а следующий запланированный autosave должен повторить запись.

Предложение: снимать dirty только после успешной записи. Для повторов добавить ограничение частоты/backoff, чтобы не забить лог и не вызывать failing storage на каждом тике.

Код:

if let Err(e) = storage::set(&self.state_key(), text.as_bytes()) {

Проверено на `90379f6`. Статический разбор: если `storage::set()` возвращает ошибку, `save()` пишет предупреждение, но затем безусловно выполняет `self.dirty = false`. При следующем тике контрольная сумма уже совпадает с `health_mark`, поэтому без новых изменений повторной попытки не будет. Изменения могут потеряться при выходе/переходе в другой мир. Воспроизведение для будущего host-теста: хранилище возвращает Err при первой записи и Ok при второй; после первой ошибки `dirty` должен остаться true, а следующий запланированный autosave должен повторить запись. Предложение: снимать `dirty` только после успешной записи. Для повторов добавить ограничение частоты/backoff, чтобы не забить лог и не вызывать failing storage на каждом тике. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/lib.rs#L520
chexit added the area:persistencepriority:P1type:bug labels 2026-10-29 12:56:53 +00:00
Author
Owner

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/e08fc65 (запушено в main).

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/e08fc65 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#6