Right now the expirationd worker start can be delayed until the space it is supposed to scan is created
However, there is no such mechanism for the is_expired function.
Consider this scenario:
cartridge-extensions is used
- we want to inject the function we would use as the
is_expired function through cartridge-extensions
- supply a function to be used as the
is_expired function
- configure
expiratoind to use this function
Like this (in clusterwide config):
extensions/expiration.lua
local M = {}
local fiber = require('fiber')
function M.check_ttl(args, tuple)
local now = fiber.time()
local ttl = tuple[args.ttl_field]
local timestamp = tuple[args.timestamp_field]
if (ttl == nil or timestamp == nil) then
return false
end
return now > timestamp + ttl
end
return M
extensions/config.yml
functions:
check_ttl:
module: extensions.expiration
handler: check_ttl
events:
- binary:
path: __check_ttl
expirationd.yml
# tasks
expire_session:
space: session
is_expired: __check_ttl
options:
args:
ttl_field: max_inactive_interval
timestamp_field: last_accessed_time
is_master_only: true
This scenario would work until a restart of one instance occurs. After the restart, an error as this would occur:
text
myapp.s2-1 | 2023-03-10 16:36:10.086 [32983] main/103/init.lua confapplier.lua:156 E> Instance entering failed state: ConfigFound -> InitError
myapp.s2-1 | ValidateConfigError: ...p/.rocks/share/tarantool/cartridge/roles/expirationd.lua:188: ...p/.rocks/share/tarantool/cartridge/roles/expirationd.lua:130: expirationd: is_expired must be a function name in _G
myapp.s2-1 | stack traceback:
myapp.s2-1 | ...p/.rocks/share/tarantool/cartridge/roles/expirationd.lua:188: in function <...p/.rocks/share/tarantool/cartridge/roles/expirationd.lua:171>
myapp.s2-1 | [C]: in function 'xpcall'
myapp.s2-1 | ...ring_session_tnt/myapp/.rocks/share/tarantool/errors.lua:145: in function 'pcall'
myapp.s2-1 | ...ion_tnt/myapp/.rocks/share/tarantool/cartridge/roles.lua:377: in function 'validate_config'
myapp.s2-1 | ...t/myapp/.rocks/share/tarantool/cartridge/confapplier.lua:863: in function 'init'
myapp.s2-1 | ...g_session_tnt/myapp/.rocks/share/tarantool/cartridge.lua:858: in function 'cfg'
myapp.s2-1 | /home/bass/LocalCode/spring_session_tnt/myapp/init.lua:36: in main chunk
screenshot

The error is unfixable via configuration re-application, as you can't apply config in a cluster that is in error state.
As a solution, I think that this could be done:
- relax the requirement on the
is_tuple_expired argument so as to not require for the specified function to exist when the expirationd.start is called
Right now the expirationd worker start can be delayed until the space it is supposed to scan is created
However, there is no such mechanism for the
is_expiredfunction.Consider this scenario:
cartridge-extensionsis usedis_expiredfunction through cartridge-extensionsis_expiredfunctionexpiratoindto use this functionLike this (in clusterwide config):
extensions/expiration.lua
extensions/config.yml
expirationd.yml
This scenario would work until a restart of one instance occurs. After the restart, an error as this would occur:
text
screenshot
The error is unfixable via configuration re-application, as you can't apply config in a cluster that is in error state.
As a solution, I think that this could be done:
is_tuple_expiredargument so as to not require for the specified function to exist when theexpirationd.startis called