<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="ru">
<id>atom.xml</id>
<title>undefined</title>
<link rel="alternate" href="https://vitastor.io/blog/" type="text/html" />
<link rel="self" href="https://vitastor.io/atom.xml" type="application/atom+xml" />
<updated>2026-09-27T14:31:05.955Z</updated>
<rights type="html">Copyright (c) 2019+, Виталий Филиппов</rights>

<entry>
<id>blog/2026-09-27-v3.2.2.html</id>
<title>Выпущена версия Vitastor 3.2.2</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-09-27-v3.2.2.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-09-27T12:00:00Z</published>
<updated>2026-09-27T12:00:00Z</updated>
<content type="html"><p>Небольшой релиз с исправлениями ошибок.</p>
<ul>
<li>Новое хранилище (спасибо Changwei Ye)
<ul>
<li>Исправлены ошибки отклонения компактизации в редких случаях, когда объект уже успели перезаписать снова</li>
<li>Снижена амплификация ввода-вывода суперблока, возникшая после предыдущих исправлений корректности</li>
</ul>
</li>
<li>Исправлено возможное падение <code>vitastor-cli rm</code> с <code>assert(rwo-&gt;todo == 1)</code>, появившееся в 3.2.1</li>
<li>Исправлен некорректный переход реплицируемых объектов в состояние INCOMPLETE
после нескольких неудачных частичных записей</li>
<li>Исправлена ошибка “operation sequencing broken … expected num 2, got 3,
stopping client”, возникающая при перегрузке кластера из-за флапов OSD</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.2.2" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.2.2</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-09-13-v3.2.1.html</id>
<title>Выпущена версия Vitastor 3.2.1</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-09-13-v3.2.1.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-09-13T12:00:00Z</published>
<updated>2026-09-13T12:00:00Z</updated>
<content type="html"><ul>
<li>Блочные хранилища
<ul>
<li>В хаос-тест добавлено больше асинхронности, чтобы выявить больше проблем…</li>
<li>…и они исправлены (~6 в старом хранилище, ~9 в новом)</li>
<li>Исправлена проверка размера для journal_offset при разделяемом meta-устройстве (спасибо Changwei Ye)</li>
</ul>
</li>
<li>Сетевой слой
<ul>
<li>Исправлена обработка zero-copy уведомлений, приходящих не по порядку (редкая, но в теории возможная ситуация)</li>
<li>Исправлено двойное вычисление контрольной суммы заголовка в режиме proto_checksums=full</li>
<li>Добавлена опция <a href="https://vitastor.io/docs/config/network.html#rxbounce" target="_blank">rxbounce</a> для Windows-виртуалок с TCP и включёнными контрольными суммами</li>
<li>Сокеты остановленных соединений теперь закрываются раньше, чтобы предотвратить зависшие
zerocopy-уведомления и медленное переключение при отказе (~15 мин вместо ~10 сек)</li>
</ul>
</li>
<li>OSD
<ul>
<li>Убрано аварийное завершени при ошибках модификации локального хранилища (неактуально после добавления обработки ошибок записи)</li>
</ul>
</li>
<li>CSI
<ul>
<li>Исправлен жизненный цикл NFS-демона VitastorFS (спасибо Дмитрию Наумову)</li>
<li>В CSI теперь используется более новый qemu-storage-daemon</li>
</ul>
</li>
<li>vitastor-cli
<ul>
<li>Добавлена опция opool для <code>dd</code></li>
<li>Исправлено: <code>rm</code> с «обратной» оптимизацией неверно удалял данные слоя перед переименованием,
что могло приводить к некорректному чтению из дочерних образов при удалении снапшота старше последнего</li>
<li>Исправлено возможное зависание в <code>merge</code> и производных командах (<code>rm</code>, <code>flatten</code>)</li>
<li>Исправлены ошибки в OpenAPI-спецификации <code>serve</code> (спасибо Степану Работкину)</li>
<li>Исправлены возможные сегфолты в <code>serve</code> из-за некорректного разбора запроса (спасибо Vincent Schweiger)</li>
<li>Исправлен режим <code>serve</code> без HTTPS (спасибо обоим :))</li>
</ul>
</li>
<li>Сборка
<ul>
<li>Исправлены сборки для не-x86, падавшие из-за неподдерживаемого xxhash x86dispatch</li>
<li>Во всех сборках принудительно включаются assert’ы, чтобы убрать зависимость от профиля сборки</li>
<li>Исправлена сборка драйвера QEMU с QEMU &lt; 10.2</li>
</ul>
</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.2.1" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.2.1</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-08-31-v3.2.0.html</id>
<title>Выпущена версия Vitastor 3.2.0</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-08-31-v3.2.0.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-08-31T12:00:00Z</published>
<updated>2026-08-31T12:00:00Z</updated>
<content type="html"><p>Это корректирующий релиз, и большая часть исправлений внесена благодаря новому подходу
к тестированию: <strong>хаос-тесту блочного хранилища, который теперь запускается в CI при каждом
изменении</strong>.</p>
<p>Также спасибо Юрию Лунёву из MIND Software за другую часть исправлений.</p>
<h2 id="%D0%BD%D0%BE%D0%B2%D1%8B%D0%B5-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8" tabindex="-1">Новые функции <a class="header-anchor" href="#%D0%BD%D0%BE%D0%B2%D1%8B%D0%B5-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<p>Кроме хаос-теста и исправлений стабильности, в релиз также входит несколько новых функций:</p>
<ul>
<li>Онлайн-изменение размера для ublk, NBD, QEMU и VDUSE, плюс онлайн-расширение на ноде в CSI для
всех типов томов. То есть, размер подключённых устройств теперь меняется автоматически после
<code>vitastor-cli modify --resize</code>.</li>
<li>Хелперы монтирования VitastorFS <code>mount.vitastorfs</code> и <code>mount.vitastorblk</code> — ФС теперь можно
монтировать из <code>/etc/fstab</code>.</li>
<li>Теперь можно настраивать NFS <code>--readahead</code> в команде монтирования: увеличение ускоряет
чтение в 2-3 раза.</li>
<li>Снова разрешено использование клиента без io_uring (опция <code>use_sync_send_recv</code>) — при
включённом RDMA это ничем не хуже по производительности.</li>
<li>Добавлен обработчик пути <code>/healthcheck</code> в мониторе.</li>
<li>Серверы NBD, ublk и NFS теперь обрабатывают SIGINT и SIGTERM и завершаются плавно.</li>
<li>В CSI теперь используются, а в документации VitastorFS предлагаются безопасные
опции монтирования <code>soft,sync</code>.</li>
<li>В первую очередь это касается старого хранилища, однако: больше не допускаются ситуации,
в которых операции записи могут зависнуть навсегда из-за исчерпании места в журнале. Теперь
в таких случаях хранилище возвращает <code>EAGAIN</code>, OSD обрабатывают эту ошибку, а обязанность
повторить запрос возлагается на клиента. Исправление меняет логику обработки ошибок на стороне
клиента, поэтому при использовании старого хранилища рекомендуется обновить клиентов.</li>
</ul>
<h2 id="%D1%85%D0%B0%D0%BE%D1%81-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" tabindex="-1">Хаос-тестирование <a class="header-anchor" href="#%D1%85%D0%B0%D0%BE%D1%81-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<p>Блочное хранилище теперь покрыто тестом в стиле DST (детерминистический симуляционный тест),
управляемым сидом. Хранилище запускается в симулированной среде: io_uring отдаёт завершения
не по порядку и со случайной задержкой, энергозависимый кэш диска при симулированном отключении
питания теряет случайное подмножество своего содержимого, а записи, летевшие в этот момент,
доезжают целиком, частично (рвутся по границе сектора) или не доезжают вовсе. Само хранилище
при этом настоящее — журнал, метаданные, флашер, компактизация, контрольные суммы. Рядом ведётся
модель записанных данных и после каждого отключения питания восстановленное состояние сверяется
с ней, включая битмапы объектов.</p>
<p>Тест запускает обе реализации хранилища на одной и той же нагрузке в 24 конфигурациях: старое и
новое хранилище, серверные и десктопные диски (с конденсаторами и без), двухфазные (EC) и
мгновенные (реплицированные) записи, контрольные суммы выключены / включены с блоком 4 КБ / 16 КБ.
CI прогоняет 200 сидов на каждой сборке, по процессу на сид, и печатает список упавших сидов —
после чего любое падение можно чётко воспроизвести командой <code>test_blockstore_chaos --seed N</code>.</p>
<p>Для понимания масштаба: <strong>на хранилище из 3.1.0 текущий хаос-тест падает на 83 сидах из 200</strong>
без учёта утечек памяти и строгого запрета одновременной записи одного и того же сектора, а
с их учётом - <strong>на 97 сидах из 200</strong>.</p>
<pre><code>  #  конфигурация                           сломано/всего
  8  v2 fsync=0 csum=16384 instant          4/9
  9  v2 fsync=1 csum=none  instant          1/8
 10  v2 fsync=1 csum=4096  instant          1/8
 12  v1 fsync=0 csum=none  two-phase        8/8
 13  v1 fsync=0 csum=4096  two-phase        8/8
 14  v1 fsync=0 csum=16384 two-phase        8/8
 15  v1 fsync=1 csum=none  two-phase        8/8
 16  v1 fsync=1 csum=4096  two-phase        8/8
 17  v1 fsync=1 csum=16384 two-phase        8/8
 18  v1 fsync=0 csum=none  instant          8/8
 19  v1 fsync=0 csum=4096  instant          8/8
 20  v1 fsync=0 csum=16384 instant          8/8
 21  v1 fsync=1 csum=none  instant          1/8
 22  v1 fsync=1 csum=4096  instant          3/8
 23  v1 fsync=1 csum=16384 instant          8/8
</code></pre>
<p>Доминирующие проблемы:</p>
<ul>
<li>Старое хранилище: OSD аварийно завершается с <code>BUG: Unexpected dirty_entry ... unstable state during flush</code> — на каждом сиде всех шести двухфазных (EC) конфигураций — или отказывается
стартовать с <code>Fatal error (bug): big_write journal_entry was allocated over another object</code>.</li>
<li>Новое хранилище: после отключения питания объект становится нечитаемым с ошибкой контрольной
суммы (<code>retval=-33</code>), а в одном случае возвращается с данными <strong>другого объекта</strong>.</li>
</ul>
<p>Теперь же все эти проблемы исправлены.</p>
<h2 id="%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%BB%D0%B8-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D1%8F%D1%82%D1%8C%D1%81%D1%8F%3F" tabindex="-1">Нужно ли обновляться? <a class="header-anchor" href="#%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%BB%D0%B8-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D1%8F%D1%82%D1%8C%D1%81%D1%8F%3F" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li><strong>Старое хранилище (<code>meta_format</code> 2, OSD, созданные до 3.0)</strong> — да, независимо от железа.
Оно падало в хаос-тесте во всех конфигурациях, включая рекомендуемые.</li>
<li><strong>Диски без конденсаторов, десктопные (<code>immediate_commit=none</code>)</strong> — да. В обоих версиях
хранилища исправлены значительные баги, связанные с SYNC, такие, как потеря подтверждённых
данных при отключении питания.</li>
<li><strong>Контрольные суммы с блоком больше 4 КБ (<code>csum_block_size</code>)</strong> — да, и это касается обоих
хранилищ. Чтения частично записанных блоков могли падать с ложной ошибкой контрольной суммы на
совершенно целых данных, а у нового хранилища объект мог стать нечитаемым после отключения
питания даже на серверных SSD.</li>
<li><strong>Новое хранилище на серверных SSD с конденсаторами, чексуммы выключены или 4 КБ</strong> —
обновление рекомендуется, но не срочно. Хаос-тест не поймал новое хранилище на падении
в этой в конфигурации на 3.1.0, а исправления ниже для неё закрывают более редкие ситуации.</li>
</ul>
<h2 id="%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-(%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B5-ssd%2C-%D1%81%D1%83%D0%BC%D0%BC%D1%8B-%D0%B2%D1%8B%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D1%8B-%D0%B8%D0%BB%D0%B8-4-%D0%BA%D0%B1)" tabindex="-1">Исправления для конфигурации по умолчанию (серверные SSD, суммы выключены или 4 КБ) <a class="header-anchor" href="#%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-(%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B5-ssd%2C-%D1%81%D1%83%D0%BC%D0%BC%D1%8B-%D0%B2%D1%8B%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D1%8B-%D0%B8%D0%BB%D0%B8-4-%D0%BA%D0%B1)" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<p>Старое хранилище (<code>meta_format</code> 2):</p>
<ul>
<li>При перезапуске после обрыва журнала на записи, находящейся в начале блока, запись журнала
продолжалась некорректно, так, что новые записи не учитывались при повторном быстром
перезапуске OSD (раньше полного цикла записи всего журнала).</li>
<li>Порядок нескольких одновременных записей в журнал учитывался некорректно, а значит,
запись могла подтвердиться раньше успешного журналирования.</li>
<li>Две записи одного и того же журнального сектора могли лететь одновременно. Теоретически
устройство могло выполнить их в произвольном порядке и повредить журнал.</li>
<li>Счётчики занятого места объектов и OSD могли уйти в минус после перезапуска.</li>
<li>При остановке OSD метаданные грязной записи освобождались через free, не будучи указателем и
портили кучу. Заодно исправлено несколько утечек памяти; тесты теперь гоняются с включённой
проверкой на утечки (ранее в CI проверка была отключена).</li>
<li>Чтения не работали вообще, вместо этого роняя OSD с ошибкой деления на ноль, при выключенных
контрольных суммах и при выключенном <code>inmemory_journal</code>.</li>
<li>При выключенном <code>inmemory_journal</code> неизменённый журнальный сектор — или даже суперблок журнала —
мог быть перезаписан некорректными данными, после чего OSD отказался бы стартовать.</li>
</ul>
<p>Новое хранилище (<code>meta_format</code> 3):</p>
<ul>
<li>При отключении питания во время компактификации могли пропадать объекты с базовой
записью типа big_intent, если их данные были мутированы, а метаданные не были обновлены.
Для серверных SSD данная ситуация редка, но в теории возможна.</li>
</ul>
<h2 id="%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2-%D0%B1%D0%B5%D0%B7-%D0%BA%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%81%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2-(immediate_commit%3Dnone)" tabindex="-1">Исправления для дисков без конденсаторов (<code>immediate_commit=none</code>) <a class="header-anchor" href="#%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2-%D0%B1%D0%B5%D0%B7-%D0%BA%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%81%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2-(immediate_commit%3Dnone)" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<p>Старое хранилище:</p>
<ul>
<li>Исправлено несколько зависаний и падений вокруг удалений, откатов и синков — откат версии,
под которой лежит более новая незасинканная запись, висел вечно; удаление могло уронить
assert во флашере или при записи журнала; удаление одновременно с синком портило внутреннее
состояние.</li>
<li>Старое хранилище: накат журнала мог воскресить устаревшие записи удалённого объекта или
отказаться стартовать с “big_write journal_entry was allocated over another object”.</li>
</ul>
<p>Новое хранилище:</p>
<ul>
<li>SYNC мог вернуть успех, ничего не сбросив (#77, спасибо Changwei Ye). Если два клиента
синкались одновременно, второй забирал счётчик первого и возвращался сразу, поэтому
данные, подтверждённые как засинканные, могли потеряться при отключении питания.</li>
<li>Запись могла потеряться, а более новая запись того же объекта — уцелеть, и объект
оставался на версии, у которой нет предшественника, то есть содержал смесь двух
версий. Теперь все ещё не зафиксированные на диске записи одного объекта записываются
в тот же метаблок и не могут исчезнуть независимо.</li>
<li>Объект мог пропасть целиком после перезапуска, если питание пропадало в середине его
компактификации.</li>
<li>Новые запросы записи могли просто зависнуть после перезапуска.</li>
</ul>
<h2 id="%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%81%D1%83%D0%BC%D0%BC-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5-4-%D0%BA%D0%B1" tabindex="-1">Исправления для блока контрольных сумм больше 4 КБ <a class="header-anchor" href="#%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%81%D1%83%D0%BC%D0%BC-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5-4-%D0%BA%D0%B1" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<p>Только старое хранилище:</p>
<ul>
<li>Чтения частично записанных больших записей сверяли контрольную сумму с данными на диске
вместо явного нулевого дополнения, с которым сумма считалась — поэтому чтение могло упасть с
ложной ошибкой суммы на целых данных. Без этого исправления падает <strong>каждый</strong> сид хаос-теста
в затронутых конфигурациях.</li>
<li>Два падения во время компактификации в <code>fill_partial_checksum_blocks()</code>.</li>
<li>Падение в <code>read_bitmap()</code> при чтении удалённой версии объекта.</li>
<li>Падения с <code>assert(fulfilled == read_op-&gt;len)</code> в <code>dequeue_read()</code>.</li>
</ul>
<h2 id="%D0%BF%D1%80%D0%BE%D1%87%D0%B8%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" tabindex="-1">Прочие исправления <a class="header-anchor" href="#%D0%BF%D1%80%D0%BE%D1%87%D0%B8%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>PG теперь перепириваются при изменении <code>pg_minsize</code>.</li>
<li>Исправлен скрипт <code>make-etcd</code> с IPv4 и автоопределение пула в <code>snap-create</code> (и то, и то сломано в 3.1.0).</li>
<li><code>vitastor-dd</code> теперь определяет seekable-ввод и вывод, включая stdin/stdout.</li>
<li>В VitastorFS исправлены смещение cookie в READDIR, переполнение стека при длинном READDIR из кэша,
добавлено ограничение размера кэша итераторов.</li>
<li>Исправлено потенциальное падение при неполном приёме из сокета, в теории в редких
случаях возможном даже с используемым флагом <code>MSG_WAITALL</code>.</li>
<li>Исправлено падение при инициализации RDMA-CM, когда RDMA-CM недоступен.</li>
<li>Исправлено падение клиента при отсутствующей конфигурации пула или PG во время выполнения запроса.</li>
<li>Конфигурации, в которых запись метаданных больше <code>meta_block_size</code>, теперь отклоняются при
инициализации OSD, а не приводят к делению на ноль в <code>vitastor-disk</code>.</li>
<li>Отклоняются вывернутые диапазоны в DESCRIBE; защищён поиск inode при чтении цепочек.</li>
<li>Также отклоняется <code>WRITE_STABLE</code> поверх нестабильного <code>WRITE</code> в старом хранилище
(неиспользуемый OSD и с неопределённым поведением).</li>
<li>Исправлено несколько замечаний UBSan и санитайзеров: отрицательные смещения на диске, арифметика с
нулевым указателем, <code>memset</code> нулевой длины по NULL, неинициализированная память.</li>
<li>Исправлен ряд краевых случаев в мессенджере: идентификаторы клиентов, <code>outbox_push</code> для уже
несуществующего клиента, некорректный начальный <code>EPOLLIN</code> в HTTP-клиенте.</li>
</ul>
<p>Полный лог коммитов доступен по ссылке на релиз ниже.</p>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.2.0" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.2.0</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-07-24-v3.1.0.html</id>
<title>Выпущена версия Vitastor 3.1.0</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-07-24-v3.1.0.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-07-24T12:00:00Z</published>
<updated>2026-07-24T12:00:00Z</updated>
<content type="html"><p>Наконец, релиз на тему безопасности!</p>
<p>Новые функции:</p>
<ul>
<li><a href="https://vitastor.io/docs/usage/security.html" target="_blank">Полная поддержка функций безопасности</a>:
<ul>
<li>Транспортное шифрование etcd (TLS/mTLS)</li>
<li>Транспортное шифрование OSD (AES-GCM), по умолчанию только для заголовков, поэтому очень быстрое</li>
<li>Сквозное шифрование данных образов (AES-XTS)</li>
<li>Опциональная поддержка хранения ключей AES-XTS во внешнем Vault</li>
<li>Аутентификация по сертификатам</li>
<li>Опциональная поддержка прав доступа пользователей с контролем доступа на стороне etcd и OSD</li>
<li>Транспортные контрольные суммы xxhash3 (по умолчанию только для данных)</li>
</ul>
</li>
<li>Новая опция контрольных сумм на диске: <a href="https://vitastor.io/docs/config/layout-osd.html#data_csum_type" target="_blank">xxh3_32</a> - xxhash3, суженный до 32 бит</li>
<li>Поддержка DNS-имён для адресов etcd и Vault</li>
<li>Режим HTTP API-сервера <a href="https://vitastor.io/docs/usage/cli.html#serve" target="_blank">vitastor-cli serve</a></li>
<li>Смесь CAS и не-CAS записей в рамках одного экземпляра клиента теперь разрешена и работает корректно</li>
<li>make-etcd теперь может инициализировать весь кластер, копируя конфигурацию и запуская все ноды через ssh</li>
<li>Закончена поддержка Debian 10 (Buster) и CentOS 7, пакеты более обновляться не будут</li>
</ul>
<p>Читайте подробную документацию функций безопасности по ссылке: <a href="https://vitastor.io/docs/usage/security.html" target="_blank">https://vitastor.io/docs/usage/security.html</a></p>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.1.0" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.1.0</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-07-19-v3.0.16.html</id>
<title>Выпущена версия Vitastor 3.0.16</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-07-19-v3.0.16.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-07-19T12:00:00Z</published>
<updated>2026-07-19T12:00:00Z</updated>
<content type="html"><p>Много исправлений, но мелких. :-)</p>
<p>Наиболее интересные исправления связаны с пулами без immediate_commit (для настольных SSD):
исправлены граничные случаи операции фиксации изменений (sync) и работа CAS-записей
(используемых, например, в VitastorFS).</p>
<p>Также исправлен баг “double-claim” в новом хранилище и внесены изменения, снижающие
нагрузку на etcd во время активных переключений состояний PG.</p>
<p>Подробнее читайте ниже.</p>
<h2 id="%D0%BD%D0%BE%D0%B2%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" tabindex="-1">Новое хранилище <a class="header-anchor" href="#%D0%BD%D0%BE%D0%B2%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлена причина ошибок ‘double-claim’, обход которых был добавлен в 3.0.12 —
удаление delete-записи при перезапуске могло происходить до удаления замаскированного
ей big_write</li>
<li>Исправлена проверка блочных контрольных сумм (при csum_block_size &gt; 4k) при частичных
чтениях некоторых записей</li>
<li>Исправлено некорректное обрезание конца списка нестабильных объектов в лимитированных
запросах листинга (отправляются scrub-ами)</li>
<li>OSD теперь будет выключаться при ошибках fsync во время пакетных big_write, как и при
других дисковых ошибках</li>
<li>Добавлена отсутствовавшая проверка disable_meta_fsync для включения immediate_commit</li>
</ul>
<h2 id="%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B" tabindex="-1">Клиенты <a class="header-anchor" href="#%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлен пропуск встроенного fsync в CAS-записях (для пулов без immediate_commit)</li>
<li>Добавлена проверка размеров ответов show_config, sec_list и sec_read_bmp</li>
<li>Исправлено то, что ответ show_config обрабатывался как завершённая нулём строка
без учёта длины</li>
</ul>
<h2 id="%D1%81%D1%82%D0%B0%D1%80%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" tabindex="-1">Старое хранилище <a class="header-anchor" href="#%D1%81%D1%82%D0%B0%D1%80%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Добавлен пропуск слишком маленьких (повреждённых) записей журнала</li>
</ul>
<h2 id="osd" tabindex="-1">OSD <a class="header-anchor" href="#osd" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Запрещено создание пулов с block_size*pg_size больше UINT32_MAX</li>
<li>Убрана принудительная отправка статистики OSD после отправки состояний PG
(должно снизить нагрузку на etcd)</li>
<li>Устранены двойные попытки увеличения эпохи PG из нескольких запросов записи,
которые могли приводить к ложным ошибкам обновления состояний PG, дополнительным
перезапускам PG и повышенной нагрузке на etcd</li>
<li>Исправлена обработка PG с pg_size между 32 и 64 (значения больше 64 запрещены ранее)</li>
<li>Для надёжности добавлены проверки ошибок отсутствующих объектов (ENOENT) в операциях
чтения/записи</li>
<li>Первичные записи теперь прерываются с повторяемым кодом ошибки, если PG становится
неактивной во время записи, вместо попытки дорабатывать их до конца</li>
<li>Исправлена корректность операции фиксации (sync) и добавлены тесты для её проверки:
<ul>
<li>Теперь соединения клиентов, писавших в PG, при её перезапуске сбрасываются сразу,
а не ждут завершения всех операций, аналогично ситуации остановки PG</li>
<li>Sync теперь завершается с ошибкой, если клиент писал в PG, ставшие неактивными</li>
<li>Неактивные PG теперь пропускаются при sync (дополнительная проверка) — ранее
без этой и изменения обработки ошибок записи счётчик запущенных операций мог
увеличиваться на отключённых PG и приводить к use-after-free</li>
<li>Соединения клиентов теперь просто сбрасываются вместо возврата ошибки фиксации</li>
</ul>
</li>
<li>Несколько исправлений скрабов:
<ul>
<li>Добавлена проверка битмапов при группировке идентичных EC-частей во время скраба</li>
<li>Исправлен возможный перебор слишком большого числа комбинаций в EC-пулах с большим k+n</li>
<li>Исправлено то, что чтения из деградированных объектов, помеченных как
inconsistent после скраба, не учитывали реальное состояние объекта и могли
возвращать нули</li>
<li>Исправлено некорректное индексирование массива в скрабе (возможно влиявшее
на его результаты)</li>
</ul>
</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.16" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.16</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-06-28-v3.0.15.html</id>
<title>Выпущена версия Vitastor 3.0.15</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-06-28-v3.0.15.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-06-28T12:00:00Z</published>
<updated>2026-06-28T12:00:00Z</updated>
<content type="html"><p>На этот раз исправления мелкие:</p>
<ul>
<li>Найдено и внесено корректное исправление для миграции виртуальных дисков QEMU при
включённом iothread. Проверено, теперь миграция работает. Пакеты QEMU пока обновлены
только для Proxmox 9, через некоторое время будут пересобраны остальные.</li>
<li>Внесены исправления для корректной работы ВМ в Proxmox с swTPM (например, Windows ВМ)
без включения монтирования всех дисков через NBD (спасибо пользователям из чата).</li>
<li>В последних релизах во все Debian-пакеты (но не RPM) прокралась версия Antietcd
со сломанным кластерным режимом - из-за того, что при сборке использовалась версия
Antietcd из master, а не из стабильного тега. Теперь это исправлено, Debian-пакеты
снова собираются со стабильной версией Antietcd, а в самом Antietcd исправлена
кластеризация. Симптомом проблемы была невозможность выбрать лидера в кластере
Antietcd.</li>
<li>Исправлен запуск монитора со встроенным Antietcd при использовании IPv6.</li>
<li>Исправлен подсчёт статистики места в ФС и S3-пулах в новом хранилище (PR <a href="https://github.com/vitalif/vitastor/pull/127" target="_blank">#127</a>).</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.15" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.15</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-06-21-v3.0.14.html</id>
<title>Выпущена версия Vitastor 3.0.14</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-06-21-v3.0.14.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-06-21T12:00:00Z</published>
<updated>2026-06-21T12:00:00Z</updated>
<content type="html"><p>Сколько (багов!) я зарезал, сколько перерезал! (более 50)</p>
<p>Общее замечание: большинство исправлений ошибок теперь сопровождаются регрессионными
тестами, проверяющими, что они не повторятся в будущем. Большинство ошибок, исправленных
в этом релизе, было обнаружено с помощью анализа LLM (Claude Opus/Fable, GPT 5.5).</p>
<h2 id="osd" tabindex="-1">OSD <a class="header-anchor" href="#osd" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлено зависание OSD в бесконечном цикле при установке autosync_interval в 0 во время работы</li>
<li>(ВАЖНО) Исправлено зависание EC PG в состоянии REPEERING, когда последний финальный
commit/rollback в пачке завершается с ошибкой. Интересное замечание: проблема была смежной
с проблемой, классифицированной в 3.0.12 как опасный проезд по памяти, однако, после воспроизведения
в регрессионном тесте выяснилось, что, по-видимому, проезда по памяти там быть не могло.</li>
<li>pg_size ограничен 64, потому что пиринг не поддерживает бОльшие значения для EC —
они просто приводят к появлению объектов в состоянии ‘incomplete’</li>
<li>Исправлен крах OSD с ошибкой “assertion failed” при повторе EIO в цепочке чтения
снапшотов (то есть когда часть чанков относится к повреждённой реплике с несовпадением
контрольной суммы)</li>
<li>(ВАЖНО) Отключён инкрементальный решардинг количества PG из-за возможных конфликтов
с изменениями компактизации (будет включён обратно после исправлений)</li>
<li>(ВАЖНО) Исправлено некорректное восстановление bitmap-ов выделенного места
при цепочечном EC-чтении из снапшотов</li>
<li>Добавлены проверки размеров сетевых запросов, чтобы предотвратить возможные OOM/DoS/повреждения
памяти при получении некорректных данных по сети</li>
<li>(ВАЖНО) Исправлено повреждение bitmap-ов выделенного места при EC-записях без чтения
чётности (то есть когда все OSD с чётностью в PG недоступны)</li>
<li>(ВАЖНО) Исправлено уничтожение bitmap-ов выделенного места живых чанков чётности при
восстановлении EC N+K, K&gt;=2</li>
<li>(ВАЖНО) Исправлен возможный крах OSD при скрабе misplaced-объектов EC</li>
<li>(ВАЖНО) Добавлена проверка консистентности bitmap-ов объектов при скрабе (ранее
проверялись только данные)</li>
<li>(ВАЖНО) Исправлена ситуация, когда повреждённые чанки объектов ошибочно помечались как
неповреждённые при повторном скрабе</li>
<li>(ВАЖНО) Исправлено кэшированное декодирование нескольких страйпов EC через ISA-L
(ISA-L используется по умолчанию)</li>
</ul>
<h2 id="%D0%BD%D0%BE%D0%B2%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" tabindex="-1">Новое хранилище <a class="header-anchor" href="#%D0%BD%D0%BE%D0%B2%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлен теоретически возможный крах OSD при старте при использовании ранее
добавленного обхода проблемы “double-claim”</li>
<li>Устранены теоретически возможные некорректные записи блока метаданных при параллельных
EC COMMIT, перезапускаемых из-за заполнения области метаданных</li>
<li>Исправлено некорректное отслеживание счётчика компактизации после перезапуска OSD
(вероятно могло приводить к тому, что компактизация некорректно перезапускалась после
рестарта)</li>
<li>(ВАЖНО) Исправлена ситуация, когда часть параллельных big_writes могла не дожидаться
fsync данных, тем самым не обеспечивая фиксацию данных на диске</li>
<li>Исправлен возможный крах OSD при повторе sync, когда io_uring заполнен</li>
<li>Исправлен возможный крах при старте на повреждённых данных на диске со слишком
маленькими размерами записей</li>
</ul>
<h2 id="%D1%81%D1%82%D0%B0%D1%80%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" tabindex="-1">Старое хранилище <a class="header-anchor" href="#%D1%81%D1%82%D0%B0%D1%80%D0%BE%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Предотвращена загрузка лишних мусорных записей метаданных из последних 4 МБ области
метаданных</li>
<li>Исправлен возможный крах операций чтения, если чтение метаданных (при
inmemory_metadata=false) перезапускалось из-за заполнения io_uring</li>
<li>Исправлена возможная утечка памяти временных буферов и bitmap-ов/контрольных сумм,
когда чтение перезапускалось из-за заполнения io_uring (воспроизводилось при
inmemory_metadata=false либо block_size&gt;256k)</li>
<li>Исправлен возможный крах OSD при чтениях дополненных блоков контрольных сумм,
если количество буферов превышало 1024 (IOV_MAX) (воспроизводилось только при
csum_block_size &gt; 4k и block_size &gt;= 4M)</li>
<li>(ВАЖНО) Исправлена проверка контрольных сумм журнала при частичном чтении
дополненных блоков с csum_block_size &gt; 4k</li>
<li>Исправлена пометка повреждённых объектов как неповреждённых при сбросе повреждённых
данных из журнала в область данных (при inmemory_journal=false)</li>
<li>(ВАЖНО) Исправлено отложенное освобождение другого блока, когда блок использовался
параллельным чтением</li>
<li>Исправлено некорректное отключение статистики по инодам для FS- и S3-пулов, из-за
чего etcd перегружался ненужной поинодной статистикой, его работа замедлялась,
возрастало потребление памяти и экспортировалось слишком много метрик Prometheus
через монитор</li>
</ul>
<h2 id="%D0%BE%D0%B1%D0%B0-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B0" tabindex="-1">Оба хранилища <a class="header-anchor" href="#%D0%BE%D0%B1%D0%B0-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B0" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлено возможное оставление мусора в области метаданных, если первый запуск OSD
был прерван — заголовок метаданных теперь записывается только после инициализации
метаданных</li>
<li>Добавлена проверка коротких чтений при инициализации (на всякий случай, в реальной
жизни не встречается)</li>
</ul>
<h2 id="%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B" tabindex="-1">Клиенты <a class="header-anchor" href="#%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлено разделение элемента очереди write-back в случае, когда write-back включается
во время работы</li>
<li>Реализованы bdrv_detach_aio_context и bdrv_attach_aio_context в драйвере QEMU
(должно исправить миграцию с iothread)</li>
<li>Устранён крах при заполнении io_uring в ublk-сервере</li>
<li>Исправлена обработка отсутствующего параметра --readonly в NBD-сервере</li>
<li>NBD-сервер теперь плавно завершается по NBD_CMD_DISC, а не просто делает exit(0)</li>
<li>Исправлено определение writeback в ublk-сервере в режиме --image</li>
<li>Ограничен объём входящих данных для NFS-клиентов, чтобы избежать перегрузки памяти
при монтировании с опцией async</li>
</ul>
<h2 id="%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D1%8B-(vitastor-disk%2Fvitastor-cli)" tabindex="-1">Утилиты (vitastor-disk/vitastor-cli) <a class="header-anchor" href="#%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D1%8B-(vitastor-disk%2Fvitastor-cli)" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Устранена возможность выхода vitastor-cli merge до завершения последних операций
sync/delete</li>
<li>Исправлена некорректная валидация слишком большого размера small_write записей в vitastor-disk</li>
<li>Исправлено игнорирование ошибок валидации входных параметров в vitastor-cli merge</li>
<li>Исправлен пропуск финального fsync в vitastor-cli rm-data</li>
<li>Исправлено, что vitastor-disk resize не перемещал последний используемый блок данных</li>
<li>Исправлен некорректный импорт записей small_write нового хранилища в vitastor-disk
write-meta</li>
<li>Исправлен некорректный импорт данных старого хранилища в vitastor-disk write-journal
и write-meta при csum_block_size &gt; 4k</li>
<li>Добавлена поддержка параметра --io в vitastor-disk dump-journal/write-journal</li>
<li>Исправлен крах vitastor-disk resize при конвертации из очень старых (0.5.x) метаданных</li>
<li>Исправлено некорректное округление диапазонов блоков в vitastor-disk trim при явно
заданной опции --discard_granularity &gt; 4k и возможный при этом discard живых данных</li>
<li>Исправлен некорректный импорт метаданных нового хранилища в vitastor-disk write-meta
при размере области метаданных &gt; 4 ГБ</li>
<li>(ВАЖНО) Исправлено то, что vitastor-cli modify --resize на меньший размер очищал все
данные образа O_o</li>
</ul>
<h2 id="%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5" tabindex="-1">Прочее <a class="header-anchor" href="#%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Устранён крах с uncaught exception при наличии в etcd некорректного ключа
/osd/state/ с нечисловым суффиксом (в OSD и во всех клиентских сервисах)</li>
<li>Исправлен возможный крах vitastor-kv при обработке повреждённой БД из-за переполнения
uint32</li>
<li>Исправлен крах аллокатора памяти NFS-RDMA в некоторых ситуациях</li>
<li>Исправлено возможное чтение неаллоцированной памяти при записи за пределами конца
маленького файла в “разделяемого иноде” (NFS)</li>
<li>Добавлены проверки границ для предотвращения переполнений uint32 в NFS/XDR</li>
<li>Повторно включены случайно отключённые проверки безопасности (assert-ы) в файлах
с подключённым cpp-btree</li>
<li>Исправлено некорректное (слишком маленькое) выделение памяти в NFS portmap</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.14" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.14</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-05-31-v3.0.13.html</id>
<title>Выпущена версия Vitastor 3.0.13</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-05-31-v3.0.13.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-05-31T12:00:00Z</published>
<updated>2026-05-31T12:00:00Z</updated>
<content type="html"><ul>
<li>Исправления нового хранилища:
<ul>
<li>Исправлена логика нескольких повторных откатов</li>
<li>Исправлено падение при компактизации полностью откаченного объекта</li>
<li>Исправлено возможное слияние цепочек разных объектов при загрузке с postpone_load</li>
<li>Исправлен импорт блочных контрольных сумм в vitastor-disk write-meta</li>
<li>Исправлен расчёт контрольной суммы заголовка в vitastor-disk write-meta</li>
</ul>
</li>
<li>Исправлена старого хранилища:
<ul>
<li>Исправлен возможный пропуск ожидания пакетного fsync частью корутин</li>
</ul>
</li>
<li>Улучшен тест ENOSPC, исправлено возможное падение при ENOSPC</li>
<li>На всякий случай добавлен fsync при записи суперблока в vitastor-disk prepare</li>
<li>Исправлено возможное падение OSD при включённых pg_locks и ошибке их проверки в sec_read_bmp</li>
<li>Исправлена инициализация VitastorFS при включённых local_reads</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.13" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.13</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-05-17-v3.0.12.html</id>
<title>Выпущена версия Vitastor 3.0.12</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-05-17-v3.0.12.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-05-17T12:00:00Z</published>
<updated>2026-05-17T12:00:00Z</updated>
<content type="html"><h2 id="%D0%B2%D0%B0%D0%B6%D0%BD%D1%8B%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-(%D0%BA%D1%80%D0%BE%D0%BC%D0%B5-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B0)" tabindex="-1">Важные исправления (кроме нового хранилища) <a class="header-anchor" href="#%D0%B2%D0%B0%D0%B6%D0%BD%D1%8B%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-(%D0%BA%D1%80%D0%BE%D0%BC%D0%B5-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B0)" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Исправлено возможное использование освобождённой памяти в OSD при ошибках
начального коммита/отката объектов в EC пулах.</li>
<li>Исправлено возможное освобождение некорректного указателя в OSD при ошибках
чтения из цепочек снапшотов/клонов в EC пулах.</li>
<li>Исправлена возможно некорректная обработка команд commit/rollback в EC пулах
во время изменения числа PG пула.</li>
<li>Инвертирован параметр включения fsync в ublk драйвере (fsync не включался
на пулах без immediate_commit).</li>
<li>В отладочных целях добавлена команда raw-ls для поиска версий объектов в кластере с
помощью операций листингов.</li>
</ul>
<h2 id="%D0%B2-%D0%BD%D0%BE%D0%B2%D0%BE%D0%BC-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" tabindex="-1">В новом хранилище <a class="header-anchor" href="#%D0%B2-%D0%BD%D0%BE%D0%B2%D0%BE%D0%BC-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Ускорен запуск путём использования сортировки по LSN только для объектов с большим числом
промежуточных версий.</li>
<li>Пока не ясна судьба редкой ошибки запуска с сообщением “double claimed block”, наблюдаемой
несколькими пользователями при запуске OSD с новым хранилищем, добавлен обходной манёвр для
её исправления - опция skip_double_claim. На сохранность данных опция не влияет.</li>
<li>Исправлена некорректная перепроверка мелких записей при запуске, в теории возможно приводящая
к появлению дубликатов мелких записей на OSD.</li>
<li>Исправлена работа fsync для дисков с writeback кэшем (без конденсаторов):
<ul>
<li>Исправлена некорректная семантика повторных fsync (следующий не блокировался предыдущим)</li>
<li>Добавлен fsync при копировании мелких записей из буфера на устройство данных (каким-то образом исходно забытый)</li>
<li>Добавлен fsync после начальной сборки мусора при запуске OSD</li>
<li>Исправлено некорректное приведение LSN из uint64 к uint32, ломающее fsync при достижении LSN 2^32</li>
</ul>
</li>
<li>Добавлена отсутствующая проверка контрольной суммы заголовка метаданных хранилища при запуске</li>
<li>Исправлено некорректное обновление контрольных сумм объектов при включённом режиме perfect_csum_update=true</li>
<li>Исправлено возможное падение OSD с assertion failed при обработке некорректной команды EC STABILIZE</li>
<li>Исправлен учёт числа активных корутин-компакторов.</li>
<li>Удалён нерабочий код конвертации из нового в старое хранилище.</li>
</ul>
<h2 id="%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5-%D0%BC%D0%B5%D0%BB%D0%BA%D0%B8%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B" tabindex="-1">Более мелкие исправленные проблемы <a class="header-anchor" href="#%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5-%D0%BC%D0%B5%D0%BB%D0%BA%D0%B8%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Некорректный учёт статистики операций по локальному OSD в реплика-пулах.</li>
<li>Отсутствие индикации ошибок в коде возврата команды vitastor-disk resize.</li>
<li>Отсутствие сброса списка inconsistent объектов при перезапусках PG.</li>
<li>Теоретически возможные зависания прочих операций на OSD при работе над
полностью повреждёнными объектами (без единой доступной копии), и, возможно,
в каких-то других очень редких ситуациях.</li>
<li>Fsync-и при удалении объектов из пулов без immediate_commit (с дисками с
writeback кэшем), ранее теоретически могущие оставлять мусор при удалении
misplaced объектов.</li>
<li>Возможное падение/повреждение памяти NFS сервера при целенаправленной атаке
на NFS-RDMA.</li>
<li>Потенциальная невозможность записи после обработки ошибок ENOSPC/EIO при
записи в реплика-пулах.</li>
<li>Возможное падение вместо выхода с ошибкой при запуске OSD со старым
хранилищем на диске с повреждёнными данными журнала.</li>
<li>Поверхностное копирование конфигурации PG в мониторе, однако, не приводящее
к фактическим ошибкам.</li>
<li>Некорректная проверка выделенных блоков в QEMU драйвере, однако, только в
неиспользуемой ветке кода (без флага BDRV_WANT_ZERO).</li>
<li>Возможная утечка памяти при ошибках чтения повреждённых (corrupted) объектов.</li>
<li>Возможные некорректные состояния PG при обнаружении повреждённых объектов.</li>
<li>Возможная пометка не всех “плохих” копий объекта при скрабах без контрольных
сумм при большом числе реплик (&gt; 4).</li>
<li>Некорректный расчёт контрольных сумм в старом хранилище при
bitmap_granularity &lt; 4096 (практически неиспользуемая конфигурация).</li>
<li>Теоретически возможное падение OSD в редких случаях при scrub и параллельном
восстановлении объекта.</li>
<li>Теоретически возможное падение OSD при обработке ошибок операции PING.</li>
<li>Немного неоптимальная логика переиспользования RDMA-буфера отправки.</li>
<li>Возможная утечка памяти при отключении уже запущенного scrub через no_scrub.</li>
<li>Возможное повреждение памяти при передаче некорректных буферов клиентом
(например, кодом qemu) при включённом writeback кэше.</li>
<li>Потенциально некорректный поиск повреждённых частей EC-объектов (невозможность
найти “хорошую” комбинацию) в scrub при отключённых контрольных суммах.</li>
<li>Возможное использование лишней памяти на стороне OSD при обработке неудачных
чтений из снапшотов (однако, это не утечка - в том смысле, что при отключении
клиента память освобождалась).</li>
<li>Потенциальное резкое замедление записи при определённых значениях pg epoch
из-за некорректной логики обновления эпохи в etcd.</li>
</ul>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.11" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.11</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

<entry>
<id>blog/2026-05-09-v3.0.11.html</id>
<title>Выпущена версия Vitastor 3.0.11</title>
<link rel="alternate" href="https://vitastor.io/blog/2026-05-09-v3.0.11.html" type="text/html" />
<author>
  <name>Виталий Филиппов</name>
  <uri>index.html#/13</uri>
</author>
<published>2026-05-09T12:00:00Z</published>
<updated>2026-05-09T12:00:00Z</updated>
<content type="html"><p>Единственное исправление:</p>
<ul>
<li>Исправлено отсутствие обработки ошибок чтения битмапов во время чтений из EC образов
со снимками или клонированных образов, потенциально приводящее к некорректным чтениям
(чтениям нулей) при перезапусках OSD / переподнятии PG</li>
</ul>
<p>⚠️ Внимание - если баг вас затрагивает, лучше обновляться с приостановкой i/o клиентов</p>
<h2 id="%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" tabindex="-1">Ссылки <a class="header-anchor" href="#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8" aria-hidden="true"><i class="fa fa-link"></i></a></h2>
<ul>
<li>Git: <a href="https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.11" target="_blank">https://git.yourcmc.ru/vitalif/vitastor/releases/tag/v3.0.11</a></li>
<li>Инструкции по установке: <a href="https://vitastor.io/docs/installation/packages.html" target="_blank">https://vitastor.io/docs/installation/packages.html</a></li>
</ul>
</content>
</entry>

</feed>
