เบเบฒเบ™เบ‚เบฝเบ™เป‚เบกเบ”เบนเบ™เบซเบกเบปเบ”เบญเบฒเบเบธ capped เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบš tarantool

เบเบฒเบ™เบ‚เบฝเบ™เป‚เบกเบ”เบนเบ™เบซเบกเบปเบ”เบญเบฒเบเบธ capped เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบš tarantool

เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เบฐเป€เบŠเบตเบ™เบเบฑเบšเบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบเบฒเบ™เบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ” tuples เปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆ เบ—เบฒเบฅเบฑเบ™เบ—เบน. เบเบฒเบ™เบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบšเปเปˆเปเบกเปˆเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ tarantool เบเปเบฒเบฅเบฑเบ‡เบซเบกเบปเบ”เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ, เปเบ•เปˆเบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเปเบฅเบฐเบ„เบงเบฒเบกเบ–เบตเปˆเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™. เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰, tarantool เบกเบตเป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ Lua เป€เบญเบตเป‰เบ™เบงเปˆเบฒ เปเบปเบ”เบญเบฒเบเบธ. เบซเบผเบฑเบ‡เบˆเบฒเบเปƒเบŠเป‰เป‚เบกเบ”เบนเบ™เบ™เบตเป‰เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบชเบฑเป‰เบ™เป†, เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ: เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบ, Lua เปเบ‚เบงเบ™เบขเบนเปˆเปƒเบ™ GC. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบซเบกเบปเบ”เบญเบฒเบเบธ capped เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡, เบซเบงเบฑเบ‡เบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ‚เบฝเบ™เป€เบ›เบฑเบ™เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡เบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เบ—เบฒเบ‡เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เป‚เบกเบ”เบนเบ™ tarantool เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ memcached. เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบกเบฑเบ™เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบŠเปˆเบญเบ‡, เป€เบŠเบดเปˆเบ‡เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบญเบฒเบเบธเบ‚เบญเบ‡ tuple, เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, ttl. เป‚เบกเบ”เบนเบ™เปƒเบ™เบžเบทเป‰เบ™เบซเบฅเบฑเบ‡เบชเบฐเปเบเบ™เบžเบทเป‰เบ™เบ—เบตเปˆ, เบ›เบฝเบšเบ—เบฝเบš TTL เบเบฑเบšเป€เบงเบฅเบฒเบ›เบฐเบˆเบธเบšเบฑเบ™เปเบฅเบฐเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบˆเบฐเบฅเบถเบš tuple เบซเบผเบทเบšเปเปˆ. เบฅเบฐเบซเบฑเบ”เป‚เบกเบ”เบนเบ™ memcached เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบชเบฐเบซเบ‡เปˆเบฒเบ‡เบฒเบก, เปเบ•เปˆเบ—เบปเปˆเบงเป„เบ›เป€เบเบตเบ™เป„เบ›. เบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”, เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบเบงเบฒเบ”เบฅเป‰เบฒเบ‡เปเบฅเบฐเบฅเบถเบš. เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เปƒเบ™เปเบ•เปˆเบฅเบฐเบœเปˆเบฒเบ™ tuples เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ”เป‰เบ–เบทเบเบชเบฐเปเบเบ™, เบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เปƒเบซเบเปˆ. เปเบฅเบฐเบ–เป‰เบฒเบขเบนเปˆเปƒเบ™เป‚เบกเบ”เบนเบ™เบซเบกเบปเบ”เบญเบฒเบเบธ, เบšเบฑเบ™เบซเบฒเบ—เปเบฒเบญเบดเบ”เป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚ (เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ–เบทเบเปเบเบเบญเบญเบเป€เบ›เบฑเบ™เบŠเบฑเป‰เบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เบตเบชเบญเบ‡เบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ. เบชเบฒเบกเบˆเบธเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡.

เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”

เป€เบญเบเบฐเบชเบฒเบ™เบชเปเบฒเบฅเบฑเบš tarantool เบกเบตเบ”เบตเบซเบผเบฒเบ เบเบฒเบ™เบชเบญเบ™ เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบ™ C. เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ‚เป‰เบญเบเบ‚เปเปเบ™เบฐ เบ™เบณ เปƒเบซเป‰เบ—เปˆเบฒเบ™เบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเบกเบฑเบ™เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆ เบ„เบณ เบชเบฑเปˆเบ‡เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบˆเบฐเบ›เบฒเบเบปเบ”เบขเบนเปˆเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบก. เบกเบฑเบ™เบเบฑเบ‡เบกเบตเบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ เบญเป‰เบฒเบ‡เบญเบดเบ‡ เบเบฑเบšเบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เบฝเบ™เป‚เบกเบ”เบนเบ™ capped เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡, เบ„เบท เบซเบกเบฒเบเปƒเบชเปˆเปƒเบ™เบ›เปˆเบญเบ‡, เป€เบชเบฑเป‰เบ™เป„เบ, เบ”เบฑเบ”เบŠเบฐเบ™เบต ะธ txn.

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเป„เบฅเบเบฐเป„เบเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเป‚เบกเบ”เบนเบ™เบซเบกเบปเบ”เบญเบฒเบเบธเบ—เบตเปˆเบกเบต 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'})

ะ ะตะฐะปะธะทะฐั†ะธั

เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบšเบญเบเบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เปเบซเบผเปˆเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบกเบฑเบ™. เบฅเบฐเบซเบฑเบ”! เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบธเบกเปƒเบชเปˆเบžเบฝเบ‡เปเบ•เปˆเบˆเบธเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”, เบ„เบท, space bypass algorithms.

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 เปเบกเปˆเบ™เป€เบงเบฅเบฒเบชเบฐเปเบเบ™เป€เบ•เบฑเบกเป€เบ›เบฑเบ™เบงเบดเบ™เบฒเบ—เบต.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เบงเบดเบžเบฒเบเบงเบดเบˆเบฒเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบงเบฝเบเบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบเปเบ•เปˆเบ‡เปˆเบฒเบเบ”เบฒเบ, เป€เบŠเบดเปˆเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบˆเบฐเบŠเปˆเบงเบเป€เบˆเบปเป‰เบฒเป„เบ”เป‰ msgpuck. เบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบเบฑเบšเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบˆเบฒเบ 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);

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ” - เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ‚เป‰เบฒเบกเบŠเปˆเบญเบ‡เปเบฅเบฐเบเบฒเบ™เบฅเบถเบš 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™