
ืขืืืขืืข ืืึธื ืฆืืจืืง ืืืจ ืืขื ืขื ืคืืืกื ืืื ืื ืคึผืจืึธืืืขื ืคืื ืจืืื ืืงืื ื ืืืคึผืืขืก ืืื ืกืคึผืืืกืึทื . ืจืืื ืืงืื ื ืืื ืฆื ืืืื ืกืืึทืจืืขื ื ืืฉื ืืืขื ืืึทืจืึทื ืืึธืึธื ืืื ืฉืืื ืคืืืกื ืืืง ืืืืก ืคืื ืืึผืจืื, ืึธืืขืจ ืืื ืฉืืืึทืื ืืื ืืื ืึท ืืืืขืจ ืึธืคืืงืืึทื. ืคึฟืึทืจ ืืขื ืึทืจืืขื, tarantool ืืื ืึท ืืึธืืืืข ืืขืฉืจืืื ืืื Lua ืืขืจืืคื . ื ืึธื ื ืืฆื ืืขื ืืึธืืืืข ืคึฟืึทืจ ืึท ืงืืจืฅ ืฆืืึทื, ืืืจ ืืืื ืืขืืขื ืึทื ืขืก ืืื ื ืืฉื ืคึผืึทืกืืง ืคึฟืึทืจ ืืื ืื: ืจืขืื ืฆื ืงืขืกืืืืขืจืืืง ืจืืื ืืงืื ื ืคืื ืืจืืืก ืึทืืึทืื ืฅ ืคืื ืืึทืื, ืืืึท ืืขืืื ืืขื ืืื ืื ืืง. ืืขืจืืืขืจ, ืืืจ ืืขืืึทื ืง ืืืขืื ืืขืืืขืืึธืคึผืื ื ืืื ืืืขืจ ืืืืื ืงืึทืคึผื ืขืงืกืคึผืขืจืืืฉืึทื ืืึธืืืืข, ืืึธืืคึผืื ื ืึทื ืืขืจ ืงืึธื ืืขืฉืจืืื ืืื ืึท ืืขืืืืจื ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทื ืืืึธืื ืกืึธืืืืข ืืื ืืืขืจ ืคึผืจืึธืืืขืืก ืืื ืืขืจ ืืขืกืืขืจ ืืขืืืขื ืืืขื.
ื ืืื ืืืึทืฉืคึผืื ืคึฟืึทืจ ืืื ืื ืืื ืืขืืืขื ืื ืืึทืจืึทื ืืึธืึธื ืืึธืืืืข ืืขืจืืคื . ืืขืจ ืฆืืืึทื ื ืืืึธืก ืืื ืืขื ืืฆื ืืื ืืื ืืื ืืืืืจื ืืืืฃ ืืขื ืคืึทืงื ืึทื ืึท ืืึทืืื ืืขืจ ืคืขืื ืืื ืืืฉืืคื ืืื ืื ืคึผืืึทืฅ, ืืืึธืก ืื ืืืงืืืฅ ืื ืืขืื ืคืื ืื ืืืคึผืืข, ืืื ืื ืืขืจืข ืืืขืจืืขืจ, ืืื. ืืขืจ ืืึธืืืืข ืืื ืืขืจ ืืื ืืขืจืืจืื ื ืกืงืึทื ื ืื ืคึผืืึทืฅ, ืงืึทืืคึผืขืจื ืื TTL ืืื ืื ืงืจืึทื ื ืฆืืื ืืื ืืืกืืืื ืฆื ืฆื ืืืกืืขืงื ืื ืืืคึผืืข ืึธืืขืจ ื ืืฉื. ืื ืืขืืงืึทืืฉืขื ืืึธืืืืข ืงืึธื ืืื ืคึผืฉืื ืืื ืขืืขืืึทื ื, ืึธืืขืจ ืืืื ืืืฉืึทื ืขืจืืง. ืขืจืฉืืขืจ, ืขืก ืืื ื ืืฉื ื ืขืืขื ืืื ืืฉืืื ืื ืืืคึผ ืคืื ืืื ืืขืงืก ืืืึธืก ืืื ืงืจืึธืื ืืื ืืืืกืืขืืขืงื. ืฆืืืืืื ืก, ืืืืฃ ืืขืืขืจ ืคืึธืจื ืึทืืข ืืืคึผืืขืก ืืขื ืขื ืกืงืึทื ื, ืื ื ืืืขืจ ืคืื ืืืึธืก ืงืขื ืขื ืืืื ืืึทื ืฅ ืืจืืืก. ืืื ืืืื ืืื ืื ืขืงืกืคึผืขืจืืืืื ืืึธืืืืข ืืขืจ ืขืจืฉืืขืจ ืคึผืจืึธืืืขื ืืื ืกืึทืืืื (ืืขืจ ืืืื ืืื ืืขืงืก ืืื ืืขืืืขื ืืคืืขืฉืืืื ืืื ืึท ืืึทืืื ืืขืจ ืงืืึทืก), ืืขืืึธืื ืืขืจ ืฆืืืืืืขืจ ื ืึธื ืืื ื ืืฉื ืืึทืงืืืขื ืงืืื ืืคืืขืจืงืืึทืืงืืึทื. ืื ืืจืื ืคืื ืงืื ืคึผืจืืืืืขืจืืื ื ืื ืืจืืจื ืืื ืืืืืืข ืคืื โโืฉืจืืืื ืืืื ืืืืื ืงืึธื.
ืืึทืฉืจืืึทืืื ื
ืื ืืึทืงืืืืขื ืืืืฉืึทื ืคึฟืึทืจ ืืึทืจืึทื ืืึธืึธื ืืื ืึท ืืืืขืจ ืืื ืืืขืื ืืื ืฆื ืฉืจืืึทืื ืืืื ืกืืึธืจื ืคึผืจืึธืืกืืืืฉืขืจื ืืื C. ืขืจืฉืืขืจ ืคืื ืึทืืข, ืืื ืคึฟืึธืจืฉืืึธืื ืืืจ ืืืงืขื ืขื ืืื ืืื ืขืก ืืื ืกืืจ ืฆื ืคึฟืึทืจืฉืืืื ืื ืื ืกืขืจืฅ ืืื ืงืึทืืึทื ืื ืืื ืงืึธื ืืืึธืก ืืืขื ืืขืจืฉืืึทื ืขื ืืื ืื. ืขืก ืืื ืืืื ืืืขืจื ืฆื ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืึทื ืฆื ืึทืืืืฉืขืงืฅ ืืืึธืก ืืขื ืขื ืืืจืขืืืืื ืืืขื ืฉืจืืืื ืืืื ืืืืืขื ืข ืงืึทืคึผื ืืึธืืืืข, ื ืืืืื , , ะธ .
ืืึธืืืจ ืึธื ืืืืื ืคืื ืืืืึทืื ืืื ืงืืง ืืื ืึท ืงืึทืคึผื ืขืงืกืคึผืขืจืืืืื ืืึธืืืืข ืงืืงื ืืื ืึทืจืืืก:
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 ืืืืืืึธืืขืง ืืื ืืืื. ืฆืืืื ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืงืกืคึผืึธืจืืึทื ืคืื ืืขืจ ืืืืืืึธืืขืง: ืึธื ืืืื ืืื ืืืืื. ืืขืจ ืขืจืฉืืขืจ ืฉืจืื ืืื ืฆื ืืึทืื ืื ืคืึทื ืืงืฉืึทื ื ืื ืืืฆื ืคึฟืื ืืืึท ื ืืฆื box.schema.func.create ืืื box.schema.user.grant. ืืขืจื ืึธื ืฉืึทืคึฟื ืึท ืคึผืืึทืฅ ืืืขืืขื ืก ืืืคึผืืขืก ืืืขื ืึทื ืืืึทืืื ืืืืื ืืจืื ืคืขืืืขืจ: ืืขืจ ืขืจืฉืืขืจ ืืื ืึท ืืื ืฆืืง ืืืขื ืืืคืืขืจ, ืื ืจืืข ืืื E- ืืจืืื, ืืื ืื ืืจืื ืืื ืื ืืขืื ืคืื ืื ืืืคึผืืข. ืืืจ ืืืืขื ืึท ืืืื ืืื ืืขืงืก ืืืืฃ ืฉืคึผืืฅ ืคืื ืืขืจ ืขืจืฉืืขืจ ืคืขืื ืืื ืจืืคื ืขืก ืขืจืฉืืืง. ืืขืจื ืึธื ืืืจ ืืึทืงืืืขื ืื ืงืฉืจ ืืืืคืขืฅ ืฆื ืืื ืืืขืจ ืืขืืืืจื ืืืืืืึธืืขืง.
ื ืึธื ืื ืคึผืจืืคึผืขืจืึทืืึธืจื ืึทืจืืขื, ืืืืคื ืื ืึธื ืืืื ืคืื ืงืฆืืข:
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, 'user0@tarantool.io', math.floor(fiber.time()) + 60}
box.space.tester:insert{1, 'user1@tarantool.io', math.floor(fiber.time()) + 60}
box.space.tester:insert{2, 'user2@tarantool.io', math.floor(fiber.time()) + 60}ืืึธืืืจ ืงืึธื ืืจืึธืืืจื ืึทื ืื ืื ืกืขืจืฉืึทื ืืื ืืขืจืึธืื:
tarantool> box.space.tester.index.primary:select()
---
- - [0, 'user0@tarantool.io', 1576418976]
- [1, 'user1@tarantool.io', 1576418976]
- [2, 'user2@tarantool.io', 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, 'user0@tarantool.io', math.floor(fiber.time()) + 60}
box.space.tester:insert{1, 'user1@tarantool.io', math.floor(fiber.time()) + 60}
box.space.tester:insert{2, 'user2@tarantool.io', math.floor(fiber.time()) + 60}ื ืึธื 30 ืกืขืงืื ืืขืก, ืืืจื ืึทื ืึทืืึทืืืฉื, ืืืจ ืืืืื ืึท ืืืกื ืืขืจ ืืืคึผืืขืก:
box.space.tester:insert{3, 'user3@tarantool.io', math.floor(fiber.time()) + 60}
box.space.tester:insert{4, 'user4@tarantool.io', math.floor(fiber.time()) + 60}
box.space.tester:insert{5, 'user5@tarantool.io', math.floor(fiber.time()) + 60}ืืึธืืืจ ืงืึธื ืืจืึธืืืจื ืึทื ืื ืื ืกืขืจืฉืึทื ืืื ืืขืจืึธืื:
tarantool> box.space.tester.index.primary:select()
---
- - [0, 'user0@tarantool.io', 1576421257]
- [1, 'user1@tarantool.io', 1576421257]
- [2, 'user2@tarantool.io', 1576421257]
- [3, 'user3@tarantool.io', 1576421287]
- [4, 'user4@tarantool.io', 1576421287]
- [5, 'user5@tarantool.io', 1576421287]
...ืืึธืืืจ ืืืืขืจืืืจื ืื ืกืขืืขืงืืืจื ื ืึธื 60 ืกืขืงืื ืืขืก (ืงืึทืื ืืื ื ืคืื ืื ืึธื ืืืื ืคืื ืื ืื ืกืขืจืฉืึทื ืคืื ืืขืจ ืขืจืฉืืขืจ ืืืคึผืืข) ืืื ืืขื ืึทื ืื ืงืึทืคึผื ืขืงืกืคึผืขืจืืืืื ืืึธืืืืข ืืื ืฉืืื ืคึผืจืึทืกืขืกื:
tarantool> box.space.tester.index.primary:select()
---
- - [3, 'user3@tarantool.io', 1576421287]
- [4, 'user4@tarantool.io', 1576421287]
- [5, 'user5@tarantool.io', 1576421287]
...ืขืก ืืขื ืขื ื ืึธื ืขืืืขืืข ืืืคึผืืขืก ืืื ืงืก ืืื ืืขื ืคึผืืึทืฅ ืืืึธืก ืืืขื ืืึธืื ืืืขืื 30 ืืขืจ ืกืขืงืื ืืขืก ืฆื ืืขืื. ืืขืจืฆื, ืื ืืืขืจืงืืงื ืกืืึทืคึผื ืืืขื ืืึธืืืื ื ืคืื ืึท ืืืคึผืืข ืืื ืึท ืฉืืึทื ืคืื 2 ืืื ืึท ืืขืื ืคืื 1576421257 ืฆื ืึท ืืืคึผืืข ืืื ืึท ืฉืืึทื ืคืื 3 ืืื ืึท ืืขืื ืคืื 1576421287. ืืืคึผืืขืก ืืื ืึท ืืขืื ืคืื 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 ืึทืืจืืืืื ืืื ืืขืจ ืืืคึผ ืคืื ืืื ืืขืงืก ืืืจื ืืืึธืก ืืืคึผืืขืก ืืืขื ืืืื ืืจืึทืืืขืจืกื. ืื filed_no ืึทืืจืืืืื ืืื ืื ื ืืืขืจ ืคืื ืื ืืืคึผืืข ืคืขืื ืืื ืืขืื. ืื scan_size ืึทืืจืืืืื ืืื ืื ืืึทืงืกืืืื ื ืืืขืจ ืคืื ืืืคึผืืขืก ืืืึธืก ืืขื ืขื ืกืงืึทื ื ืืื ืืืื ืืจืึทื ืกืึทืงืืืึธื. ืื scan_time ืึทืืจืืืืื ืืื ืื ืคืื ืืืขืจืงืืงื ืฆืืื ืืื ืกืขืงืื ืืขืก.
ืืืจ ืืืขืื ื ืืฉื ืืึทืืจืึทืืื ืคึผืึทืจืกืื ื ืึทืจืืืืขื ืื. ืืึธืก ืืื ืึท ืคึผืืื ืกืืืืงืื ื ืึธืืขืจ ืคึผืฉืื ืึทืจืืขื, ืืื ืืืึธืก ืื ืืืืืืึธืืขืง ืืืขื ืืขืืคื ืืืจ . ืฉืืืขืจืืงืืืื ืงืขื ืขื ืืืืื ืืืืคืฉืืืื ืืื ืื ืืขืงืกืื ืืืึธืก ืืขื ืขื ืืืจืืืขืืื ืืขื ืคึฟืื Lua ืืื ืึท ืงืึธืืคึผืืขืงืก ืืึทืื ืกืืจืืงืืืจ ืืื ืื mp_map ืืืคึผ, ืืื ื ืืฉื ื ืืฆื ืื ืคึผืฉืื ืืืืคึผืก mp_bool, mp_double, mp_int, mp_uint ืืื mp_array. ืืืขืจ ืขืก ืืื ื ืื ืืึทืจืคึฟื ืฆื ืคึผืึทืจืก ืื ืืื ืฆืข ืืื ืืขืงืก. ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืฆื ืงืึธื ืืจืึธืืืจื ืื ืืืืื ืืจืืืงืืื, ืจืขืืขื ืขื ืื ืืืคึผ ืืื ืขืงืกืืจืึทืงื ืื ืืืขื ืืืคืืขืจ.
ืืืจ ืจืฉืืื ืื ืคึผืจืึธืืืึทืืืืคึผืก ืคืื ืึทืืข ืคืึทื ืืงืฉืึทื ื ืืืึธืก ืืขื ืขื ืืขื ืืฆื ืคึฟืึทืจ ืคึผืึทืจืกืื ื:
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);ืืืฆื ืืึธืื ืก ืืึทื ืืืืฃ ืฆื ืื ืืขืจืกื ืืืืืืืง ืืึทื - ืื ืืึธืืืง ืคืื ืืืืคึผืึทืกืื ื ืคึผืืึทืฅ ืืื ืืืกืืขืงื ืืืคึผืืขืก. ืืขืืขืจ ืืืึธืง ืคืื ืืืคึผืืขืก ื ืื ืืจืขืกืขืจ ืืื scan_size ืืื ืกืงืึทื ื ืืื ืืึทืืึทืคืืื ืืื ืืขืจ ืึท ืืืื ืืจืึทื ืกืึทืงืืืึธื. ืืืื ืืขืจืึธืื, ืืขื ืืจืึทื ืกืึทืงืืืึธื ืืื ืืืืื ืืขื ืืืื ืืขืืช ืึทืงืขืจื, ืขืก ืืื ืจืึธืืื ืฆืืจืืง. ืื ืืขืฆืืข ืึทืจืืืืขื ื ืฆื ืื 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
