ืฉืจื™ื™ื‘ืŸ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ืงืึทืคึผื˜ ืขืงืกืคึผืขืจื™ื™ื˜ื™ื“ ืžืึธื“ื•ืœืข ืคึฟืึทืจ ื˜ืึทืจืึทื ื˜ืึธืึธืœ

ืฉืจื™ื™ื‘ืŸ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ืงืึทืคึผื˜ ืขืงืกืคึผืขืจื™ื™ื˜ื™ื“ ืžืึธื“ื•ืœืข ืคึฟืึทืจ ื˜ืึทืจืึทื ื˜ืึธืึธืœ

ืขื˜ืœืขื›ืข ืžืึธืœ ืฆื•ืจื™ืง ืžื™ืจ ื–ืขื ืขืŸ ืคื™ื™ืกื˜ ืžื™ื˜ ื“ื™ ืคึผืจืึธื‘ืœืขื ืคื•ืŸ ืจื™ื™ื ื™ืงื•ื ื’ ื˜ื•ืคึผืœืขืก ืื™ืŸ ืกืคึผื™ื™ืกืึทื– tarantool. ืจื™ื™ื ื™ืงื•ื ื’ ื”ืื˜ ืฆื• ื–ื™ื™ืŸ ืกื˜ืึทืจื˜ืขื“ ื ื™ืฉื˜ ื•ื•ืขืŸ ื˜ืึทืจืึทื ื˜ืึธืึธืœ ืื™ื– ืฉื•ื™ืŸ ืคืœื™ืกื ื“ื™ืง ืื•ื™ืก ืคื•ืŸ ื–ื›ึผืจื•ืŸ, ืึธื‘ืขืจ ืื™ืŸ ืฉื˜ื™ื™ึทื’ืŸ ืื•ืŸ ืื™ืŸ ืึท ื–ื™ื›ืขืจ ืึธืคื˜ืงื™ื™ึทื˜. ืคึฟืึทืจ ื“ืขื ืึทืจื‘ืขื˜, tarantool ื”ืื˜ ืึท ืžืึธื“ื•ืœืข ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ Lua ื’ืขืจื•ืคืŸ ืขืงืกืคึผืขืจื™ื™ืฉืึทืŸ. ื ืึธืš ื ื™ืฆืŸ ื“ืขื ืžืึธื“ื•ืœืข ืคึฟืึทืจ ืึท ืงื•ืจืฅ ืฆื™ื™ึทื˜, ืžื™ืจ ืื™ื™ื ื’ืขื–ืขืŸ ืึทื– ืขืก ืื™ื– ื ื™ืฉื˜ ืคึผืึทืกื™ืง ืคึฟืึทืจ ืื•ื ื“ื–: ืจืขื›ื˜ ืฆื• ืงืขืกื™ื™ื“ืขืจื“ื™ืง ืจื™ื™ื ื™ืงื•ื ื’ ืคื•ืŸ ื’ืจื•ื™ืก ืึทืžืึทื•ื ืฅ ืคื•ืŸ ื“ืึทื˜ืŸ, ืœื•ืึท ื’ืขื”ืื ื’ืขืŸ ืื™ืŸ ื“ื™ ื’ืง. ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ื’ืขื“ืึทื ืง ื•ื•ืขื’ืŸ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืŸ ืงืึทืคึผื˜ ืขืงืกืคึผืขืจื™ื™ืฉืึทืŸ ืžืึธื“ื•ืœืข, ื›ืึธื•ืคึผื™ื ื’ ืึทื– ื“ืขืจ ืงืึธื“ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืึท ื’ืขื‘ื•ื™ืจืŸ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทืš ื•ื•ืึธืœื˜ ืกืึธืœื•ื•ืข ืื•ื ื“ื–ืขืจ ืคึผืจืึธื‘ืœืขืžืก ืื™ืŸ ื“ืขืจ ื‘ืขืกื˜ืขืจ ืžืขื’ืœืขืš ื•ื•ืขื’.

ื ื’ื•ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคึฟืึทืจ ืื•ื ื“ื– ืื™ื– ื’ืขื•ื•ืขืŸ ื“ื™ ื˜ืึทืจืึทื ื˜ืึธืึธืœ ืžืึธื“ื•ืœืข ื’ืขืจื•ืคืŸ ืžืขืžืงืึทื˜ืฉืขื“. ื“ืขืจ ืฆื•ื’ืึทื ื’ ื•ื•ืึธืก ืื™ื– ื’ืขื ื•ืฆื˜ ืื™ืŸ ืื™ื ืื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ืขื ืคืึทืงื˜ ืึทื– ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืคืขืœื“ ืื™ื– ื‘ืืฉืืคืŸ ืื™ืŸ ื“ื™ ืคึผืœืึทืฅ, ื•ื•ืึธืก ื™ื ื“ื™ืงื™ื™ืฅ ื“ื™ ืœืขื‘ืŸ ืคื•ืŸ ื“ื™ ื˜ื•ืคึผืœืข, ืื™ืŸ ืื ื“ืขืจืข ื•ื•ืขืจื˜ืขืจ, ื˜ื˜ืœ. ื“ืขืจ ืžืึธื“ื•ืœืข ืื™ืŸ ื“ืขืจ ื”ื™ื ื˜ืขืจื’ืจื•ื ื˜ ืกืงืึทื ื– ื“ื™ ืคึผืœืึทืฅ, ืงืึทืžืคึผืขืจื– ื“ื™ TTL ืžื™ื˜ ื“ื™ ืงืจืึทื ื˜ ืฆื™ื™ื˜ ืื•ืŸ ื“ื™ืกื™ื™ื“ื– ืฆื™ ืฆื• ื•ื™ืกืžืขืงืŸ ื“ื™ ื˜ื•ืคึผืœืข ืึธื“ืขืจ ื ื™ืฉื˜. ื“ื™ ืžืขืžืงืึทื˜ืฉืขื“ ืžืึธื“ื•ืœืข ืงืึธื“ ืื™ื– ืคึผืฉื•ื˜ ืื•ืŸ ืขืœืขื’ืึทื ื˜, ืึธื‘ืขืจ ืื•ื™ืš ื“ื–ืฉืึทื ืขืจื™ืง. ืขืจืฉื˜ืขืจ, ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ื ืขืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ ื“ื™ ื˜ื™ืคึผ ืคื•ืŸ ืื™ื ื“ืขืงืก ื•ื•ืึธืก ืื™ื– ืงืจืึธืœื“ ืื•ืŸ ืื•ื™ืกื’ืขืžืขืงื˜. ืฆื•ื•ื™ื™ื˜ื ืก, ืื•ื™ืฃ ื™ืขื“ืขืจ ืคืึธืจืŸ ืึทืœืข ื˜ื•ืคึผืœืขืก ื–ืขื ืขืŸ ืกืงืึทื ื“, ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืึทื ืฅ ื’ืจื•ื™ืก. ืื•ืŸ ืื•ื™ื‘ ืื™ืŸ ื“ื™ ืขืงืกืคึผืขืจื™ื™ื˜ื™ื“ ืžืึธื“ื•ืœืข ื“ืขืจ ืขืจืฉื˜ืขืจ ืคึผืจืึธื‘ืœืขื ืื™ื– ืกืึทืœื•ื•ื“ (ื“ืขืจ ื‘ื•ื™ื ืื™ื ื“ืขืงืก ืื™ื– ื’ืขื•ื•ืขืŸ ืืคื’ืขืฉื™ื™ื“ื˜ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืงืœืึทืก), ื“ืขืžืึธืœื˜ ื“ืขืจ ืฆื•ื•ื™ื™ื˜ืขืจ ื ืึธืš ื”ืื˜ ื ื™ืฉื˜ ื‘ืึทืงื•ืžืขืŸ ืงื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜. ื“ื™ ื“ืจื™ื™ ืคื•ื ืงื˜ืŸ ืคึผืจื™ื“ื™ื˜ืขืจืžื™ื ื“ ื“ื™ ื‘ืจื™ืจื” ืื™ืŸ ื˜ื•ื™ื•ื•ืข ืคื•ืŸ โ€‹โ€‹ืฉืจื™ื™ื‘ืŸ ืžื™ื™ืŸ ืื™ื™ื’ืŸ ืงืึธื“.

ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’

ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืคึฟืึทืจ ื˜ืึทืจืึทื ื˜ืึธืึธืœ ื”ืื˜ ืึท ื–ื™ื™ืขืจ ื’ื•ื˜ ื˜ื•ื˜ืึธืจื™ืึทืœ ื•ื•ืขื’ืŸ ื•ื•ื™ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื“ื™ื™ืŸ ืกื˜ืึธืจื“ ืคึผืจืึธื•ืกื™ื“ื–ืฉืขืจื– ืื™ืŸ 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)

ืคึฟืึทืจ ืคึผืึทืฉื˜ืขืก, ืžื™ืจ ืงืึทื˜ืขืจ ื˜ืึทืจืึทื ื˜ืึธืึธืœ ืื™ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื•ื•ื• ืื•ื ื“ื–ืขืจ 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 ืึทื˜ืจื™ื‘ื™ื•ื˜ ืื™ื– ื“ื™ ืคื•ืœ ื™ื‘ืขืจืงื•ืงืŸ ืฆื™ื™ื˜ ืื™ืŸ ืกืขืงื•ื ื“ืขืก.

ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืคึผืึทืจืกื™ื ื’ ืึทืจื’ื•ืžืขื ื˜ืŸ. ื“ืึธืก ืื™ื– ืึท ืคึผื™ื™ื ืกื˜ื™ื™ืงื™ื ื’ ืึธื‘ืขืจ ืคึผืฉื•ื˜ ืึทืจื‘ืขื˜, ืžื™ื˜ ื•ื•ืึธืก ื“ื™ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื•ื•ืขื˜ ื”ืขืœืคืŸ ืื™ืจ 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);

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืžืึทืš ืื•ื™ืฃ ืฆื• ื“ื™ ืžืขืจืกื˜ ื•ื•ื™ื›ื˜ื™ืง ื–ืึทืš - ื“ื™ ืœืึธื’ื™ืง ืคื•ืŸ ื‘ื™ื™ืคึผืึทืกื™ื ื’ ืคึผืœืึทืฅ ืื•ืŸ ื•ื™ืกืžืขืงืŸ ื˜ื•ืคึผืœืขืก. ื™ืขื“ืขืจ ื‘ืœืึธืง ืคื•ืŸ ื˜ื•ืคึผืœืขืก ื ื™ื˜ ื’ืจืขืกืขืจ ื•ื•ื™ 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’