Ресурсы
Объявление возвращает хэндл
Объявление ресурса — обычный вызов функции в пайплайне. Он возвращает хэндл немедленно, не блокируя; запись создаётся, а реальный ресурс сходится в фоне:
Выходы ресурса доступны только через Ready: первое чтение ждёт
схождения, ошибка готовности валит ран в точке чтения. Неготовый
ресурс невозможно использовать по построению. Кому нужна ошибка в
руки — TryReady: та же операция, возвращающая ошибку значением
вместо падения рана.
Запись живёт жизненным циклом
За каждым ресурсом — ровно одна запись. Её фаза видна в любой момент:
Запись — живой процесс: пока ресурс существует, она периодически сверяет наблюдаемое состояние с желаемым. Исчезновение и расхождение — повод пересоздать или довести; что считать расхождением — знание ресурсной библиотеки.
У каждого ресурса один владелец
Владелец — тот, вместе с кем ресурс умирает: другой ресурс, ран или
стенд. Ровно один; по умолчанию — создавший ран. Владельцы образуют
дерево: оно задаётся Parent и Children и меняется передачей:
Удаление владельца удаляет всё его поддерево, глубже — раньше: vm прежде подсети, подсеть прежде сети. Сиблинги — записи под одним владельцем — уходят одновременно: четыре vm под одной подсетью удаляются за время одной. Зависимость между записями — ребро владения; две записи, которые нельзя удалять одновременно, кладутся одна под другую. Отменённый или упавший ран — та же смерть: его поддерево уходит той же дорогой, и ран закрывается, как только поддерева нет: executor машины, чей агент уже не отвечает (vm только что удалена), собирается позже и ран не держит. Запись, чья декларация УПАЛА, закрыта, но объявленное под ней — нет: снос прогона обходит и закрытые записи прогона и удаляет всё, что под ними ещё живо, — машины под сетью, в которой отказало облако, не остаются работать.
Два принципа держатся везде:
- Владение отдают — его не забирают. Передачу выполняет сторона текущего владельца; ничто не может присвоить ресурс себе.
- Чужое нельзя ни обременить, ни отдать. Чужой ресурс можно присоединить — распознать и читать как любой хэндл, — но присоединённый ресурс не может быть родителем или ребёнком.
Пережить свой ран
По умолчанию ресурсы рана умирают вместе с раном. Единственный способ пережить его — явная передача: другому ресурсу или стенду — постоянному владельцу, который есть у каждого пайплайна. Передача переносит ресурс вместе с поддеревом и может задать срок жизни — по его истечении сервер удаляет поддерево сам:
Без срока переданный ресурс живёт до явного удаления.
Команды stand accept, extend, release возвращают {"count": N} —
число удерживаемых корней после команды. Полный список и сроки находятся
в state.holdings: graphenectl get stand/<pipeline>.
Ответы компактны: entity переносит последние 100 ответов через Continue-as-New.
Holdings и сроки хранения сохраняются; полный state stand по-прежнему
ограничен лимитом размера workflow payload в Temporal.