Триггеры
Триггеры, которые также называют обратными вызовами, представляют собой функции, которые выполняет сервер при наступлении определенных событий.
Чтобы связать событие с колбэк-функцией, передайте её в соответствующую функцию обработки событий on_event
:
- box.session.on_connect() или box.session.on_disconnect(),
- box.session.on_auth(),
- space_object:on_replace() или space_object:before_replace(),
- box.on_commit() или box.on_rollback(),
- net.box.on_connect() или net.box.on_disconnect(),
- net.box.on_schema_reload(),
- box.ctl.on_schema_init() или box.ctl.on_shutdown(),
- swim_object:on_member_event(),
- box.session.on_access_denied().
Тогда сервер сохранит колбэк-функцию и будет вызывать ее при наступлении соответствующего события.
У всех триггеров есть следующие особенности:
- Только пользователь «admin» определяет триггеры.
- Триггеры хранятся в памяти экземпляра Tarantool, а не в базе данных. Поэтому триггеры пропадают, когда экземпляр отключают. Чтобы сохранить их, поместите определения функции и настройки триггера в скрипт инициализации Tarantool.
- Триггеры не тратят много ресурсов. Если триггер не задан, то требуется минимум вычислений — разыменование и проверка указателя. Если триггер определен, то стоимость вызова равна стоимости вызова функции.
- Для одного события можно определить несколько триггеров. В таком случае триггеры выполняются в обратном порядке относительно того, как их определили.
- Триггеры должны работать в контексте события, то есть оперировать переменными, которые переданы как аргументы его функции. Триггеры не должны влиять на глобальное состояние программы или менять параметры, не связанные с событием. Если триггер выполняет такие вызовы, как, например, os.exit() или box.rollback(), результат его выполнения не определен.
- Триггеры можно заменять. Запрос на «замену триггера» подразумевает передачу новой функции-триггера и старой функции-триггера в одну из функций обработки событий
on_event
. - Во всех функциях обработки событий
on_event
есть параметры, которые представляют собой указатели функции, и все они возвращают указатели функции. Следует запомнить, что определение Lua-функции, например,function f() x = x + 1 end
значит то же самое, чтоf = function () x = x + 1 end
, поскольку в обоих случаяхf
получит указатель функции. Аtrigger = box.session.on_connect(f)
значит то же самое, чтоtrigger = box.session.on_connect(function () x = x + 1 end)
— в обоих случаяхtrigger
получит переданный указатель функции. - Если вызвать любую из функций обработки событий
on_event
без аргументов, то она вернет список соответствующих триггеров. Например,box.session.on_connect()
вернет таблицу со всеми функциями-триггерами на подключение. - Триггеры можно использовать для решения проблем с репликацией. Более подробную информацию см. в разделе Решение конфликтов репликации.
Пример:
Здесь мы записываем события подключения и отключения в журнал на сервере Tarantool.
log = require('log')
function on_connect_impl()
log.info("connected "..box.session.peer()..", sid "..box.session.id())
end
function on_disconnect_impl()
log.info("disconnected, sid "..box.session.id())
end
function on_auth_impl(user)
log.info("authenticated sid "..box.session.id().." as "..user)
end
function on_connect() pcall(on_connect_impl) end
function on_disconnect() pcall(on_disconnect_impl) end
function on_auth(user) pcall(on_auth_impl, user) end
box.session.on_connect(on_connect)
box.session.on_disconnect(on_disconnect)
box.session.on_auth(on_auth)