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

21.06.2026

Сколько (багов!) я зарезал, сколько перерезал! (более 50)

Общее замечание: большинство исправлений ошибок теперь сопровождаются регрессионными тестами, проверяющими, что они не повторятся в будущем. Большинство ошибок, исправленных в этом релизе, было обнаружено с помощью анализа LLM (Claude Opus/Fable, GPT 5.5).

OSD

  • Исправлено зависание OSD в бесконечном цикле при установке autosync_interval в 0 во время работы
  • (ВАЖНО) Исправлено зависание EC PG в состоянии REPEERING, когда последний финальный commit/rollback в пачке завершается с ошибкой. Интересное замечание: проблема была смежной с проблемой, классифицированной в 3.0.12 как опасный проезд по памяти, однако, после воспроизведения в регрессионном тесте выяснилось, что, по-видимому, проезда по памяти там быть не могло.
  • pg_size ограничен 64, потому что пиринг не поддерживает бОльшие значения для EC — они просто приводят к появлению объектов в состоянии ‘incomplete’
  • Исправлен крах OSD с ошибкой “assertion failed” при повторе EIO в цепочке чтения снапшотов (то есть когда часть чанков относится к повреждённой реплике с несовпадением контрольной суммы)
  • (ВАЖНО) Отключён инкрементальный решардинг количества PG из-за возможных конфликтов с изменениями компактизации (будет включён обратно после исправлений)
  • (ВАЖНО) Исправлено некорректное восстановление bitmap-ов выделенного места при цепочечном EC-чтении из снапшотов
  • Добавлены проверки размеров сетевых запросов, чтобы предотвратить возможные OOM/DoS/повреждения памяти при получении некорректных данных по сети
  • (ВАЖНО) Исправлено повреждение bitmap-ов выделенного места при EC-записях без чтения чётности (то есть когда все OSD с чётностью в PG недоступны)
  • (ВАЖНО) Исправлено уничтожение bitmap-ов выделенного места живых чанков чётности при восстановлении EC N+K, K>=2
  • (ВАЖНО) Исправлен возможный крах OSD при скрабе misplaced-объектов EC
  • (ВАЖНО) Добавлена проверка консистентности bitmap-ов объектов при скрабе (ранее проверялись только данные)
  • (ВАЖНО) Исправлена ситуация, когда повреждённые чанки объектов ошибочно помечались как неповреждённые при повторном скрабе
  • (ВАЖНО) Исправлено кэшированное декодирование нескольких страйпов EC через ISA-L (ISA-L используется по умолчанию)

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

  • Исправлен теоретически возможный крах OSD при старте при использовании ранее добавленного обхода проблемы “double-claim”
  • Устранены теоретически возможные некорректные записи блока метаданных при параллельных EC COMMIT, перезапускаемых из-за заполнения области метаданных
  • Исправлено некорректное отслеживание счётчика компактизации после перезапуска OSD (вероятно могло приводить к тому, что компактизация некорректно перезапускалась после рестарта)
  • (ВАЖНО) Исправлена ситуация, когда часть параллельных big_writes могла не дожидаться fsync данных, тем самым не обеспечивая фиксацию данных на диске
  • Исправлен возможный крах OSD при повторе sync, когда io_uring заполнен
  • Исправлен возможный крах при старте на повреждённых данных на диске со слишком маленькими размерами записей

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

  • Предотвращена загрузка лишних мусорных записей метаданных из последних 4 МБ области метаданных
  • Исправлен возможный крах операций чтения, если чтение метаданных (при inmemory_metadata=false) перезапускалось из-за заполнения io_uring
  • Исправлена возможная утечка памяти временных буферов и bitmap-ов/контрольных сумм, когда чтение перезапускалось из-за заполнения io_uring (воспроизводилось при inmemory_metadata=false либо block_size>256k)
  • Исправлен возможный крах OSD при чтениях дополненных блоков контрольных сумм, если количество буферов превышало 1024 (IOV_MAX) (воспроизводилось только при csum_block_size > 4k и block_size >= 4M)
  • (ВАЖНО) Исправлена проверка контрольных сумм журнала при частичном чтении дополненных блоков с csum_block_size > 4k
  • Исправлена пометка повреждённых объектов как неповреждённых при сбросе повреждённых данных из журнала в область данных (при inmemory_journal=false)
  • (ВАЖНО) Исправлено отложенное освобождение другого блока, когда блок использовался параллельным чтением
  • Исправлено некорректное отключение постатистики по инодам для FS- и S3-пулов, из-за чего etcd перегружался ненужной поинодной статистикой, его работа замедлялась, возрастало потребление памяти и экспортировалось слишком много метрик Prometheus через монитор

Оба хранилища

  • Исправлено возможное оставление мусора в области метаданных, если первый запуск OSD был прерван — заголовок метаданных теперь записывается только после инициализации метаданных
  • Добавлена проверка коротких чтений при инициализации (на всякий случай, в реальной жизни не встречается)

Клиенты

  • Исправлено разделение элемента очереди write-back в случае, когда write-back включается во время работы
  • Реализованы bdrv_detach_aio_context и bdrv_attach_aio_context в драйвере QEMU (должно исправить миграцию с iothread)
  • Устранён крах при заполнении io_uring в ublk-сервере
  • Исправлена обработка отсутствующего параметра --readonly в NBD-сервере
  • NBD-сервер теперь плавно завершается по NBD_CMD_DISC, а не просто делает exit(0)
  • Исправлено определение writeback в ublk-сервере в режиме --image
  • Ограничен объём входящих данных для NFS-клиентов, чтобы избежать перегрузки памяти при монтировании с опцией async

Утилиты (vitastor-disk/vitastor-cli)

  • Устранена возможность выхода vitastor-cli merge до завершения последних операций sync/delete
  • Исправлена некорректная валидация слишком большого размера small_write записей в vitastor-disk
  • Исправлено игнорирование ошибок валидации входных параметров в vitastor-cli merge
  • Исправлен пропуск финального fsync в vitastor-cli rm-data
  • Исправлено, что vitastor-disk resize не перемещал последний используемый блок данных
  • Исправлен некорректный импорт записей small_write нового хранилища в vitastor-disk write-meta
  • Исправлен некорректный импорт данных старого хранилища в vitastor-disk write-journal и write-meta при csum_block_size > 4k
  • Добавлена поддержка параметра --io в vitastor-disk dump-journal/write-journal
  • Исправлен крах vitastor-disk resize при конвертации из очень старых (0.5.x) метаданных
  • Исправлено некорректное округление диапазонов блоков в vitastor-disk trim при явно заданной опции --discard_granularity > 4k и возможный при этом discard живых данных
  • Исправлен некорректный импорт метаданных нового хранилища в vitastor-disk write-meta при размере области метаданных > 4 ГБ
  • (ВАЖНО) Исправлено то, что vitastor-cli modify --resize на меньший размер очищал все данные образа O_o

Прочее

  • Устранён крах с uncaught exception при наличии в etcd некорректного ключа /osd/state/ с нечисловым суффиксом (в OSD и во всех клиентских сервисах)
  • Исправлен возможный крах vitastor-kv при обработке повреждённой БД из-за переполнения uint32
  • Исправлен крах аллокатора памяти NFS-RDMA в некоторых ситуациях
  • Исправлено возможное чтение неаллоцированной памяти при записи за пределами конца маленького файла в “разделяемого иноде” (NFS)
  • Добавлены проверки границ для предотвращения переполнений uint32 в NFS/XDR
  • Повторно включены случайно отключённые проверки безопасности (assert-ы) в файлах с подключённым cpp-btree
  • Исправлено некорректное (слишком маленькое) выделение памяти в NFS portmap

Ссылки