āĻāĻŋāĻā§ āĻ¸āĻŽāĻ¯āĻŧ āĻāĻā§ āĻāĻŽāĻ°āĻž āĻĢāĻžāĻāĻāĻž āĻāĻžāĻ¯āĻŧāĻāĻžāĻ¯āĻŧ āĻāĻŋāĻĒāĻ˛ āĻĒāĻ°āĻŋāĻˇā§āĻāĻžāĻ° āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽā§āĻŽā§āĻā§āĻ¨ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛āĻžāĻŽ
āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻāĻŋāĻ˛ āĻā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻā§āĻ˛ āĻŽāĻĄāĻŋāĻāĻ˛ āĻ¨āĻžāĻŽāĻ
āĻŦāĻŋāĻŦāĻ°āĻŖ
āĻā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻā§āĻ˛ā§āĻ° āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻā§āĻŦ āĻāĻžāĻ˛ā§
āĻāĻ¸ā§āĻ¨ āĻĻā§āĻ° āĻĨā§āĻā§ āĻļā§āĻ°ā§ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻā§āĻ¯āĻžāĻĒāĻĄ āĻŽā§āĻ¯āĻŧāĻžāĻĻā§āĻ¤ā§āĻ¤ā§āĻ°ā§āĻŖ āĻŽāĻĄāĻŋāĻāĻ˛āĻāĻŋ āĻŦāĻžāĻāĻ°ā§ āĻĨā§āĻā§ āĻā§āĻŽāĻ¨ āĻĻā§āĻāĻžāĻ¯āĻŧ āĻ¤āĻž āĻĻā§āĻā§āĻ¨:
fiber = require('fiber')
net_box = require('net.box')
box.cfg{listen = 3300}
box.schema.func.create('libcapped-expirationd.start', {language = 'C'})
box.schema.user.grant('guest', 'execute', 'function', 'libcapped-expirationd.start')
box.schema.func.create('libcapped-expirationd.kill', {language = 'C'})
box.schema.user.grant('guest', 'execute', 'function', 'libcapped-expirationd.kill')
box.schema.space.create('tester')
box.space.tester:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
capped_connection = net_box:new(3300)
āĻ¸āĻ°āĻ˛āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻžāĻĻā§āĻ° libcapped-expirationd.so āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻ¯ā§ āĻĄāĻŋāĻ°ā§āĻā§āĻāĻ°āĻŋāĻ¤ā§ āĻ āĻŦāĻ¸ā§āĻĨāĻŋāĻ¤ āĻ¸ā§āĻāĻžāĻ¨ā§ āĻāĻŽāĻ°āĻž tarantool āĻāĻžāĻ˛ā§ āĻāĻ°āĻŋāĨ¤ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻĨā§āĻā§ āĻĻā§āĻāĻŋ āĻĢāĻžāĻāĻļāĻ¨ āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ: āĻ¸ā§āĻāĻžāĻ°ā§āĻ āĻāĻŦāĻ āĻŽā§āĻ˛āĨ¤ āĻĒā§āĻ°āĻĨāĻŽ āĻ§āĻžāĻĒ āĻšāĻ˛ āĻ˛ā§āĻ¯āĻŧāĻž āĻĨā§āĻā§ box.schema.func.create āĻāĻŦāĻ box.schema.user.grant āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻ āĻĢāĻžāĻāĻļāĻ¨āĻā§āĻ˛āĻŋ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻāĻ°āĻžā§ˇ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻāĻŽāĻ¨ āĻāĻāĻāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨ āĻ¯āĻžāĻ° āĻāĻŋāĻĒāĻ˛ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻŋāĻ¨āĻāĻŋ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻĨāĻžāĻāĻŦā§: āĻĒā§āĻ°āĻĨāĻŽāĻāĻŋ āĻāĻāĻāĻŋ āĻ āĻ¨āĻ¨ā§āĻ¯ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§, āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻāĻŋ āĻšāĻ˛ āĻāĻŽā§āĻ˛ āĻāĻŦāĻ āĻ¤ā§āĻ¤ā§āĻ¯āĻŧāĻāĻŋ āĻāĻŋāĻĒāĻ˛ā§āĻ° āĻā§āĻŦāĻ¨āĻāĻžāĻ˛āĨ¤ āĻāĻŽāĻ°āĻž āĻĒā§āĻ°āĻĨāĻŽ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ° āĻāĻĒāĻ°ā§ āĻāĻāĻāĻŋ āĻāĻžāĻā§āĻ° āĻ¸ā§āĻāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻŦāĻ˛āĻŋāĨ¤ āĻāĻ°āĻĒāĻ°ā§ āĻāĻŽāĻ°āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨ā§āĻāĻŋāĻ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋāĻ¤ā§ āĻ¸āĻāĻ¯ā§āĻ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻŋ āĻĒāĻžāĻāĨ¤
āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĻŋāĻŽā§āĻ˛āĻ āĻāĻžāĻā§āĻ° āĻĒāĻ°ā§, āĻ¸ā§āĻāĻžāĻ°ā§āĻ āĻĢāĻžāĻāĻļāĻ¨āĻāĻŋ āĻāĻžāĻ˛āĻžāĻ¨:
capped_connection:call('libcapped-expirationd.start', {'non-indexed', box.space.tester.id, box.space.tester.index.primary, box.space.tester.index.primary, 3, 1024, 3600})
āĻāĻ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻāĻŋ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ˛ā§āĻ¯āĻŧāĻžāĻ¤ā§ āĻ˛ā§āĻāĻž āĻŽā§āĻ¯āĻŧāĻžāĻĻā§āĻ¤ā§āĻ¤ā§āĻ°ā§āĻŖ āĻŽāĻĄāĻŋāĻāĻ˛ā§āĻ° āĻŽāĻ¤ā§āĻ āĻāĻžāĻ āĻāĻ°āĻŦā§āĨ¤ āĻ¸ā§āĻāĻžāĻ°ā§āĻ āĻĢāĻžāĻāĻļāĻ¨ā§āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻšāĻ˛ āĻāĻžāĻ¸ā§āĻā§āĻ° āĻ āĻ¨āĻ¨ā§āĻ¯ āĻ¨āĻžāĻŽāĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻāĻŋ āĻšāĻ˛ āĻ¸ā§āĻĨāĻžāĻ¨ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§āĨ¤ āĻ¤ā§āĻ¤ā§āĻ¯āĻŧāĻāĻŋ āĻāĻāĻāĻŋ āĻ āĻ¨āĻ¨ā§āĻ¯ āĻ¸ā§āĻāĻ āĻ¯āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻŋāĻĒāĻ˛āĻā§āĻ˛āĻŋ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻŦā§āĨ¤ āĻāĻ¤ā§āĻ°ā§āĻĨāĻāĻŋ āĻšāĻ˛ āĻ¸ā§āĻāĻ āĻ¯āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻŋāĻĒāĻ˛āĻā§āĻ˛āĻŋāĻā§ āĻ āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻāĻ°āĻž āĻšāĻŦā§ā§ˇ āĻĒāĻā§āĻāĻŽ āĻšāĻ˛ āĻ˛āĻžāĻāĻĢāĻāĻžāĻāĻŽ āĻ¸āĻš āĻāĻŋāĻĒāĻ˛ āĻĢāĻŋāĻ˛ā§āĻĄā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž (āĻ¸āĻāĻā§āĻ¯āĻž 1 āĻĨā§āĻā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ, 0 āĻ¨āĻ¯āĻŧ!)āĨ¤ āĻˇāĻˇā§āĻ āĻāĻŦāĻ āĻ¸āĻĒā§āĻ¤āĻŽ āĻšāĻ˛ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨āĻŋāĻ āĻ¸ā§āĻāĻŋāĻāĻ¸āĨ¤ 1024 āĻšāĻ˛ āĻ¸āĻ°ā§āĻŦāĻžāĻ§āĻŋāĻ āĻ¸āĻāĻā§āĻ¯āĻ āĻāĻŋāĻĒāĻ˛ āĻ¯āĻž āĻāĻāĻāĻŋ āĻāĻāĻ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§ āĻĻā§āĻāĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤ 3600 - āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻ¸āĻŽāĻ¯āĻŧāĨ¤
āĻŽāĻ¨ā§ āĻ°āĻžāĻāĻŦā§āĻ¨ āĻ¯ā§ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻā§āĻ°āĻ˛āĻŋāĻ āĻāĻŦāĻ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻ āĻ¸ā§āĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻžāĻā§āĻ° āĻ¸ā§āĻāĻ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§ āĻā§āĻ°ā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¸āĻžāĻ˛āĻāĻŋ āĻā§āĻ āĻā§ āĻĨā§āĻā§ āĻŦāĻĄāĻŧ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋ āĻ āĻ¨ā§āĻ¯ āĻāĻŋāĻā§ āĻĨāĻžāĻā§, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻšā§āĻ¯āĻžāĻļ āĻ¸ā§āĻāĻ, āĻ¤āĻŦā§ āĻā§āĻ°āĻžāĻāĻžāĻ°ā§āĻ¸āĻžāĻ˛āĻāĻŋ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§, āĻāĻ˛ā§āĻŽā§āĻ˛ā§ āĻā§āĻ°āĻŽā§ āĻ¸āĻā§āĻāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸ā§āĻĒā§āĻ¸ āĻāĻŋāĻĒāĻ˛ āĻāĻ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
60 āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻā§āĻŦāĻ¨āĻāĻžāĻ˛ā§āĻ° āĻ¸āĻžāĻĨā§ āĻŽāĻšāĻžāĻāĻžāĻļā§ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻāĻŋāĻĒāĻ˛ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻāĻ°āĻž āĻ¯āĻžāĻ:
box.space.tester:insert{0, '[email protected]', math.floor(fiber.time()) + 60}
box.space.tester:insert{1, '[email protected]', math.floor(fiber.time()) + 60}
box.space.tester:insert{2, '[email protected]', math.floor(fiber.time()) + 60}
āĻāĻ¸ā§āĻ¨ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻĻā§āĻāĻŋ āĻ¯ā§ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻ¸āĻĢāĻ˛ āĻšāĻ¯āĻŧā§āĻā§:
tarantool> box.space.tester.index.primary:select()
---
- - [0, '[email protected]', 1576418976]
- [1, '[email protected]', 1576418976]
- [2, '[email protected]', 1576418976]
...
āĻāĻ¸ā§āĻ¨ 60+ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻĒāĻ°ā§ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨āĻāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋ āĻāĻ°āĻŋ (āĻĒā§āĻ°āĻĨāĻŽ āĻāĻŋāĻĒāĻ˛ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļā§āĻ° āĻļā§āĻ°ā§ āĻĨā§āĻā§ āĻāĻŖāĻ¨āĻž āĻāĻ°āĻž āĻšāĻā§āĻā§) āĻāĻŦāĻ āĻĻā§āĻā§āĻ¨ āĻ¯ā§ āĻā§āĻ¯āĻžāĻĒāĻĄ āĻŽā§āĻ¯āĻŧāĻžāĻĻ āĻļā§āĻˇ āĻšāĻāĻ¯āĻŧāĻž āĻŽāĻĄāĻŋāĻāĻ˛āĻāĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§:
tarantool> box.space.tester.index.primary:select()
---
- []
...
āĻāĻžāĻ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻž āĻ¯āĻžāĻ:
capped_connection:call('libcapped-expirationd.kill', {'non-indexed'})
āĻāĻ¸ā§āĻ¨ āĻāĻāĻāĻŋ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§āĻāĻŋ āĻ¯ā§āĻāĻžāĻ¨ā§ āĻā§āĻ°āĻ˛ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻ¸ā§āĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ:
fiber = require('fiber')
net_box = require('net.box')
box.cfg{listen = 3300}
box.schema.func.create('libcapped-expirationd.start', {language = 'C'})
box.schema.user.grant('guest', 'execute', 'function', 'libcapped-expirationd.start')
box.schema.func.create('libcapped-expirationd.kill', {language = 'C'})
box.schema.user.grant('guest', 'execute', 'function', 'libcapped-expirationd.kill')
box.schema.space.create('tester')
box.space.tester:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
box.space.tester:create_index('exp', {unique = false, parts = {3, 'unsigned'}})
capped_connection = net_box:new(3300)
āĻāĻŋāĻā§ āĻŦā§āĻ¯āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻāĻžāĻĄāĻŧāĻž āĻāĻāĻžāĻ¨ā§ āĻ¸āĻŦāĻāĻŋāĻā§ āĻĒā§āĻ°āĻĨāĻŽ āĻāĻĻāĻžāĻšāĻ°āĻŖā§āĻ° āĻŽāĻ¤ā§āĻāĨ¤ āĻāĻŽāĻ°āĻž āĻ¤ā§āĻ¤ā§āĻ¯āĻŧ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ° āĻāĻĒāĻ°ā§ āĻāĻāĻāĻŋ āĻāĻžāĻā§āĻ° āĻ¸ā§āĻāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻāĻā§āĻ¸āĻĒ āĻŦāĻ˛āĻŋāĨ¤ āĻāĻ āĻ¸ā§āĻāĻāĻāĻŋ āĻ āĻ¨āĻ¨ā§āĻ¯ āĻšāĻ¤ā§ āĻšāĻŦā§ āĻ¨āĻž, āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻ¨āĻžāĻŽāĻ āĻ¸ā§āĻāĻā§āĻ° āĻŦāĻŋāĻĒāĻ°ā§āĻ¤ā§āĨ¤ āĻā§āĻ°āĻžāĻāĻžāĻ°ā§āĻ¸āĻžāĻ˛ āĻāĻā§āĻ¸āĻĒā§āĻ°ā§āĻ¸ āĻāĻ¨āĻĄā§āĻā§āĻ¸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻžāĻšāĻŋāĻ¤ āĻšāĻŦā§, āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻŦā§āĨ¤ āĻāĻŽāĻ°āĻž āĻŽāĻ¨ā§ āĻāĻ°āĻŋ āĻ¯ā§ āĻāĻā§ āĻāĻāĻ¯āĻŧāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻ¸ā§āĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛āĨ¤
āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĻŋāĻŽā§āĻ˛āĻ āĻāĻžāĻā§āĻ° āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž āĻ¨āĻ¤ā§āĻ¨ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻ¸āĻš āĻ¸ā§āĻāĻžāĻ°ā§āĻ āĻĢāĻžāĻāĻļāĻ¨ āĻāĻžāĻ˛āĻžāĻ:
capped_connection:call('libcapped-expirationd.start', {'indexed', box.space.tester.id, box.space.tester.index.primary, box.space.tester.index.exp, 3, 1024, 3600})
60 āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻā§āĻŦāĻ¨āĻāĻžāĻ˛ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻŦāĻžāĻ° āĻŽāĻšāĻžāĻāĻžāĻļā§ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻāĻŋāĻĒāĻ˛ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻāĻ°āĻž āĻ¯āĻžāĻ:
box.space.tester:insert{0, '[email protected]', math.floor(fiber.time()) + 60}
box.space.tester:insert{1, '[email protected]', math.floor(fiber.time()) + 60}
box.space.tester:insert{2, '[email protected]', math.floor(fiber.time()) + 60}
30 āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻĒāĻ°ā§, āĻāĻĒāĻŽāĻž āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§, āĻāĻŽāĻ°āĻž āĻāĻ°āĻ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻāĻŋāĻĒāĻ˛ āĻ¯ā§āĻ āĻāĻ°āĻŦ:
box.space.tester:insert{3, '[email protected]', math.floor(fiber.time()) + 60}
box.space.tester:insert{4, '[email protected]', math.floor(fiber.time()) + 60}
box.space.tester:insert{5, '[email protected]', math.floor(fiber.time()) + 60}
āĻāĻ¸ā§āĻ¨ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻĻā§āĻāĻŋ āĻ¯ā§ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻ¸āĻĢāĻ˛ āĻšāĻ¯āĻŧā§āĻā§:
tarantool> box.space.tester.index.primary:select()
---
- - [0, '[email protected]', 1576421257]
- [1, '[email protected]', 1576421257]
- [2, '[email protected]', 1576421257]
- [3, '[email protected]', 1576421287]
- [4, '[email protected]', 1576421287]
- [5, '[email protected]', 1576421287]
...
āĻāĻ¸ā§āĻ¨ 60+ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻĒāĻ°ā§ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨āĻāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋ āĻāĻ°āĻŋ (āĻĒā§āĻ°āĻĨāĻŽ āĻāĻŋāĻĒāĻ˛ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļā§āĻ° āĻļā§āĻ°ā§ āĻĨā§āĻā§ āĻāĻŖāĻ¨āĻž āĻāĻ°āĻž āĻšāĻā§āĻā§) āĻāĻŦāĻ āĻĻā§āĻā§āĻ¨ āĻ¯ā§ āĻā§āĻ¯āĻžāĻĒāĻĄ āĻŽā§āĻ¯āĻŧāĻžāĻĻ āĻļā§āĻˇ āĻšāĻāĻ¯āĻŧāĻž āĻŽāĻĄāĻŋāĻāĻ˛āĻāĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§:
tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
- [4, '[email protected]', 1576421287]
- [5, '[email protected]', 1576421287]
...
āĻŽāĻšāĻžāĻāĻžāĻļā§ āĻāĻāĻ¨āĻ āĻāĻŋāĻā§ āĻāĻŋāĻĒāĻ˛ āĻŦāĻžāĻāĻŋ āĻāĻā§ āĻ¯ā§āĻā§āĻ˛ā§āĻ° āĻŦāĻžāĻāĻāĻ¤ā§ āĻāĻ°āĻ ā§Šā§Ļ āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻ¸āĻŽāĻ¯āĻŧ āĻ˛āĻžāĻāĻŦā§āĨ¤ āĻ āĻ§āĻŋāĻāĻ¨ā§āĻ¤ā§, 30 āĻāĻ° āĻāĻāĻĄāĻŋ āĻāĻŦāĻ 2 āĻāĻ° āĻā§āĻŦāĻ¨āĻāĻžāĻ˛ā§āĻ° āĻāĻāĻāĻŋ āĻāĻŋāĻāĻĒāĻ˛ āĻĨā§āĻā§ 1576421257 āĻāĻ° āĻāĻāĻĄāĻŋ āĻāĻŦāĻ 3 āĻāĻ° āĻā§āĻŦāĻ¨āĻāĻžāĻ˛ā§āĻ° āĻāĻŋāĻĒāĻ˛ā§ āĻ¯āĻžāĻāĻ¯āĻŧāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧāĨ¤ 1576421287 āĻŦāĻž āĻ¤āĻžāĻ° āĻŦā§āĻļāĻŋ āĻā§āĻŦāĻ¨āĻāĻžāĻ˛ā§āĻ° āĻāĻŋāĻĒāĻ˛ āĻ āĻ°ā§āĻĄāĻžāĻ°ā§āĻ° āĻāĻžāĻ°āĻŖā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋāĨ¤ āĻāĻā§āĻ¸āĻĒā§āĻ°ā§āĻ¸ āĻāĻ¨āĻĄā§āĻā§āĻ¸ āĻā§āĨ¤ āĻāĻāĻŋ āĻ¸ā§āĻ āĻ¸āĻā§āĻāĻ¯āĻŧ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻļā§āĻ°ā§āĻ¤ā§āĻ āĻ āĻ°ā§āĻāĻ¨ āĻāĻ°āĻ¤ā§ āĻā§āĻ¯āĻŧā§āĻāĻŋāĻ˛āĻžāĻŽāĨ¤
āĻāĻžāĻ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻž āĻ¯āĻžāĻ:
capped_connection:call('libcapped-expirationd.kill', {'indexed'})
āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨
āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦāĻ˛āĻžāĻ° āĻ¸āĻ°ā§āĻŦā§āĻ¤ā§āĻ¤āĻŽ āĻāĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻāĻ° āĻŽā§āĻ˛ āĻā§āĻ¸āĨ¤
āĻāĻŽāĻ°āĻž āĻ¯ā§ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋāĻā§ āĻ¸ā§āĻāĻžāĻ°ā§āĻ āĻŽā§āĻĨāĻĄā§ āĻĒāĻžāĻ¸ āĻāĻ°āĻŋ āĻ¤āĻž expirationd_task āĻ¨āĻžāĻŽā§ āĻāĻāĻāĻŋ āĻāĻžāĻ āĻžāĻŽā§āĻ¤ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ:
struct expirationd_task
{
char name[256];
uint32_t space_id;
uint32_t rm_index_id;
uint32_t it_index_id;
uint32_t it_index_type;
uint32_t field_no;
uint32_t scan_size;
uint32_t scan_time;
};
āĻ¨āĻžāĻŽ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻāĻžāĻ¸ā§āĻā§āĻ° āĻ¨āĻžāĻŽāĨ¤ āĻ¸ā§āĻĒā§āĻ¸_āĻāĻāĻĄāĻŋ āĻ ā§āĻ¯āĻžāĻā§āĻ°āĻŋāĻŦāĻŋāĻāĻ āĻšāĻ˛ āĻ¸ā§āĻĒā§āĻ¸ āĻāĻāĻĄā§āĻ¨ā§āĻāĻŋāĻĢāĻžāĻ¯āĻŧāĻžāĻ°āĨ¤ rm_index_id āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻāĻŋ āĻ āĻ¨āĻ¨ā§āĻ¯ āĻ¸ā§āĻāĻā§āĻ° āĻ¸āĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§ āĻ¯āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻŋāĻĒāĻ˛āĻā§āĻ˛āĻŋ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻŦā§āĨ¤ it_index_id āĻ ā§āĻ¯āĻžāĻā§āĻ°āĻŋāĻŦāĻŋāĻāĻ āĻšāĻ˛ āĻ¸ā§āĻāĻā§āĻ° āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§ āĻ¯āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻŋāĻĒāĻ˛āĻā§āĻ˛āĻŋāĻā§ āĻ āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ it_index_type āĻ ā§āĻ¯āĻžāĻā§āĻ°āĻŋāĻŦāĻŋāĻāĻ āĻšāĻ˛ āĻ¸ā§āĻāĻā§āĻ° āĻ§āĻ°āĻ¨ āĻ¯āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻŋāĻĒāĻ˛āĻā§āĻ˛āĻŋāĻā§ āĻ āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ file_no āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻšāĻ˛ āĻ˛āĻžāĻāĻĢāĻāĻžāĻāĻŽ āĻ¸āĻš tuple āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻžāĨ¤ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨_āĻ¸āĻžāĻāĻ āĻ ā§āĻ¯āĻžāĻā§āĻ°āĻŋāĻŦāĻŋāĻāĻ āĻšāĻ˛ āĻ¸āĻ°ā§āĻŦā§āĻā§āĻ āĻ¸āĻāĻā§āĻ¯āĻ āĻāĻŋāĻĒāĻ˛ āĻ¯āĻž āĻāĻāĻāĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨_āĻāĻžāĻāĻŽ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻāĻŋ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻ¸āĻŽāĻ¯āĻŧāĨ¤
āĻāĻŽāĻ°āĻž āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°āĻŦ āĻ¨āĻžāĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻļā§āĻ°āĻŽāĻ¸āĻžāĻ§ā§āĻ¯ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻšāĻ āĻāĻžāĻ, āĻ¯āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°āĻŦā§
āĻāĻŽāĻ°āĻž āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĢāĻžāĻāĻļāĻ¨ā§āĻ° āĻĒā§āĻ°ā§āĻā§āĻāĻžāĻāĻĒ āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻā§āĻā§āĻ¤ āĻāĻ°āĻŋ:
bool expirationd_parse_name(struct expirationd_task *task, const char **pos);
bool expirationd_parse_space_id(struct expirationd_task *task, const char **pos);
bool expirationd_parse_rm_index_id(struct expirationd_task *task, const char **pos);
bool expirationd_parse_rm_index_unique(struct expirationd_task *task, const char **pos);
bool expirationd_parse_rm_index(struct expirationd_task *task, const char **pos);
bool expirationd_parse_it_index_id(struct expirationd_task *task, const char **pos);
bool expirationd_parse_it_index_type(struct expirationd_task *task, const char **pos);
bool expirationd_parse_it_index(struct expirationd_task *task, const char **pos);
bool expirationd_parse_field_no(struct expirationd_task *task, const char **pos);
bool expirationd_parse_scan_size(struct expirationd_task *task, const char **pos);
bool expirationd_parse_scan_time(struct expirationd_task *task, const char **pos);
āĻāĻāĻ¨ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻŦāĻŋāĻˇāĻ¯āĻŧā§āĻ° āĻĻāĻŋāĻā§ āĻ¯āĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻ - āĻ¸ā§āĻĨāĻžāĻ¨ āĻŦāĻžāĻāĻĒāĻžāĻ¸ āĻāĻ°āĻž āĻāĻŦāĻ āĻāĻŋāĻĒāĻ˛āĻ¸ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻžāĻ° āĻ¯ā§āĻā§āĻ¤āĻŋāĨ¤ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨_āĻ¸āĻžāĻāĻā§āĻ° āĻā§āĻ¯āĻŧā§ āĻŦāĻĄāĻŧ āĻ¨āĻ¯āĻŧ āĻāĻŋāĻĒāĻ˛ā§āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻŦā§āĻ˛āĻ āĻāĻāĻāĻŋ āĻāĻāĻ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻ āĻ§ā§āĻ¨ā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋ āĻ¸āĻĢāĻ˛ āĻšāĻ¯āĻŧ, āĻāĻ āĻ˛ā§āĻ¨āĻĻā§āĻ¨āĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋāĻŦāĻĻā§āĻ§ āĻšāĻ¯āĻŧ; āĻ¯āĻĻāĻŋ āĻ¤ā§āĻ°ā§āĻāĻŋ āĻāĻā§ āĻ¤āĻŦā§ āĻāĻāĻŋ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§ āĻāĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ expirationd_iterate āĻĢāĻžāĻāĻļāĻ¨ā§āĻ° āĻļā§āĻˇ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ āĻšāĻ˛ āĻāĻāĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻāĻāĻāĻŋ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻžāĻ° āĻ¯ā§āĻāĻžāĻ¨ āĻĨā§āĻā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨āĻŋāĻ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ āĻŦāĻž āĻāĻ˛āĻ¤ā§ āĻĨāĻžāĻā§āĨ¤ āĻāĻ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋāĻāĻžāĻ°ā§ āĻ āĻā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§āĻŖāĻāĻžāĻŦā§ āĻŦā§āĻĻā§āĻ§āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯āĻ¤āĻā§āĻˇāĻŖ āĻ¨āĻž āĻāĻāĻāĻŋ āĻ¤ā§āĻ°ā§āĻāĻŋ āĻāĻā§, āĻ¸ā§āĻĨāĻžāĻ¨ āĻĢā§āĻ°āĻŋāĻ¯āĻŧā§ āĻ¨āĻž āĻ¯āĻžāĻ¯āĻŧ, āĻŦāĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻŋ āĻāĻā§ āĻĨā§āĻā§ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻž āĻ¸āĻŽā§āĻāĻŦ āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ expirationd_expired āĻĢāĻžāĻāĻļāĻ¨ āĻāĻŋāĻĒāĻ˛ā§āĻ° āĻā§āĻŦāĻ¨āĻāĻžāĻ˛ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§, expirationd_delete āĻāĻāĻāĻŋ āĻāĻŋāĻĒāĻ˛ āĻŽā§āĻā§ āĻĻā§āĻ¯āĻŧ, expirationd_breakable āĻā§āĻ āĻāĻ°ā§ āĻ¯ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻāĻŋāĻ¯āĻŧā§ āĻ¯ā§āĻ¤ā§ āĻšāĻŦā§ āĻāĻŋāĻ¨āĻžāĨ¤
expirationd_iterate āĻĢāĻžāĻāĻļāĻ¨ āĻā§āĻĄ:
static bool
expirationd_iterate(struct expirationd_task *task, box_iterator_t **iterp)
{
box_iterator_t *iter = *iterp;
box_txn_begin();
for (uint32_t i = 0; i < task->scan_size; ++i) {
box_tuple_t *tuple = NULL;
if (box_iterator_next(iter, &tuple) < 0) {
box_iterator_free(iter);
*iterp = NULL;
box_txn_rollback();
return false;
}
if (!tuple) {
box_iterator_free(iter);
*iterp = NULL;
box_txn_commit();
return true;
}
if (expirationd_expired(task, tuple))
expirationd_delete(task, tuple);
else if (expirationd_breakable(task))
break;
}
box_txn_commit();
return true;
}
āĻĢāĻžāĻāĻļāĻ¨ āĻā§āĻĄ expirationd_expired:
static bool
expirationd_expired(struct expirationd_task *task, box_tuple_t *tuple)
{
const char *buf = box_tuple_field(tuple, task->field_no - 1);
if (!buf || mp_typeof(*buf) != MP_UINT)
return false;
uint64_t val = mp_decode_uint(&buf);
if (val > fiber_time64() / 1000000)
return false;
return true;
}
āĻĢāĻžāĻāĻļāĻ¨ āĻā§āĻĄ expirationd_delete:
static void
expirationd_delete(struct expirationd_task *task, box_tuple_t *tuple)
{
uint32_t len;
const char *str = box_tuple_extract_key(tuple, task->space_id, task->rm_index_id, &len);
box_delete(task->space_id, task->rm_index_id, str, str + len, NULL);
}
āĻĢāĻžāĻāĻļāĻ¨ āĻā§āĻĄ expiration_breakable:
static bool
expirationd_breakable(struct expirationd_task *task)
{
return task->it_index_id != task->rm_index_id && task->it_index_type == ITER_GT;
}
āĻāĻŦā§āĻĻāĻ¨
āĻāĻĒāĻ¨āĻŋ āĻā§āĻ¸ āĻā§āĻĄ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨
āĻāĻ¤ā§āĻ¸: www.habr.com