rockspec_format = '3.0' package = 'tnt-loop' version = 'scm-1' source = { url = 'git+https://github.com/tnt-skein/tnt-loop.git', branch = 'main', } description = { summary = 'Периодический цикл на фибере: такт, пауза, остановка', detailed = [[ Всякому наблюдению за кластером нужен один и тот же цикл: сделать такт, дождаться следующего, проснуться сразу при остановке и пережить падение самого такта. Написанный заново в каждом пакете, он в каждом же и ошибается по-своему: то период растёт вместе с временем такта, то остановка ждёт целый период, то исключение молча убивает фибер и наблюдение прекращается навсегда, ничем о себе не сообщив. Пауза считается от начала такта, а не от его конца, и меряется временем планировщика: период не растёт вместе с временем такта и не съедается работой без уступки. Остановка и толчок (wake) будят паузу сразу. Такт идёт под pcall, упавший отдаётся on_error, и бросок самого on_error цикл тоже переживает. Остановка и запуск без уступки между ними не оставляют прежний фибер жить рядом с новым. Настройки проверяются при сборке цикла: имя, такт, период и обработчики не того вида, как и незнакомый ключ, — бросок на строке вызывающего, а не молчащий фибер. Каждый такт идёт в своей области контекста с новым опознавателем request_id — ULID: записи одного такта связаны между собой, у падения такта есть номер для поиска в журнале, а контекст запустившего цикл не наследуется. О том, что именно делается на такте, пакет ничего не знает: от него одинаково зависят и опрос кластера, и смена лидера, и восстановление после отказа. Зависит от tnt-context (область такта), tnt-id (опознаватель такта) и tnt-must (проверка настроек). Покрытие строк и убитых мутантов — 100 %. ]], homepage = 'https://github.com/tnt-skein/tnt-loop', issues_url = 'https://github.com/tnt-skein/tnt-loop/issues', maintainer = 'tnt-skein', license = 'MIT', labels = { 'tarantool', 'fiber', 'loop', 'periodic', 'background', 'context' }, } dependencies = { 'lua >= 5.1', 'tnt-context', 'tnt-id', 'tnt-must', } build = { type = 'builtin', modules = { ['tnt.loop'] = 'tnt/loop.lua', }, }