αž€αžΆαžšαžŸαžšαžŸαŸαžšαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ tarantool

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ tarantool

αž˜αž½αž™αžšαž™αŸˆαž˜αž»αž“αž™αžΎαž„αž”αŸ’αžšαžˆαž˜αž˜αž»αžαž“αžΉαž„αž”αž‰αŸ’αž αžΆαž“αŸƒαž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαž tuples αž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αž  tarantool. αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαžαŸ’αžšαžΌαžœαžαŸ‚αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αž·αž“αž˜αŸ‚αž“αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› tarantool αž’αžŸαŸ‹αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž˜αž»αž“ αž“αž·αž„αž“αŸ…αž”αŸ’αžšαŸαž€αž„αŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡ tarantool αž˜αžΆαž“αž˜αŸ‰αžΌαžŒαž»αž›αžŸαžšαžŸαŸαžšαž‡αžΆ Lua αž αŸ…αžαžΆ αž€αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžšαžΎαž˜αŸ‰αžΌαžŒαž»αž›αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžαŸ’αž›αžΈ αž™αžΎαž„αž”αžΆαž“αžŠαžΉαž„αžαžΆαžœαžΆαž˜αž·αž“αžŸαŸαž€αŸ’αžαž·αžŸαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž‘αŸαŸ– αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαž‡αžΆαž”αŸ’αžšαž…αžΆαŸ†αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž…αŸ’αžšαžΎαž“ Lua αž”αžΆαž“αž–αŸ’αž™αž½αžšαž“αŸ…αž€αŸ’αž“αž»αž„ GC αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž™αžΎαž„αž”αžΆαž“αž‚αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž™αžΎαž„ αžŠαŸ„αž™αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž€αžΌαžŠαžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž‡αžΆαž—αžΆαžŸαžΆαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΎαž˜αž“αžΉαž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžšαž”αžŸαŸ‹αž™αžΎαž„αžαžΆαž˜αžœαž·αž’αžΈαž›αŸ’αž’αž”αŸ†αž•αž»αžαŸ”

αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸαž›αŸ’αž’αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž™αžΎαž„αž‚αžΊαž˜αŸ‰αžΌαžŒαž»αž› tarantool αž αŸ…αžαžΆ memcached. αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžœαžΆαž›αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αž αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž’αžΆαž™αž»αž€αžΆαž›αžšαž”αžŸαŸ‹ tuple αž“αž·αž™αžΆαž™αž˜αŸ’αž™αŸ‰αžΆαž„αž‘αŸ€αž ttl αŸ” αž˜αŸ‰αžΌαžŒαž»αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŸαŸ’αž€αŸαž“αž…αž“αŸ’αž›αŸ„αŸ‡ αž”αŸ’αžšαŸ€αž”αž’αŸ€αž” TTL αž‡αžΆαž˜αž½αž™αž–αŸαž›αžœαŸαž›αžΆαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž αžΎαž™αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžαžΆαžαžΎαžαŸ’αžšαžΌαžœαž›αž»αž” tuple αž¬αž’αžαŸ‹αŸ” αž€αžΌαžŠαž˜αŸ‰αžΌαžŒαž»αž› memcached αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž†αžΎαžαž†αžΆαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž‘αžΌαž‘αŸ…αž–αŸαž€αŸ” αž‡αžΆαžŠαŸ†αž”αžΌαž„ αžœαžΆαž˜αž·αž“αž‚αž·αžαž–αžΈαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžœαžΆαžš αž“αž·αž„αž›αž»αž”αž“αŸ„αŸ‡αž‘αŸαŸ” αž‘αžΈαž–αžΈαžšαž“αŸ…αž›αžΎαž…αŸ’αžšαž€αž“αžΈαž˜αž½αž™αŸ— tuple αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž€αŸαž“αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΆαž“αž‘αŸ†αž αŸ†αž’αŸ†αžŽαžΆαžŸαŸ‹αŸ” αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αž”αž‰αŸ’αž αžΆαž‘αžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ (αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαžŠαžΎαž˜αžˆαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αž‘αŸ…αž‡αžΆαžαŸ’αž“αžΆαž€αŸ‹αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‘αžΈαž–αžΈαžšαž“αŸ…αžαŸ‚αž˜αž·αž“αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αŸ” αž…αŸ†αžŽαž»αž…αž‘αžΆαŸ†αž„αž”αžΈαž“αŸαŸ‡αž€αŸ†αžŽαžαŸ‹αž‘αž»αž€αž‡αžΆαž˜αž»αž“αž“αžΌαžœαž‡αž˜αŸ’αžšαžΎαžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αŸαž‰αž…αž·αžαŸ’αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΌαžŠαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ”

αž”αžšαž·αž™αžΆαž™

αž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ tarantool αž‚αžΊαž›αŸ’αž’αžŽαžΆαžŸαŸ‹ αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžšαž“αžΈαžαž·αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αž“αž»αž„ C. αž‡αžΆαžŠαŸ†αž”αžΌαž„αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž’αŸ’αž“αž€αž‡αžΆαž˜αž½αž™αžœαžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž–αžΈαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αž€αžΌαžŠαžŠαŸ‚αž›αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αžœαžΆαž€αŸαž‚αž½αžšαž’αŸ„αž™αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž•αž„αžŠαŸ‚αžšαŸ” αž―αž€αžŸαžΆαžšαž™αŸ„αž„ αž‘αŸ…αžœαžαŸ’αžαž»αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžšαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž”αž·αž‘αž—αŸ’αž‡αžΆαž”αŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž–αŸ„αž›αž‚αžΊ αž”αŸ’αžšαž’αž”αŸ‹, αž‡αžΆαžαž·αžŸαžšαžŸαŸƒ, αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸ ΠΈ txn.

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž αžΎαž™αž˜αžΎαž›αžαžΆαžαžΎαž˜αŸ‰αžΌαžŒαž»αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž”αž·αž‘αž‡αž·αžαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž’αŸ’αžœαžΈαž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ…αŸ–

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!)αŸ” αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™ αž“αž·αž„αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž–αžΈαžš αž‚αžΊαž‡αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αž€αŸαž“αŸ” 1024 αž‚αžΊαž‡αžΆαž…αŸ†αž“αž½αž“αž’αžαž·αž”αžšαž˜αžΆαž“αŸƒ tuples αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΎαž›αž”αžΆαž“αž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ‚αž˜αž½αž™αŸ” 3600 - αž–αŸαž›αžœαŸαž›αžΆαžŸαŸ’αž€αŸαž“αž–αŸαž‰αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαŸ”

αž…αŸ†αžŽαžΆαŸ†αžαžΆαž§αž‘αžΆαž αžšαžŽαŸαž”αŸ’αžšαžΎαž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž»αž€αžšαž€ αž“αž·αž„αž›αž»αž”αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸαŸ‡αž‡αžΆαžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαž˜αŸ‚αž€αž’αžΆαž„ αž“αŸ„αŸ‡αž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž–αžΈαž‚αž“αŸ’αž›αžΉαŸ‡αžαžΌαž…αž‡αžΆαž„αž‘αŸ…αž’αŸ†αž‡αžΆαž„αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž˜αž½αž™αž…αŸ†αž“αž½αž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž§αž‘αžΆαž αžšαžŽαŸ αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸ hash αž“αŸ„αŸ‡ αž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž αž‡αžΆαž€αŸ’αž”αž½αž“αžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αž…αŸƒαžŠαž“αŸ’αž™αŸ” αžŠαž»αŸ†αž–αž€αž›αŸ†αž αžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž€αŸαž“αž€αŸ’αž“αž»αž„αžŸαŸ’αž€αŸαž“αžαŸ‚αž˜αž½αž™αŸ”

αž…αžΌαžšαž™αžΎαž„αž”αž‰αŸ’αž…αžΌαž› 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 αžŠαŸ†αž”αžΌαž„) αž αžΎαž™αžƒαžΎαž‰αžαžΆαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž½αž…αž αžΎαž™αŸ–

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 αžŠαŸ†αž”αžΌαž„) αž αžΎαž™αžƒαžΎαž‰αžαžΆαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž½αž…αž αžΎαž™αŸ–

tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
  - [4, '[email protected]', 1576421287]
  - [5, '[email protected]', 1576421287]
...

αž“αŸ…αž˜αžΆαž“ tuples αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž€αŸ’αž“αž»αž„αž›αŸ†αž  αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž–αŸαž›αž”αŸ’αžšαž αŸ‚αž› 30 αžœαž·αž“αžΆαž‘αžΈαž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαžšαžŸαŸ‹αž“αŸ…αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αž€αžΆαžšαžŸαŸ’αž€αŸαž“αž”αžΆαž“αžˆαž”αŸ‹αž“αŸ…αž–αŸαž›αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΈ tuple αžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ 2 αž“αž·αž„αž’αžΆαž™αž»αž€αžΆαž› 1576421257 αž‘αŸ… tuple αžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ 3 αž“αž·αž„αž–αŸαž‰αž˜αž½αž™αž‡αžΈαžœαž·αžαž“αŸƒ 1576421287 αŸ” Tuples αžŠαŸ‚αž›αž˜αžΆαž“αž’αžΆαž™αž»αž€αžΆαž› 1576421287 αž¬αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž“αŸαŸ‡αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž€αŸαž“αž‘αŸ αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αžšαž”αžŸαŸ‹ αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž…αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸ exp αŸ” αž“αŸαŸ‡αž‡αžΆαž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αžŸαž˜αŸ’αžšαŸαž…αžαžΆαŸ†αž„αž–αžΈαžŠαŸ†αž”αžΌαž„αŸ”

αžαŸ„αŸ‡αž”αž‰αŸ’αžˆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ–

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;
};

αž‚αž»αžŽαž›αž€αŸ’αžαžŽαŸˆαžˆαŸ’αž˜αŸ„αŸ‡αž‚αžΊαž‡αžΆαžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ” αž‚αž»αžŽαž›αž€αŸ’αžαžŽαŸˆ 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 αž“αŸαŸ‡β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαž“β€‹αž“αŸ…β€‹αžαžΆαž„β€‹αž€αŸ’αž“αž»αž„β€‹αžšαž αžΌαžβ€‹αžŠαž›αŸ‹β€‹αž˜αžΆαž“β€‹αž€αŸ†αž αž»αžŸβ€‹αž€αžΎαžβ€‹αž‘αžΎαž„ αž…αž“αŸ’αž›αŸ„αŸ‡β€‹αž’αžŸαŸ‹ αž¬β€‹αžœαžΆβ€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αž”αž‰αŸ’αžˆαž”αŸ‹β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž‡αžΆβ€‹αž˜αž»αž“β€‹αž”αžΆαž“β€‹αž‘αŸαŸ” αž˜αž»αžαž„αžΆαžš expirationd_expired αž–αž·αž“αž·αžαŸ’αž™αž’αžΆαž™αž»αž€αžΆαž›αžšαž”αžŸαŸ‹ tuple, expirationd_delete αž›αž»αž” tuple, expirationd_breakable checks αžαžΆαžαžΎαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž“αŸ’αžαž¬αž’αžαŸ‹αŸ”

αž€αžΌαžŠβ€‹αž˜αž»αžαž„αžΆαžšβ€‹αž•αž»αžαž€αŸ†αžŽαžαŸ‹_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;
}

αž›αŸαžαž€αžΌαžŠαž˜αž»αžαž„αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹_αž•αž»αžαž€αŸ†αžŽαžαŸ‹αŸ–

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;
}

αž€αžΌαžŠαž˜αž»αžαž„αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹ _αž›αž»αž”αŸ–

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);
}

αž€αžΌαžŠαž˜αž»αžαž„αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹_αž”αŸ†αž”αŸ‚αž€αž”αžΆαž“αŸ–

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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹