Модуль net.box
Модуль net.box содержит коннекторы к удаленным системам баз данных.
Один из вариантов предназначен для подключения к MySQL, MariaDB или
PostgreSQL (см. справочник модулей СУБД SQL). Другой
вариант, рассматриваемый в этом разделе, предназначен для подключения к
экземплярам сервера Tarantool по сети.
Примеры на GitHub: sample_db, net_box
В этом руководстве показано, как использовать net.box для подключения
к удаленному экземпляру Tarantool, выполнения операций CRUD и вызова
хранимых процедур. Подробнее об API модуля net.box см.
net_box-module.
В этом разделе описана конфигурация тестовой базы данных, допускающая удаленные подключения:
credentials:users:sampleuser:password: '123456'privileges:- permissions: [ read, write ]spaces: [ bands ]- permissions: [ execute ]functions: [ get_bands_older_than ]groups:group001:replicasets:replicaset001:instances:instance001:iproto:listen:- uri: '127.0.0.1:3301'app:file: 'myapp.lua'
-
Конфигурация содержит один экземпляр, принимающий входящие запросы на адресе
127.0.0.1:3301. -
У пользователя
sampleuserесть привилегии на выборку и изменение данных в спейсеbandsи вызов хранимой функцииget_bands_older_than. Этого пользователя можно использовать для удаленного подключения к экземпляру. -
myapp.luaопределяет модель данных и хранимую функцию. Файлmyapp.luaвыглядит следующим образом:
-- Create a space --box.schema.space.create('bands')-- Specify field names and types --box.space.bands:format({{ name = 'id', type = 'unsigned' },{ name = 'band_name', type = 'string' },{ name = 'year', type = 'unsigned' }})-- Create indexes --box.space.bands:create_index('primary', { parts = { 'id' } })box.space.bands:create_index('band', { parts = { 'band_name' } })box.space.bands:create_index('year_band', { parts = { { 'year' }, { 'band_name' } } })-- Create a stored function --box.schema.func.create('get_bands_older_than', {body = [[function(year)return box.space.bands.index.year_band:select({ year }, { iterator = 'LT', limit = 10 })end]]})
Полный пример доступен на GitHub: sample_db.
Чтобы опробовать запросы net.box в интерактивной консоли, запустите
приложение sample_db с помощью
tt start:
$ tt start sample_db
Затем запустите интерактивную консоль с помощью команды tt run -i:
$ tt run -iTarantool 3.0.0-entrypoint-1144-geaff238d9type 'help' for interactive helptarantool>
В консоли можно создать подключение net.box и опробовать операции с
данными.
Чтобы загрузить модуль net.box, используйте директиву require():
Чтобы создать подключение, передайте URI базы данных в метод net_box.connect():
conn = net_box.connect('sampleuser:123456@127.0.0.1:3301')--[[---...]]
Для проверки состояния подключения можно использовать connection:ping():
conn:ping()--[[---- true...]]
Затем можно получить объект спейса и выполнять с ним операции CRUD,
используя conn.space.<space_name>.
В примере ниже в спейс bands добавляются четыре кортежа:
conn.space.bands:insert({ 1, 'Roxette', 1986 })--[[---- - [1, 'Roxette', 1986]...]]conn.space.bands:insert({ 2, 'Scorpions', 1965 })--[[---- [2, 'Scorpions', 1965]...]]conn.space.bands:insert({ 3, 'Ace of Base', 1987 })--[[---- [3, 'Ace of Base', 1987]...]]conn.space.bands:insert({ 4, 'The Beatles', 1960 })--[[---- [4, 'The Beatles', 1960]...]]
В примере ниже показано, как получить кортеж по указанному значению первичного ключа:
conn.space.bands:select({ 1 })--[[---- - [1, 'Roxette', 1986]...]]
Также можно получить кортеж по значению указанного индекса следующим образом:
conn.space.bands.index.band:select({ 'The Beatles' })--[[---- - [4, 'The Beatles', 1960]...]]
space_object.update() обновляет кортеж, идентифицируемый первичным ключом. Этот метод принимает полный ключ и операцию для выполнения:
conn.space.bands:update({ 2 }, { { '=', 'band_name', 'Pink Floyd' } })--[[---- [2, 'Pink Floyd', 1965]...]]
space_object.upsert() обновляет существующий кортеж или вставляет новый. В примере ниже вставляется новый кортеж:
conn.space.bands:upsert({ 5, 'The Rolling Stones', 1962 }, { { '=', 'band_name', 'The Doors' } })--[[---...]]
В этом примере space_object.replace() используется для удаления существующего кортежа и вставки нового:
conn.space.bands:replace({ 1, 'Queen', 1970 })--[[---- [1, 'Queen', 1970]...]]
Вызов space_object.delete() в примере ниже удаляет
кортеж, значение первичного ключа которого равно 5:
conn.space.bands:delete({ 5 })--[[---- [5, 'The Rolling Stones', 1962]...]]
Чтобы выполнить хранимую процедуру, используйте метод connection:call():
conn:call('get_bands_older_than', { 1966 })-- ----- - [[2, 'Pink Floyd', 1965], [4, 'The Beatles', 1960]]-- ...
Метод connection:close() можно использовать для закрытия соединения, когда оно больше не нужно:
conn:close()--[[---...]]
Можно вызвать следующие методы:
require('net.box')– для получения объектаnet.box(в примерах этого раздела он называетсяnet_box)net_box.connect()– для подключения и получения объекта соединения (в примерах этого раздела он называетсяconn)- другие методы
net.box(), вызываемые с передачейconn:, для выполнения запросов к удаленной системе баз данных conn:close– для отключения
Все методы net.box безопасны для файберов, то есть можно безопасно
обмениваться и использовать один и тот же объект подключения в нескольких
файберах одновременно. Фактически так
лучше всего работать в Tarantool. Когда несколько файберов используют
одно соединение, все запросы передаются по одному сетевому сокету, но
каждый файбер получает правильный ответ. Уменьшение количества активных
сокетов снижает затрату ресурсов на системные вызовы и увеличивает общую
производительность сервера. Однако, в некоторых случаях отдельного
соединения недостаточно — например, когда необходимо отдавать
приоритет разным запросам или использовать различные идентификаторы при
аутентификации.
В большинстве методов net.box можно использовать последний аргумент
{options}, который может быть следующим:
-
{timeout=...}. Например, метод, последним аргументом которого является{timeout=1.5}, остановится через 1,5 секунды на локальном узле, хотя это не гарантирует остановку выполнения на удаленном серверном узле. -
{buffer=...}. Пример см. в описании модуля buffer. -
{is_async=...}. Например, метод, последним аргументом которого является{is_async=true}, не будет ожидать результата запроса. См. описание is_async. -
{on_push=... on_push_ctx=...}. Для получения внеполосных сообщений. См. описание box.session.push(). -
{return_raw=...}(начиная с версии 2.10.0). Если установлено значениеtrue, net.box возвращает данные ответа, обернутые в объект MsgPack, вместо декодирования в Lua. Значение по умолчанию —false. Пример см. в описании параметра ниже.
На диаграмме ниже представлены возможные состояния и варианты перехода из одного состояния в другое:
На этой диаграмме:
-
Метод
net_box.connect()запускает рабочий файбер, который устанавливает соединение и запускает конечный автомат. -
Конечный автомат переходит в состояние
initial. -
Аутентификация и загрузка схемы. Позже можно снова перейти в состояние
fetch_schemaиз состоянияactiveдля перезагрузки схемы. -
Состояние меняется на
graceful_shutdown, когда конечный автомат получает событие box.shutdown от удаленного хоста (см. conn:on_shutdown()). После завершения всех ожидающих запросов конечный автомат переключается в состояниеerror(error_reconnect). -
Транспорт переходит в состояние
errorв случае ошибки. Это может произойти, например, если сервер закрыл соединение. Если задан параметрreconnect_after, транспорт переходит в состояниеerror_reconnectвместо состоянияerror. -
Метод
conn.close()устанавливает состояниеclosedи завершает работу файбера. Если транспорт уже находится в состоянииerror,close()ничего не делает.
Ниже приведен перечень всех функций модуля net.box.
Имя | Назначение |
|---|---|
Создание подключения | |
Выполнение команды PING | |
Ожидание активации или закрытия подключения | |
Проверка активности или закрытия подключения | |
Ожидание целевого состояния | |
Закрытие подключения | |
Выбор одного или нескольких кортежей | |
Выбор кортежа | |
Добавление кортежа | |
Добавление или замена кортежа | |
Обновление кортежа | |
Обновление кортежа | |
Удаление кортежа | |
Вычисление и выполнение выражения в строке | |
Вызов хранимой процедуры | |
Подписка на события, рассылаемые удаленным хостом | |
Определение триггера на подключение | |
Определение триггера на отключение | |
Определение триггера на завершение работы | |
Определение триггера на изменение схемы | |
Создание потока | |
Начало транзакции в потоке | |
Фиксация транзакции в потоке | |
Откат транзакции в потоке |
Создание нового подключения. Подключение устанавливается по требованию
во время первого запроса. Можно повторно установить подключение
автоматически после отключения (см. ниже опцию reconnect_after).
Возвращается объект conn, который поддерживает методы создания
удаленных запросов, таких как select, update или delete.
Параметры:
-
URI— URI целевого объекта подключения. Тип URI может бытьstringилиtable, как и для функции uri.parse(). Табличная форма используется для настройки параметров подключения. Подробнее см. на странице URI. -
options(table) — поддерживаемые опции перечислены ниже:-
user/password: две опции для подключения к удаленному хосту помимо URI. Например, вместоconnect('username:userpassword@localhost:3301')можно написатьconnect('localhost:3301', {user = 'username', password='userpassword'}). -
wait_connected: время ожидания подключения. По умолчанию подключение блокируется до его установления,но если указать
wait_connected=false, подключение возвращается немедленно. Если указать это время ожидания, ожидание будет выполняться перед возвратом (wait_connected=1.5означает ожидание не более 1,5 секунды). -
reconnect_after: количество секунд ожидания перед повторным подключением.Значение по умолчанию, как и для других опций
connect, —nil. Если значениеreconnect_afterбольше нуля, экземплярnet.boxбудет пытаться переподключиться при потере соединения или неудачной попытке подключения. Это делает временные сбои в сети прозрачными для приложения. Повторное подключение выполняется автоматически в фоновом режиме, поэтому запросы, которые изначально завершаются неудачей из-за разрыва соединения, прозрачно повторяются. Количество повторных попыток не ограничено, повторные попытки подключения выполняются через указанный интервал (например,reconnect_after=5означает, что попытки переподключения выполняются каждые 5 секунд). При явном закрытии подключения или удалении его сборщиком мусора Lua попытки переподключения прекращаются. -
connect_timeout: количество секунд ожидания перед возвратом ошибки «error: Connection timed out». -
fetch_schema: логическая опция, управляющая получением изменений схемы с сервера. По умолчанию:true.Если удаленные спейсы не используются, например, выполняются только
callилиeval, задайте значениеfalseдля параметраfetch_schema, чтобы избежать получения изменений схемы, которое в этом случае не требуется. -
required_protocol_version: минимальная версия протокола IPROTO,поддерживаемая сервером. Если версия протокола IPROTO, поддерживаемая сервером, ниже указанной, подключение завершится с ошибкой. При
required_protocol_version = 1все подключения завершаются с ошибкой, если версия протокола IPROTO ниже1. -
required_protocol_features: указанные возможности протокола IPROTO,поддерживаемые сервером. Можно указать одну или несколько возможностей
net.boxиз таблицы ниже. Если сервер не поддерживает указанные возможности, подключение завершится с ошибкой. Приrequired_protocol_features = {'transactions'}все подключения завершаются с ошибкой, если на сервереtransactions: false.
-
Возможность net.box | Назначение | Идентификатор возможности IPROTO | Версии IPROTO, |
|---|---|---|---|
| Требует поддержки потоков на сервере | IPROTO_FEATURE_STREAMS | 1 и новее |
| Требует поддержки транзакций на сервере | IPROTO_FEATURE_TRANSACTIONS | 1 и новее |
| Требует поддержки расширения MsgPack MP_ERROR на сервере | IPROTO_FEATURE_ERROR_EXTENSION | 2 и новее |
| Требует поддержки удаленных наблюдателей на сервере | IPROTO_FEATURE_WATCHERS | 3 и новее |
Подробнее о возможностях IPROTO см. IPROTO_ID и ключ IPROTO_FEATURES.
Возвращает
объект conn
Тип возвращаемого значения
userdata
Примеры:
net_box = require('net.box')conn = net_box.connect('localhost:3301')conn = net_box.connect('127.0.0.1:3302', {wait_connected = false})conn = net_box.connect('127.0.0.1:3304', {required_protocol_version = 4,required_protocol_features = {'transactions', 'streams'},})
new() — синоним connect(). Сохранен для обратной совместимости.
Подробнее см. в описании net_box.connect().
net_box.self — встроенное подключение к текущему экземпляру Tarantool.
Оно создано с целью облегчить полиморфное использование API модуля
net_box. Таким образом, conn = net_box.connect('localhost:3301')
можно заменить на conn = net_box.self.
Однако есть важное отличие встроенного подключения от удаленного:
- При встроенном подключении запросы, не изменяющие данные, не передают управление. При удаленном подключении, в соответствии с правилами неявной передачи управления, любой запрос может передать управление, и состояние базы данных может измениться к моменту возврата управления.
- Все параметры, переданные в запрос (такие как
is_async,on_push,timeout), игнорируются.
Выполнение команды проверки состояния PING.
Параметры:
options(table) — поддерживаемая опция —timeout={seconds}.
Возвращает
true в случае успеха, false в случае ошибки.
Тип возвращаемого значения
boolean
Пример:
net_box.self:ping({timeout = 0.5})
Ожидание активности или закрытия подключения.
Параметры:
timeout(number) — в секундах.
Возвращает
true при подключении, false при неудаче.
Тип возвращаемого значения
boolean
Пример:
net_box.self:wait_connected()
Проверка активности или закрытия подключения.
Возвращает
true при подключении, false при неудаче.
Тип возвращаемого значения
boolean
Пример:
net_box.self:is_connected()
[с 1.7.2] Ожидание нужного состояния.
Параметры:
states(string) — целевые состояния.timeout(number) — в секундах.
Возвращает
true при достижении целевого состояния, false при истечении времени ожидания или
закрытии подключения.
Тип возвращаемого значения
boolean
Примеры:
-- бесконечное ожидание состояния 'active':conn:wait_state('active')-- ожидание не более 1,5 секунды:conn:wait_state('active', 1.5)-- бесконечное ожидание состояния `active` или `fetch_schema`:conn:wait_state({active=true, fetch_schema=true})
Закрытие подключения.
Объекты подключения удаляются сборщиком мусора в Lua, как и любой другой Lua-объект, поэтому удалять их явным образом необязательно. Однако, поскольку close() представляет собой системный вызов, лучше всего закрыть соединение явным образом, когда оно больше не используется, с целью ускорения работы сборщика мусора.
Пример:
conn:close()
conn.space.{имя-спейса}:select({...}) – это удаленный вызов, аналогичный
локальному вызову box.space.{имя-спейса}:select({...})
(детали). В дополнение см.
Модуль buffer и skip-header.
Пример:
conn.space.testspace:select({1,'B'}, {timeout=1})
conn.space.{имя-спейса}:get(...) –
это удаленный вызов, аналогичный локальному вызову
box.space.{имя-спейса}:get(...)
(детали).
Пример:
conn.space.testspace:get({1})
conn.space.{имя-спейса}:insert(...)
– это удаленный вызов, аналогичный локальному вызову
box.space.{имя-спейса}:insert(...)
(детали). В дополнение см.
Модуль buffer и skip-header.
Пример:
conn.space.testspace:insert({2,3,4,5}, {timeout=1.1})
conn.space.{имя-спейса}:replace(...)
– это удаленный вызов, аналогичный локальному вызову
box.space.{имя-спейса}:replace(...)
(детали). В дополнение см.
Модуль buffer и skip-header.
Пример:
conn.space.testspace:replace({5,6,7,8})
conn.space.{имя-спейса}:update(...)
– это удаленный вызов, аналогичный локальному вызову
box.space.{имя-спейса}:update(...).
Пример:
conn.space.Q:update({1},{{'=',2,5}}, {timeout=0})
conn.space.{имя-спейса}:upsert(...)
– это удаленный вызов, аналогичный локальному вызову
box.space.{имя-спейса}:upsert(...)
(детали). В дополнение см.
Модуль buffer и skip-header.
conn.space.{имя-спейса}:delete(...)
– это удаленный вызов, аналогичный локальному вызову
box.space.{имя-спейса}:delete(...) (детали). В дополнение см.
Модуль buffer и skip-header.
conn:eval({Lua-строка}) оценивает и
выполняет выражение в Lua-строке, которое может представлять собой
любое выражение или несколько выражений. Требуются
права на выполнение; если у
пользователя таких прав нет, администратор может их выдать с помощью
box.schema.user.grant({имя-пользователя}, 'execute', 'universe').
Чтобы гарантировать, что conn:eval вернет то, что возвращает
выражение на Lua, начните Lua-строку со слова "return" (вернуть).
Примеры:
tarantool> -- Lua-строкаtarantool> conn:eval('function f5() return 5+5 end; return f5();')---- 10tarantool> -- Lua-строка, {аргументы}tarantool> conn:eval('return ...', {1,2,{3,'x'}})---- 1- 2- [3, 'x']tarantool> -- Lua-строка, {аргументы}, {параметры}tarantool> conn:eval('return {nil,5}', {}, {timeout=0.1})---- [null, 5]
conn:call('func', {'1', '2', '3'}) – это удаленный вызов, аналогичный
func('1', '2', '3'). Таким образом, conn:call представляет собой
удаленный вызов хранимой процедуры. conn:call возвращает то, что
возвращает функция.
Ограничение: вызванная функция не может вернуть функцию, например, если
func2 определяется как function func2 () return func end, то
conn:call(func2) вернет ошибку "error: unsupported Lua type
'function'".
Примеры:
tarantool> -- создание 2 функций с помощью conn:eval()tarantool> conn:eval('function f1() return 5+5 end;')tarantool> conn:eval('function f2(x,y) return x,y end;')tarantool> -- вызов первой функции без параметров и опцийtarantool> conn:call('f1')---- 10tarantool> -- вызов второй функции с двумя параметрами и одной опциейtarantool> conn:call('f2',{1,'B'},{timeout=99})---- 1- B
Подписка на события, рассылаемые удаленным хостом.
Параметры:
key(string) — имя ключа события, на которое оформляется подпискаfunc(function) — функция обратного вызова, вызываемая при обновлении значения ключа
Возвращает
дескриптор наблюдателя. Дескриптор содержит один метод —
unregister(), который отменяет регистрацию наблюдателя.
Подробнее о наблюдателях см. в разделе Функции для наблюдателей.
Метод имеет тот же синтаксис, что и функция box.watch(), используемая для локальной подписки на события.
Наблюдатели сохраняются при повторном подключении (см.
параметр подключения reconnect_after). Все
зарегистрированные наблюдатели автоматически подписываются заново при
восстановлении соединения.
Если удаленный хост поддерживает наблюдателей, в
peer_protocol_features соединения будет установлен ключ watchers.
Подробнее см. в таблице возможностей net.box.
Пример 1:
Сервер:
-- Рассылка значения 42 для ключа 'foo'.box.broadcast('foo', 42)
Клиент:
conn = net_box.connect(URI)local log = require('log')-- Подписка на обновления ключа 'foo'.w = conn:watch('foo', function(key, value)assert(key == 'foo')log.info("The box.id value is '%d'", value)end)
Если наблюдатель больше не нужен, его можно отменить с помощью следующей команды:
w:unregister()
Пример 2:
Модуль net.box позволяет отслеживать
обновления конфигурации,
хранящейся в хранилище конфигураций на базе Tarantool, путем наблюдения
за изменениями пути или префикса. В примере ниже
conn:watch() используется для отслеживания обновлений
конфигурации, хранящейся по пути /myapp/config/all:
net_box = require('net.box')local conn = net_box.connect('127.0.0.1:4401')local log = require('log')conn:watch('config.storage:/myapp/config/all', function(key, value)log.info("Configuration stored by the '/myapp/config/all' key is changed")end)
Полный пример доступен здесь: config_storage.
{is_async=true|false} – это опция, которую можно применить во всех
запросах net_box, включая conn:call, conn:eval и запросы
conn.space.space-name.
По умолчанию, is_async=false, что означает, что запросы будут
синхронными для файбера. Файбер блокируется в ожидании ответа на запрос
или до истечения времени ожидания. До версии Tarantool 1.10 единственным
способом выполнения асинхронных запросов было использование отдельных
файберов.
is_async=true означает, что запросы будут асинхронными для файбера.
Запрос вызывает передачу управления, но файбер не входит в режим
ожидания. Сразу же возвращается результат, но это будет не результат
запроса, а объект, который может использовать вызывающая программа для
получения результат запроса.
У такого сразу же возвращаемого объекта, который мы называем "future" (будущий), есть собственные методы:
-
future:is_ready()— возвращает true, когда результат запроса доступен; -
future:result()— получает результат запроса (возвращает ответ или nil, если результат еще не готов или произошла ошибка); -
future:wait_result(timeout)— ожидает доступности результата запроса и затем получает его, либо выбрасывает ошибку, если по истечении времени ожидания результат отсутствует; -
future:discard()— отменяет объект. В обычной ситуации пользователь введет командуfuture=имя-запроса(...{is_async=true}), а затем либо цикл с проверкойfuture:is_ready()до тех пор, пока он не вернет true, и получением результата с помощьюrequest_result=future:result(), либо же командуrequest_result=future:wait_result(...). Возможен вариант, когда клиент проверяет наличие внеполосных сообщений от сервера, вызывая в циклеpairs()– см. box.session.push().Можно использовать
future:discard(), чтобы соединение забыло об ответе – если получен ответ для отброшенного объекта, то он будет проигнорирован, так что размер таблицы запросов будет уменьшен, а другие запросы будут выполняться быстрее.
Примеры:
-- Асинхронная вставка кортежа --tarantool> future = conn.space.bands:insert({10, 'Queen', 1970}, {is_async=true})---tarantool> future:is_ready()---- truetarantool> future:result()---- [10, 'Queen', 1970]
-- Итерация по спейсу с 10 записями для получения данных порциями по 3 записи --
tarantool> while true do> future = conn.space.bands:select({}, {limit=3, after=position,> fetch_pos=true, is_async=true})> result = future:wait_result()> tuples = result[1]> position = result[2]> if position == nil then break end> print('Chunk size: '..#tuples)> endChunk size: 3Chunk size: 3Chunk size: 3Chunk size: 1
Как правило, {is_async=true} используется только при большой загрузке
(более 100 000 запросов в секунду) и большой задержке чтения (более 1
секунды), или же при необходимости отправки нескольких одновременных
запросов, которые собирают ответы (что иногда называется
"отображение-свертка").
{return_raw=true} игнорируется для:
- Методов, возвращающих
nil:begin,commit,rollback,upsert,prepare. index.count(возвращает число).
Для execute опция применяется только к данным (rows). Метаданные
декодируются даже при {return_raw=true}.
Пример:
local c = require('net.box').connect(uri)local mp = c.eval('eval ...', {1, 2, 3}, {return_raw = true})mp:decode() -- {1, 2, 3}
Опция может быть полезна, если нужно передать ответ дальше без декодирования или с частичным декодированием. Использование объекта MsgPack может снизить нагрузку на сборщик мусора Lua.
Создание потока.
Пример:
-- Запуск сервера для создания нового потокаlocal conn = net_box.connect('localhost:3301')local conn_space = conn.space.testlocal stream = conn:new_stream()local stream_space = stream.space.test
Начало транзакции в потоке. Вместо прямого вызова метода можно также
использовать методы call, eval или execute для работы с
SQL-транзакцией.
Параметры:
txn_isolation— уровень изоляции транзакций
Фиксация транзакции в потоке. Вместо прямого вызова метода можно также
использовать методы call, eval или execute для работы с
SQL-транзакцией.
Примеры:
-- Начало транзакции в потокеstream:begin()-- В ранее созданном спейсе `accounts` с первичным ключом `test` изменяются поля 2 и 3stream.space.accounts:update(test_1, {{'-', 2, 370}, {'+', 3, 100}})-- Фиксация транзакции в потокеstream:commit()
Откат транзакции в потоке. Вместо прямого вызова метода можно также
использовать методы call, eval или execute для работы с
SQL-транзакцией.
Пример:
-- Тестирование отката для memtx-спейсаspace:replace({1})-- Select возвращает ранее добавленный кортеж, так как этот select относится к транзакции в потокеspace:select({})stream:rollback()-- Select возвращает пустой результат, выполнен откат транзакции в потокеspace:select({})
В модуле net.box можно использовать следующие
триггеры:
Определение триггера, исполняемого при установке нового соединения,
когда аутентификация и получение схемы завершены в результате события,
например net_box.connect.
Если функция триггера отправляет запросы net_box, они должны быть
асинхронными ({is_async = true}). Попытка
дождаться завершения запроса с помощью future:pairs() или
future:wait_result() в функции триггера приведет к ошибке.
Если выполнение триггера завершается неудачей и возникает исключение,
состояние соединения изменяется на 'error'. В этом случае соединение
разрывается независимо от значения параметра reconnect_after. Может
вызываться столько раз, сколько происходит переподключений, если
значение reconnect_after больше нуля.
Параметры:
trigger-function(function) — функция триггера. Принимает объектconnв качестве первого аргумента.old-trigger-function(function) — существующая функция триггера, которую нужно заменить наtrigger-function.
Возвращает
nil или указатель на функцию
Определение триггера, исполняемого после закрытия соединения. Если функция с триггером вызывает ошибку, то ошибка записывается в журнал, в противном случае записей не будет. Выполнение прекращается после явного закрытия соединения или удаления сборщиком мусора в Lua.
Параметры:
trigger-function(function) — функция триггера. Принимает объектconnв качестве первого аргумента.old-trigger-function(function) — существующая функция триггера, которую нужно заменить наtrigger-function.
Возвращает
nil или указатель на функцию
Определение триггера для завершения работы при получении события box.shutdown.
Триггер запускается в новом файбере. Пока триггер on_shutdown()
выполняется, соединение остается активным. Это означает, что
callback-функция триггера может отправлять новые запросы.
После возврата из триггера соединение net.box переходит в состояние
graceful_shutdown (подробнее см.
диаграмму состояний). В этом состоянии отправка
новых запросов не допускается. Соединение ожидает завершения всех
незавершенных запросов.
После обработки всех выполняемых запросов соединение закрывается.
Состояние изменяется на error или error_reconnect (если задан
параметр reconnect_after).
Серверы, не поддерживающие событие box.shutdown или
IPROTO_WATCH, просто разрывают соединение без
предупреждения. В этом случае триггер on_shutdown() не выполняется.
Параметры:
trigger-function(function) — функция триггера. Принимает объектconnв качестве первого аргумента.old-trigger-function(function) — существующая функция триггера, которую нужно заменить наtrigger-function.
Возвращает
nil или указатель на функцию
Определение триггера, исполняемого во время выполнения определенной операции на удаленном сервере после обновления схемы. Другими словами, если запрос к серверу не выполняется из-за ошибки несовпадения версии схемы, происходит перезагрузка схемы.
Если функция триггера отправляет запросы net_box, они должны быть
асинхронными ({is_async = true}). Попытка
дождаться завершения запроса с помощью future:pairs() или
future:wait_result() в функции триггера приведет к ошибке.
Параметры:
trigger-function(function) — функция триггера. Принимает объектconnв качестве первого аргумента.old-trigger-function(function) — существующая функция триггера, которую нужно заменить наtrigger-function.
Возвращает
nil или указатель на функцию
Подробная информация о триггерах приведена в разделе триггеры.