เบเบฒเบเบเบฑเปเบเบเปเบญเบเบซเบเปเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฐเปเบเบตเบเบเบฑเบเบเบฑเบเบซเบฒเบเบญเบเบเบฒเบเบเปเบฒเบเบงเบฒเบกเบชเบฐเบญเบฒเบ tuples เปเบเบชเบฐเบเบฒเบเบเบตเป
เบเบปเบงเบขเปเบฒเบเบเบตเปเบเบตเบชเปเบฒเบฅเบฑเบเบเบงเบเปเบฎเบปเบฒเปเบกเปเบเปเบกเบเบนเบ tarantool เบเบตเปเปเบญเบตเปเบเบงเปเบฒ
เบฅเบฒเบโเบฅเบฐโเบญเบฝเบ
เปเบญเบเบฐเบชเบฒเบเบชเปเบฒเบฅเบฑเบ tarantool เบกเบตเบเบตเบซเบผเบฒเบ
เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเปเบฅเบเบฐเปเบเปเบฅเบฐเปเบเบดเปเบเบงเปเบฒเปเบกเบเบนเบเบซเบกเบปเบเบญเบฒเบเบธเบเบตเปเบกเบต capped เบกเบตเบฅเบฑเบเบชเบฐเบเบฐเปเบเบงเปเบเบเบฒเบเบเบฒเบเบเบญเบ:
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)
เบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเบเปเบฒเบเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบเบตเบเบเบปเบง tarantool เปเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบตเปเบซเปเบญเบเบชเบฐเบซเบกเบธเบ libcapped-expirationd.so เบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฑเปเบเบขเบนเป. เบชเบญเบเบซเบเปเบฒเบเบตเปเบเบทเบเบชเบปเปเบเบญเบญเบเบเบฒเบเบซเปเบญเบเบชเบฐเบซเบกเบธเบ: เปเบฅเบตเปเบกเบเบปเปเบเปเบฅเบฐเบเปเบฒ. เบเบฑเปเบเบเบญเบเบเปเบฒเบญเบดเบเปเบกเปเบเปเบเบทเปเบญเปเบฎเบฑเบเปเบซเปเบซเบเปเบฒเบเบตเปเปเบซเบผเบปเปเบฒเบเบตเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเบเบฒเบ Lua เปเบเบเปเบเป box.schema.func.create เปเบฅเบฐ box.schema.user.grant. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบชเปเบฒเบเบเปเบญเบเบเบตเป tuples เบเบฐเบกเบตเบเบฝเบเปเบเปเบชเบฒเบกเบเปเบญเบเบเปเปเบกเบนเบ: เบเปเบฒเบญเบดเบเปเบกเปเบเบเบปเบงเบฅเบฐเบเบธเบเบตเปเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบ, เบเบตเบชเบญเบเปเบกเปเบเบญเบตเปเบกเบฅเป, เปเบฅเบฐเบเบตเบชเบฒเบกเปเบกเปเบเบเบฐเบซเบผเบญเบเบเบตเบงเบดเบเบเบญเบ tuple. เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบเบฑเบเบชเบฐเบเบตเบเบปเปเบเปเบกเปเบขเบนเปเปเบเบดเบเบชเบธเบเบเบญเบเบเบฒเบเบชเบฐเบซเบเบฒเบกเบเปเบฒเบญเบดเบเปเบฅเบฐเปเบญเบตเปเบเบกเบฑเบเบงเปเบฒเบเบปเปเบเบเป. เบเปเปเปเบเบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบเบธเบเบเบฐเบชเบปเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบซเปเบญเบเบชเบฐเบซเบกเบธเบเบเบทเปเบเปเบกเบทเบญเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ.
เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเบฐโเบเบฝเบกโเบเบฒเบโเปเบฎเบฑเบโเบงเบฝเบโ, เบเปเบฒโเปเบเบตเบโเบเบฒเบโเบเปเบฒโเบเบฒเบโเบเบญเบโเบเบฒเบโเปเบฅเบตเปเบกโเบเบปเปเบโ:
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})
เบเบปเบงเบขเปเบฒเบเบเบตเปเบเบฐเปเบฎเบฑเบเบงเบฝเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบชเบฐเปเบเบเปเบเปเบเบทเบเบฑเบเบเบฑเบเปเบกเบเบนเบเปเบปเบเบญเบฒเบเบธ, เปเบเบดเปเบเบเบฝเบเปเบ Lua. เบเบฒเบเปเบเปเบเบฝเบเบเปเบฒเบญเบดเบเบเบฑเบเบเบฑเบเบเบฑเบเปเบฅเบตเปเบกเบเบปเปเบเปเบกเปเบเบเบทเปเบเบตเปเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบเบเบญเบเบซเบเปเบฒเบงเบฝเบ. เบญเบฑเบเบเบตเบชเบญเบเปเบกเปเบเบเบปเบงเบฅเบฐเบเบธเบเปเบญเบ. เบญเบฑเบเบเบตเบชเบฒเบกเปเบกเปเบเบเบฑเบเบเบฐเบเบตเบเบตเปเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบเบเบตเป tuples เบเบฐเบเบทเบเบฅเบถเบ. เบชเบตเปเปเบกเปเบเบเบฑเบเบเบฐเบเบตเบเบตเป tuples เบเบฐเบเบทเบเบเปเบฒเบกเบเปเบฒเบ. เบเบตเบซเปเบฒเปเบกเปเบเบเบปเบงเปเบฅเบเบเบญเบเบเบฒเบเบชเบฐเบซเบเบฒเบก tuple เบเบฐเบซเบผเบญเบเบเบตเบงเบดเบ (เบเบปเบงเปเบฅเบเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบ 1, เบเปเปเปเบกเปเบ 0!). เบเบฑเปเบเบเบต VI เปเบฅเบฐเบเบต 1024 เปเบกเปเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบฒเบเบชเบฐเปเบเบ. 3600 เปเบกเปเบเบเปเบฒเบเบงเบเบชเบนเบเบชเบธเบเบเบญเบ tuples เบเบตเปเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบเปเปเบเบเบธเบฅเบฐเบเปเบฒเบเบฝเบง. XNUMX โ เปเบงเบฅเบฒเบชเบฐเปเบเบเปเบเบฑเบกเปเบเบงเบดเบเบฒเบเบต.
เปเบซเปเบชเบฑเบเปเบเบเบงเปเบฒเบเบปเบงเบขเปเบฒเบเปเบเปเบเบฑเบเบชเบฐเบเบตเบเบฝเบงเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบฅเบงเบเบฅเบงเบกเบเปเปเบกเบนเบเปเบฅเบฐเบเบฒเบเบฅเบถเบ. เบเปเบฒเบเบตเปเปเบกเปเบเบเบฑเบเบเบฐเบเบตเบเบปเปเบเปเบกเป, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เปเบชเบฑเปเบเบเบฒเบเบเปเบฒเบเปเบกเปเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบตเบเบฐเบซเบเบฒเบเบเปเบญเบเปเบเบซเบฒเบเบฐเบซเบเบฒเบเปเบซเบเปเบเบงเปเบฒ. เบเปเบฒเบกเบตเบเบฒเบเบญเบฑเบเบญเบทเปเบ, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เบเบฑเบเบเบฐเบเบต hash, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ traversal เปเบกเปเบเบเปเบฒเปเบเบตเบ, เบเบฒเบกเบเบปเบเบฅเบฐเบเบฝเบ, เปเบเบเปเบฒเบชเบฑเปเบเบชเบธเปเบก. เบเปเบญเบเบซเบงเปเบฒเบเบเบฑเบเปเบปเบเบเบทเบเบชเบฐเปเบเบเปเบเบชเบฐเปเบเบเบเบฝเบง.
เปเบซเปเปเบชเป tuples เบซเบผเบฒเบเปเบญเบฑเบเปเบเบปเปเบฒเปเบเปเบเบเปเบญเบเบเบตเปเบกเบตเบเบตเบงเบดเบ 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+ เบงเบดเบเบฒเบเบต (เบเบฑเบเบเบฒเบเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเบฒเบเปเบชเป tuple เบเปเบฒเบญเบดเบ) เปเบฅเบฐเปเบเบดเปเบเบงเปเบฒเปเบกเบเบนเบเบซเบกเบปเบเบญเบฒเบเบธ capped เปเบเปเบเปเบฒเปเบเบตเบเบเบฒเบเปเบฅเปเบง:
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)
เบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบขเบนเปเบเบตเปเบเบตเปเปเบกเปเบเบเบทเบเบฑเบเบเบฑเบเปเบเบเบปเบงเบขเปเบฒเบเบเปเบฒเบญเบดเบ, เบกเบตเบเปเปเบเบปเบเปเบงเบฑเปเบเบเปเปเบซเบผเบฒเบเบเบฒเบเปเบ. เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบเบฑเบเบชเบฐเบเบตเบเบปเปเบเปเบกเปเบขเบนเปเปเบเบดเบเบชเบธเบเบเบญเบเบเบฒเบเบชเบฐเบซเบเบฒเบกเบเบตเบชเบฒเบกเปเบฅเบฐเปเบเบซเบฒเบกเบฑเบ exp. เบเบฑเบเบเบฐเบเบตเบเบตเปเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบ, เบเปเปเปเบซเบกเบทเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบตเบเบตเปเปเบญเบตเปเบเบงเปเบฒเบเบฐเบเบปเบก. เปเบชเบฑเปเบเบเบฒเบเบเปเบฒเบเบเบฐเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเบเบเบฑเบเบเบฐเบเบต exp, เปเบฅเบฐเบเบฒเบเบฅเบถเบเปเบเบเบเบฑเปเบเบเบปเปเบ. เบเบงเบเปเบฎเบปเบฒเบเบทเปเปเบงเปเบงเปเบฒเบเปเบญเบเบซเบเปเบฒเบเบตเปเบเบฑเบเบชเบญเบเปเบกเปเบเปเบฎเบฑเบเปเบเปเบเบฝเบเปเบเปเบเปเบฒเปเบเปเบเบฑเบเบชเบฐเบเบตเบเบปเปเบเบเป.
เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเบฐโเบเบฝเบกโ, เบเบงเบโเปเบฎเบปเบฒโเบเปเบฒโเปเบเบตเบโเบเบฒเบโเบเปเบฒโเบเบฒเบโเบเบญเบโเบเบฒเบโเปเบฅเบตเปเบกโเบเบปเปเบโเบเบตเปโเบกเบตโเบเบฒเบโเปเบเปโเบเบฝเบโเปเบซเบกเปโ:
capped_connection:call('libcapped-expirationd.start', {'indexed', box.space.tester.id, box.space.tester.index.primary, box.space.tester.index.exp, 3, 1024, 3600})
เปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบชเป tuples เบซเบผเบฒเบเบญเบฑเบเปเบเบปเปเบฒเปเบเปเบเบเปเบญเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเปเบเบเบเบฐเบซเบผเบญเบเบเบตเบงเบดเบเบเบญเบ 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 เบงเบดเบเบฒเบเบต, เปเบเบเบเบฒเบเบเบฝเบเบเบฝเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบตเปเบก tuples เบเบทเปเบกเบญเบตเบเบชเบญเบเบชเบฒเบกเบญเบฑเบ:
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+ เบงเบดเบเบฒเบเบต (เบเบฑเบเบเบฒเบเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเบฒเบเปเบชเป tuple เบเปเบฒเบญเบดเบ) เปเบฅเบฐเปเบเบดเปเบเบงเปเบฒเปเบกเบเบนเบเบซเบกเบปเบเบญเบฒเบเบธ capped เปเบเปเบเปเบฒเปเบเบตเบเบเบฒเบเปเบฅเปเบง:
tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
- [4, '[email protected]', 1576421287]
- [5, '[email protected]', 1576421287]
...
เบเบฑเบเบกเบตเบเบฒเบ tuples เปเบซเบผเบทเบญเบขเบนเปเปเบเบเปเบญเบเบเบตเปเบเบฐเบกเบตเบเบฐเบกเบฒเบ 30 เบงเบดเบเบฒเบเบตเปเบเบตเปเบกเปเบเบตเบกเปเบเบทเปเบญเบเปเบฒเบฅเบปเบเบเบตเบงเบดเบ. เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เบเบฒเบเบชเบฐเปเบเบเบขเบธเบเปเบกเบทเปเบญเบเปเบฒเบเบเบฒเบ tuple เบเบตเปเบกเบต ID เบเบญเบ 2 เปเบฅเบฐเบเบฐเบซเบผเบญเบเบเบตเบงเบดเบเบเบญเบ 1576421257 เบเบฑเบ tuple เบเบตเปเบกเบต ID เบเบญเบ 3 เปเบฅเบฐเบเบฐเบซเบผเบญเบเบเบตเบงเบดเบเบเบญเบ 1576421287. Tuples เบเบตเปเบกเบตเบเบตเบงเบดเบเบเบญเบ 1576421287 เบซเบผเบทเบซเบผเบฒเบเบเบงเปเบฒเบเบฑเปเบเบเปเปเปเบเปเบเบทเบเบชเบฐเปเบเบเปเบเบทเปเบญเบเบเบฒเบเบเบฒเบเบชเบฑเปเบเบเบทเปเบเบญเบ เบเบฐเปเบ exp index. เบเบตเปเปเบกเปเบเปเบเบดเบเบเบฒเบเบเบฐเบขเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบฑเบเบฅเบธเปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบ.
เปเบซเปเบขเบธเบเปเบเบปเบฒเบงเบฝเบเบเบฒเบ:
capped_connection:call('libcapped-expirationd.kill', {'indexed'})
ะ ะตะฐะปะธะทะฐัะธั
เบงเบดเบเบตเบเบตเปเบเบตเบเบตเปเบชเบธเบเบเบตเปเบเบฐเบเบญเบเบเปเบฝเบงเบเบฑเบเบฅเบฑเบเบชเบฐเบเบฐเบเบฑเบเบซเบกเบปเบเบเบญเบเปเบเบเบเบฒเบเปเบกเปเบเปเบซเบผเปเบเบเบปเปเบเบชเบฐเบเบฑเบเบเบญเบเบกเบฑเบ.
arguments เบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเปเบเบซเบฒเบงเบดเบเบตเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเปเบกเปเบเปเบเบฑเบเปเบงเปเปเบเปเบเบเบชเปเบฒเบเบเบตเปเปเบญเบตเปเบเบงเปเบฒ 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;
};
เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐเบเบญเบเบเบทเปเปเบกเปเบเบเบทเปเบเบญเบเบงเบฝเบเบเบฒเบ. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ space_id เปเบกเปเบเบเบปเบงเบฅเบฐเบเบธเบเบทเปเบเบเบตเป. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ rm_index_id เปเบกเปเบเบเบปเบงเบฅเบฐเบเบธเบเบญเบเบเบฑเบเบเบฐเบเบตเบเบตเปเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบเบเบตเป tuples เบเบฐเบเบทเบเบฅเบถเบ. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ it_index_id เปเบกเปเบเบเบปเบงเบฅเบฐเบเบธเบเบญเบเบเบฑเบเบเบฐเบเบตเบเบตเป tuples เบเบฐเบเบทเบเบเปเบฒเบกเบเปเบฒเบ. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ it_index_type เปเบกเปเบเบเบฐเปเบเบเบเบญเบเบเบฑเบเบเบฐเบเบตเบเบตเป tuples เบเบฐเบเบทเบเบเปเบฒเบกเบเปเบฒเบ. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ filed_no เปเบกเปเบเบเบปเบงเปเบฅเบเบเบญเบเบเปเบญเบ tuple เบเบฐเบซเบผเบญเบเบเบตเบงเบดเบ. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ scan_size เปเบกเปเบเบเปเบฒเบเบงเบเบชเบนเบเบชเบธเบเบเบญเบ tuples เบเบตเปเบเบทเบเบชเบฐเปเบเบเปเบเบซเบเบถเปเบเบเบธเบฅเบฐเบเปเบฒ. เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐ scan_time เปเบกเปเบเปเบงเบฅเบฒเบชเบฐเปเบเบเปเบเบฑเบกเปเบเบฑเบเบงเบดเบเบฒเบเบต.
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเปเบเบดเบเบฒเบฅเบฐเบเบฒเบเบฒเบเบงเบดเบเบฒเบเบงเบดเบเบฒเบ. เบเบตเปเปเบกเปเบเบงเบฝเบเบเบตเปเบซเบเบธเปเบเบเบฒเบเปเบเปเบเปเบฒเบเบเบฒเบ, เปเบเบดเปเบเบซเปเบญเบเบชเบฐเบซเบกเบธเบเบเบฐเบเปเบงเบเปเบเบปเปเบฒเปเบเป
เบเบงเบเปเบฎเบปเบฒเบฅเบฒเบเบเบทเปเบเบปเปเบเปเบเบเบเบญเบเบเบฑเบเบเบฑเบเบเบฑเบเปเบปเบเบเบตเปเบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบงเบดเปเบเบฒเบฐ:
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);
เบเบญเบเบเบตเปเปเบซเปเปเบฎเบปเบฒเบเปเบฒเบงเปเบเบชเบนเปเบชเบดเปเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบ - เปเบซเบเบเบปเบเบเบญเบเบเบฒเบเบเปเบฒเบกเบเปเบญเบเปเบฅเบฐเบเบฒเบเบฅเบถเบ tuples. เปเบเปเบฅเบฐเบเปเบญเบเบเบญเบ tuples เบเบตเปเบเปเปเปเบซเบเปเบเบงเปเบฒ scan_size เปเบกเปเบเปเบเปเบเบทเบเบชเบฐเปเบเบ เปเบฅเบฐเบเบฑเบเปเบเปเบเบฒเบเปเบเปเบเบธเบฅเบฐเบเปเบฒเบเบฝเบง. เบเปเบฒเบเบฐเบชเบปเบเบเบปเบเบชเปเบฒเปเบฅเบฑเบ, เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบเบตเปเปเบกเปเบเบซเบกเบฑเปเบเบชเบฑเบเบเบฒ; เบเปเบฒเบเปเปเบเบดเบเบเบฒเบเปเบเบตเบเบเบทเปเบ, เบกเบฑเบเบเบฐเบเบทเบเบเบฑเบเบเบทเบ. เบเบฒเบเปเบเปเบเบฝเบเบชเบธเบเบเปเบฒเบเบเปเปเบเบฑเบเบเบฑเบเบเบฑเบ expirationd_iterate เปเบกเปเบเบเบปเบงเบเบตเปเปเบเบซเบฒ iterator เบเบตเปเบเบฒเบเบชเบฐเปเบเบเปเบฅเบตเปเบกเบเบปเปเบ เบซเบผเบทเบชเบทเบเบเปเป. iterator เบเบตเปโเปเบกเปเบโเปเบเบตเปเบกโเบเบถเปเบโเบเบฒเบโเปเบโเบเบปเบโเบโเปโเบงเบฒโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโเปเบเบตเบโเบเบถเปเบโ, เบเปเบญเบโเบเบตเปโเบซเบกเบปเบโ, เบซเบผเบทโเบกเบฑเบโเปเบเบฑเบโเปเบโเปเบเปโเบเบตเปโเบเบฐโเบขเบธเบโเปเบเบปเบฒโเบเบฐโเบเบงเบโเบเบฒเบโเบฅเปเบงเบโเบซเบเปเบฒโ. เบเบฑเบเบเบฑเบ expirationd_expired เบเบงเบเปเบเบดเปเบเบญเบฒเบเบธเบเบญเบ tuple, expirationd_delete เบฅเบปเบ tuple, เบเบฒเบเบเบงเบเบชเบญเบเบเบฒเบเบซเบกเบปเบเบญเบฒเบเบธ d_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);
}
เบฅเบฐเบซเบฑเบเบเบฑเบเบเบฑเบ Expirationd_breakable:
static bool
expirationd_breakable(struct expirationd_task *task)
{
return task->it_index_id != task->rm_index_id && task->it_index_type == ITER_GT;
}
Application
เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบตเป
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com