Выпущена версия Vitastor 3.0.16

19.07.2026

Много исправлений, но мелких. :-)

Наиболее интересные исправления связаны с пулами без immediate_commit (для настольных SSD): исправлены граничные случаи операции фиксации изменений (sync) и работа CAS-записей (используемых, например, в VitastorFS).

Также исправлен баг “double-claim” в новом хранилище и внесены изменения, снижающие нагрузку на etcd во время активных переключений состояний PG.

Подробнее читайте ниже.

Новое хранилище

  • Исправлена причина ошибок ‘double-claim’, обход которых был добавлен в 3.0.12 — удаление delete-записи при перезапуске могло происходить до удаления замаскированного ей big_write
  • Исправлена проверка блочных контрольных сумм (при csum_block_size > 4k) при частичных чтениях некоторых записей
  • Исправлено некорректное обрезание конца списка нестабильных объектов в лимитированных запросах листинга (отправляются scrub-ами)
  • OSD теперь будет выключаться при ошибках fsync во время пакетных big_write, как и при других дисковых ошибках
  • Добавлена отсутствовавшая проверка disable_meta_fsync для включения immediate_commit

Клиенты

  • Исправлен пропуск встроенного fsync в CAS-записях (для пулов без immediate_commit)
  • Добавлена проверка размеров ответов show_config, sec_list и sec_read_bmp
  • Исправлено то, что ответ show_config обрабатывался как завершённая нулём строка без учёта длины

Старое хранилище

  • Добавлен пропуск слишком маленьких (повреждённых) записей журнала

OSD

  • Запрещено создание пулов с block_size*pg_size больше UINT32_MAX
  • Убрана принудительная отправка статистики OSD после отправки состояний PG (должно снизить нагрузку на etcd)
  • Устранены двойные попытки увеличения эпохи PG из нескольких запросов записи, которые могли приводить к ложным ошибкам обновления состояний PG, дополнительным перезапускам PG и повышенной нагрузке на etcd
  • Исправлена обработка PG с pg_size между 32 и 64 (значения больше 64 запрещены ранее)
  • Для надёжности добавлены проверки ошибок отсутствующих объектов (ENOENT) в операциях чтения/записи
  • Первичные записи теперь прерываются с повторяемым кодом ошибки, если PG становится неактивной во время записи, вместо попытки дорабатывать их до конца
  • Исправлена корректность операции фиксации (sync) и добавлены тесты для её проверки:
    • Теперь соединения клиентов, писавших в PG, при её перезапуске сбрасываются сразу, а не ждут завершения всех операций, аналогично ситуации остановки PG
    • Sync теперь завершается с ошибкой, если клиент писал в PG, ставшие неактивными
    • Неактивные PG теперь пропускаются при sync (дополнительная проверка) — ранее без этой и изменения обработки ошибок записи счётчик запущенных операций мог увеличиваться на отключённых PG и приводить к use-after-free
    • Соединения клиентов теперь просто сбрасываются вместо возврата ошибки фиксации
  • Несколько исправлений скрабов:
    • Добавлена проверка битмапов при группировке идентичных EC-частей во время скраба
    • Исправлен возможный перебор слишком большого числа комбинаций в EC-пулах с большим k+n
    • Исправлено то, что чтения из деградированных объектов, помеченных как inconsistent после скраба, не учитывали реальное состояние объекта и могли возвращать нули
    • Исправлено некорректное индексирование массива в скрабе (возможно влиявшее на его результаты)

Ссылки