rockspec_format = '3.0' package = 'tnt-schema' version = 'scm-1' source = { url = 'git+https://github.com/tnt-skein/tnt-schema.git', branch = 'main', } description = { summary = 'Миграции схемы спейсов Tarantool: версия в базе, шаги в коде', detailed = [[ В базе хранится номер версии схемы, в коде — пронумерованные шаги. Раннер догоняет базу до кода: шаг и запись новой версии идут одной транзакцией, и изменение либо применено целиком, либо не применено вовсе. Спейс с версией реплицируемый: шаги идут на лидере, реплики получают результат журналом и повторно его не применяют. Отката нет намеренно: DDL уезжает на реплики журналом, и понижение версии отвергается. Пропуск в нумерации, версия в базе новее кода, инстанс только для чтения — отказ до первого шага, а не посреди подъёма. Шаг идёт в транзакции и уступать не может, поэтому срез файбера раннер отдаёт ему целиком — уступкой перед шагом и после него, — а долгому шагу срез задают при регистрации. Пока раннер стоит на уступке, версия перечитывается: шаг поверх чужого не применяется. Той же транзакцией, что шаг и версия, ложится запись журнала шагов: когда, каким узлом и сколько миллисекунд шёл шаг. status() сводит версию в базе, журнал и шаги кода в одну картину — что применено, что ждёт, чего в коде уже нет — и читает и на реплике. Зависимости: tnt-must (проверка аргументов) и tnt-external (подмена уступки, часов и имени узла в проверках). Покрытие строк и убитых мутантов — 100 %. ]], homepage = 'https://github.com/tnt-skein/tnt-schema', issues_url = 'https://github.com/tnt-skein/tnt-schema/issues', maintainer = 'tnt-skein', license = 'MIT', labels = { 'tarantool', 'schema', 'migrations', 'versioning', 'ddl' }, } dependencies = { 'lua >= 5.1', 'tnt-must', 'tnt-external', } build = { type = 'builtin', modules = { ['tnt.schema'] = 'tnt/schema.lua', }, }