Коротко. В ленточной библиотеке кассеты на месте, а продукт считает их отсутствующими и показывает safety = 0. Причина не в железе: продукт нормализует штрихкод, отрезая LTO-суффикс (две последние позиции), а реестр кассет вёл штрихкоды в полной форме. Один и тот же носитель существует в двух видах строк — и сопоставление не сходится.
1. Ситуация
Холодный класс на ленте, кассеты заведены, часть архивов записана. Через какое-то время в GUI
появляются предупреждения о том, что кассет меньше, чем ожидалось, а minimum_tape_safety падает в
ноль. Архивация и restore при этом ведут себя непоследовательно: часть объектов возвращается, часть
«висит».
Интуитивная реакция — проверить библиотеку: слоты, приводы, I/E station. Библиотека показывает кассеты на местах. Продукт — нет.
2. Что видели
- Событие о недостатке кассет / нулевом safety.
- В списке носителей продукта часть кассет имеет состояние, не соответствующий реальному.
- Число «отсутствующих» кассет медленно растёт или скачком появляется после обновления каталога.
- Библиотека (своей консолью) показывает нормальное наличие.
- В реестре кассет, который ведёт оператор, штрихкоды записаны в полной форме, включая суффикс поколения.
3. Механизм
Штрихкод кассеты LTO обычно имеет две части: собственно номер и суффикс поколения — например,
номер плюс L8 для LTO-8. Библиотека отдаёт штрихкод целиком.
Продукт при сопоставлении отрезает две последние позиции — нормализует штрихкод до «номера без поколения». Логика разумная: кассету можно перемаркировать под другое поколение, номер остаётся. Но реестр, который ведёт оператор, часто хранит полную форму.
Дальше простое следствие: строка 000281 в продукте и строка 000281L8 в реестре — для системы
разные носители. Кассета, которую «внесли в реестр», для продукта не внесена; кассета, которую
продукт видит, в реестре оператора отсутствует. Safety считается по тому набору, который видит
продукт.
Второй, более редкий сценарий того же класса: перемаркировка кассеты под другое поколение. Номер тот же, суффикс другой — продукт считает это той же кассетой, а оператор — новым носителем.
Третий: кассета, которая числится отсутствующей дольше заданного окна, автоматически снимается с учёта (у нас — при отсутствии более 96 часов и в пределах порога допустимых «пропавших»). После этого вернуть её в учёт нужно явным действием, а не ожиданием.
4. Как это доказали
- Взяли штрихкод кассеты из консоли библиотеки — полная форма с суффиксом.
- Нашли ту же кассету в списке носителей продукта — номер без суффикса.
- Сравнили списки программно (список библиотеки против реестра с вычтенным суффиксом) и увидели, что расхождение исчезает, если нормализовать обе стороны одинаково.
Это и есть корень: не «библиотека врёт» и не «продукт сломался», а две разные формы одного идентификатора.
5. Что сделали
- Привели реестр к форме продукта — штрихкоды хранятся без LTO-суффикса. Это единственная форма, которая совпадает со штатной нормализацией.
- Пересобрали каталог кассет из фактического состояния библиотеки, а не из журнала оператора: список библиотеки — источник истины по физическому наличию.
- Сверили safety после синхронизации: он должен считаться, а не оставаться нулевым при живых кассетах.
- Зафиксировали правило маркировки: на всех новых кассетах форма штрихкода одна и та же, суффикс поколения в реестр не пишется.
- Добавили проверку в регламент: после каждого пополнения библиотеки — сверка «библиотека против продукта», до первой записи архивов.
Физически кассеты не трогали: перезаписи, перемаркировки и «перезаведения» носителей не потребовалось. Проблема была в форме идентификатора, а не в носителе.
6. Проверка результата
| Гейт | Ожидаемое значение |
|---|---|
| Число носителей в продукте | совпадает с числом кассет в библиотеке |
| Форма штрихкодов | одна и та же с обеих сторон (без суффикса) |
minimum_tape_safety |
больше нуля |
| События о недостатке кассет | не поднимаются заново после цикла проверки |
| Пробный archive/restore | объект ушёл и вернулся, код 200 |
Проверять надо именно после цикла проверки коннектора, а не сразу: список пересобирается не мгновенно.
7. Уроки
- Штрихкод — это идентификатор в системе, а не надпись на наклейке. Форма важнее содержания.
- Продукт нормализует, человек — нет. Везде, где сравниваются списки, нормализовать надо обе стороны одинаково.
- Один формат на все кассеты. «Кто как наклеил» превращается в класс инцидентов.
- Safety — расчётная величина, и она считается по тому, что видит продукт. Ноль не всегда значит «кассет физически нет».
- Автосписание существует. Кассета, отсутствующая дольше окна, уходит из учёта сама — и её возврат требует действия.
- Источник истины по наличию — библиотека. Журнал оператора удобен, но не первичен.
8. Что не стоит делать
- Стирать кассеты, чтобы «начать с чистого листа»: данные на них — это архив, а не тестовый набор.
- Удалять кассету из библиотеки, пока она заведена в продукте: получите ровно тот же класс «пропавших».
- Массово помечать носители неиспользуемыми (
media unused --deleteпачкой): safety обвалится, а вернуть учёт можно только явной операцией. - Перемаркировывать кассеты «под продукт», меняя номер: номер — единственное, что связывает физический носитель с записью в реестре.
- Править реестр вручную по одной строке без сверки: ошибка в одном штрихкоде выглядит как «пропавшая кассета» и уводит разбор в сторону.
Источники
- Cold Storage Tech Brief (доступ 2026-11-07)
- Release Notes 7.3 (доступ 2026-11-07): Tape Space Reclamation, LTO-10, правило
COLD_STORAGE_INVALID_BARCODE_DETECTED(7.1) - Наша практика (обезличенно): ведение реестра кассет и разбор
safety = 0на стенде с холодным классом; окно автосписания и порог «пропавших» — параметры нашей конфигурации, не вендорский факт. - Обновлено: 2026-11-07.