เชŸเซ‡เชฐเซ‡เชจเซเชŸเซ‚เชฒ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เช•เซ‡เชชเซเชก เชเช•เซเชธเชชเชพเชฏเชฐเซเชก เชฎเซ‹เชกเซเชฏเซเชฒ เชฒเช–เชตเซเช‚

เชŸเซ‡เชฐเซ‡เชจเซเชŸเซ‚เชฒ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เช•เซ‡เชชเซเชก เชเช•เซเชธเชชเชพเชฏเชฐเซเชก เชฎเซ‹เชกเซเชฏเซเชฒ เชฒเช–เชตเซเช‚

เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เช…เชฎเชจเซ‡ เชœเช—เซเชฏเชพเช“เชฎเชพเช‚ เชŸเซเชฏเซเชชเชฒ เชธเชพเชซ เช•เชฐเชตเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซเชฏเซ‹ เชนเชคเซ‹ เชŸเซ‡เชฐเซ‡เชจเซเชŸเซ‚เชฒ. เชœเซเชฏเชพเชฐเซ‡ เชŸเซ‡เชฐเชจเซเชŸเซ‚เชฒ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฎเซ‡เชฎเชฐเซ€ เชธเชฎเชพเชชเซเชค เชฅเชˆ เชฐเชนเซเชฏเซเช‚ เชนเชคเซเช‚ เชคเซเชฏเชพเชฐเซ‡ เชธเชซเชพเชˆ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช…เช—เชพเช‰เชฅเซ€ เช…เชจเซ‡ เชšเซ‹เช•เซเช•เชธ เช†เชตเชฐเซเชคเชจ เชชเชฐ. เช† เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡, เชŸเซ‡เชฐเชจเซเชŸเซ‚เชฒเชฎเชพเช‚ เชฒเซเช†เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เช›เซ‡ เชœเซ‡เชจเซ‡ เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ เชธเชฎเชพเชชเซเชคเชฟ. เชŸเซ‚เช‚เช•เชพ เชธเชฎเชฏ เชฎเชพเชŸเซ‡ เช† เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเชจเซ‡ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ เชคเซ‡ เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชจเชฅเซ€: เชฎเซ‹เชŸเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชกเซ‡เชŸเชพเชจเซ€ เชธเชคเชค เชธเชซเชพเชˆเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เชฒเซเช† เชœเซ€เชธเซ€เชฎเชพเช‚ เช…เชŸเช•เซ€ เช—เชˆ. เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เช•เซ‡เชชเซเชก เชเช•เซเชธเชชเชพเชฏเชฐเซเชก เชฎเซ‹เชกเซเชฏเซเชฒ เชตเชฟเช•เชธเชพเชตเชตเชพ เชตเชฟเชถเซ‡ เชตเชฟเชšเชพเชฐเซเชฏเซเช‚, เช†เชถเชพ เชฐเชพเช–เซ€เช เช•เซ‡ เชฎเซ‚เชณ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ เช•เซ‹เชก เช…เชฎเชพเชฐเซ€ เชธเชฎเชธเซเชฏเชพเช“เชจเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชฐเซ€เชคเซ‡ เชนเชฒ เช•เชฐเชถเซ‡.

เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเชพเชฐเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช•เชนเซ‡เชตเชพเชฏ เชŸเซ‡เชฐเซ‡เชจเซเชŸเซ‚เชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เชนเชคเซเช‚ memcached. เชคเซ‡เชฎเชพเช‚ เชตเชชเชฐเชพเชคเซ‹ เช…เชญเชฟเช—เชฎ เช เชนเช•เซ€เช•เชค เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡ เช•เซ‡ เชœเช—เซเชฏเชพเชฎเชพเช‚ เชเช• เช…เชฒเช— เช•เซเชทเซ‡เชคเซเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡, เชœเซ‡ เชŸเซเชฏเซเชชเชฒเชจเชพ เชœเซ€เชตเชจเช•เชพเชณเชจเซ‡ เชธเซ‚เชšเชตเซ‡ เช›เซ‡, เชฌเซ€เชœเชพ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, ttl. เชชเซƒเชทเซเช เชญเซ‚เชฎเชฟเชฎเชพเช‚เชจเซเช‚ เชฎเซ‹เชกเซเชฏเซเชฒ เชธเซเชชเซ‡เชธเชจเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเซ‡ เช›เซ‡, เชตเชฐเซเชคเชฎเชพเชจ เชธเชฎเชฏ เชธเชพเชฅเซ‡ 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 เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชธเซเชฅเชฟเชค เช›เซ‡ เชคเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ tarantool เชฒเซ‹เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช. เชชเซเชธเซเชคเช•เชพเชฒเชฏเชฎเชพเช‚เชฅเซ€ เชฌเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชจเชฟเช•เชพเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡: เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ‹ เช…เชจเซ‡ เชฎเชพเชฐเชตเชพ. เชชเซเชฐเชฅเชฎ เชชเช—เชฒเซเช‚ box.schema.func.create เช…เชจเซ‡ box.schema.user.grant เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเซเช†เชฎเชพเช‚เชฅเซ€ เช† เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เช‰เชชเชฒเชฌเซเชง เช•เชฐเชพเชตเชตเชพเชจเซเช‚ เช›เซ‡. เชชเช›เซ€ เชเช• เชเชตเซ€ เชœเช—เซเชฏเชพ เชฌเชจเชพเชตเซ‹ เช•เซ‡ เชœเซ‡เชจเชพ เชŸเซเชฏเซเชชเชฒเซเชธเชฎเชพเช‚ เชซเช•เซเชค เชคเซเชฐเชฃ เชซเซ€เชฒเซเชก เชนเชถเซ‡: เชชเซเชฐเชฅเชฎ เชเช• เช…เชจเชจเซเชฏ เช“เชณเช–เช•เชฐเซเชคเชพ เช›เซ‡, เชฌเซ€เชœเซเช‚ เช‡เชฎเซ‡เช‡เชฒ เช›เซ‡, เช…เชจเซ‡ เชคเซเชฐเซ€เชœเซเช‚ เชŸเซเชฏเซเชชเชฒเชจเซเช‚ เชœเซ€เชตเชจเช•เชพเชณ เช›เซ‡. เช…เชฎเซ‡ เชชเซเชฐเชฅเชฎ เช•เซเชทเซ‡เชคเซเชฐเชจเซ€ เชŸเซ‹เชš เชชเชฐ เชเช• เชตเซƒเช•เซเชท เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชฌเชจเชพเชตเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชฐเชพเชฅเชฎเชฟเช• เช•เชนเซ€เช เช›เซ€เช. เช†เช—เชณ เช†เชชเชฃเซ‡ เช†เชชเชฃเซ€ เชฎเซ‚เชณ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เช“เชฌเซเชœเซ‡เช•เซเชŸ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช.

เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เช•เชพเชฐเซเชฏ เชชเช›เซ€, เชชเซเชฐเชพเชฐเช‚เชญ เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเซ‹:

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, '[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+ เชธเซ‡เช•เชจเซเชก เชชเช›เซ€ เชธเชฟเชฒเซ‡เช•เซเชŸเชจเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเซ€เช (เชชเซเชฐเชฅเชฎ เชŸเซเชฏเซเชชเชฒเชจเชพ เชจเชฟเชตเซ‡เชถเชจเซ€ เชถเชฐเซ‚เช†เชคเชฅเซ€ เช—เชฃเชคเชฐเซ€) เช…เชจเซ‡ เชœเซเช“ เช•เซ‡ เชธเชฎเชพเชชเซเชค เชฅเชฏเซ‡เชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชšเซ‚เช•เซเชฏเซเช‚ เช›เซ‡:

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, '[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 เชธเซ‡เช•เชจเซเชก เชชเช›เซ€, เชธเชพเชฆเซเชฐเชถเซเชฏ เชฆเซเชตเชพเชฐเชพ, เช…เชฎเซ‡ เชฅเซ‹เชกเชพ เชตเชงเซ เชŸเซเชฏเซเชชเชฒเซเชธ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚:

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+ เชธเซ‡เช•เชจเซเชก เชชเช›เซ€ เชธเชฟเชฒเซ‡เช•เซเชŸเชจเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเซ€เช (เชชเซเชฐเชฅเชฎ เชŸเซเชฏเซเชชเชฒเชจเชพ เชจเชฟเชตเซ‡เชถเชจเซ€ เชถเชฐเซ‚เช†เชคเชฅเซ€ เช—เชฃเชคเชฐเซ€) เช…เชจเซ‡ เชœเซเช“ เช•เซ‡ เชธเชฎเชพเชชเซเชค เชฅเชฏเซ‡เชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชšเซ‚เช•เซเชฏเซเช‚ เช›เซ‡:

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

เช…เชตเช•เชพเชถเชฎเชพเช‚ เชนเชœเซ เชชเชฃ เช•เซ‡เชŸเชฒเชพเช• เชŸเซเชฏเซเชชเชฒเซเชธ เชฌเชพเช•เซ€ เช›เซ‡ เชœเซ‡เชจเซ‡ เชฐเชนเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชฒเช—เชญเช— 30 เชตเชงเซ เชธเซ‡เช•เชจเซเชกเชจเซ‹ เชธเชฎเชฏ เชฎเชณเชถเซ‡. เชคเชฆเซเชชเชฐเชพเช‚เชค, 2 เชจเซ€ ID เช…เชจเซ‡ 1576421257 เชจเซ€ เช†เชœเซ€เชตเชจ ID เชธเชพเชฅเซ‡เชจเชพ เชŸเซเชฏเซเชชเชฒเชฎเชพเช‚เชฅเซ€ 3 เชจเซ€ ID เช…เชจเซ‡ 1576421287 เชจเซ€ เช†เชœเซ€เชตเชจ เชธเชพเชฅเซ‡เชจเชพ เชŸเซเชฏเซเชชเชฒ เชชเชฐ เช–เชธเซ‡เชกเชคเซ€ เชตเช–เชคเซ‡ เชธเซเช•เซ‡เชจ เชฌเช‚เชง เชฅเชˆ เช—เชฏเซเช‚. 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;
};

เชจเชพเชฎ เชตเชฟเชถเซ‡เชทเชคเชพ เช เช•เชพเชฐเซเชฏเชจเซเช‚ เชจเชพเชฎ เช›เซ‡. เชธเซเชชเซ‡เชธ_เช†เชˆเชกเซ€ เชเชŸเซเชฐเซ€เชฌเซเชฏเซเชŸ เช เชœเช—เซเชฏเชพ เช“เชณเช–เช•เชฐเซเชคเชพ เช›เซ‡. rm_index_id เชตเชฟเชถเซ‡เชทเชคเชพ เช เช…เชจเชจเซเชฏ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชจเซเช‚ เช“เชณเช–เช•เชฐเซเชคเชพ เช›เซ‡ เชœเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฏเซเชชเชฒเซเชธ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. it_index_id เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸ เช เช‡เชจเซเชกเซ‡เช•เซเชธเชจเซเช‚ เช“เชณเช–เช•เชฐเซเชคเชพ เช›เซ‡ เชœเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฏเซเชชเชฒเซเชธ เชŸเซเชฐเชพเชตเชฐเซเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. it_index_type เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸ เช เช‡เชจเซเชกเซ‡เช•เซเชธเชจเซ‹ เชชเซเชฐเช•เชพเชฐ เช›เซ‡ เชœเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฏเซเชชเชฒเซเชธ เชŸเซเชฐเชพเชตเชฐเซเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. file_no เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸ เช เช†เชœเซ€เชตเชจ เชธเชพเชฅเซ‡เชจเชพ เชŸเซเชฏเซเชชเชฒ เชซเซ€เชฒเซเชกเชจเซ€ เชธเช‚เช–เซเชฏเชพ เช›เซ‡. เชธเซเช•เซ‡เชจ_เชธเชพเช‡เช เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸ เช เชเช• เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชธเซเช•เซ‡เชจ เช•เชฐเซ‡เชฒ เชŸเซเชฏเซเชชเชฒเซเชธเชจเซ€ เชฎเชนเชคเซเชคเชฎ เชธเช‚เช–เซเชฏเชพ เช›เซ‡. เชธเซเช•เซ‡เชจ_เชŸเชพเช‡เชฎ เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸ เช เชธเซ‡เช•เช‚เชกเชฎเชพเช‚ เชชเซ‚เชฐเซเชฃ เชธเซเช•เซ‡เชจ เชธเชฎเชฏ เช›เซ‡.

เช…เชฎเซ‡ เชชเชพเชฐเซเชธเชฟเช‚เช— เชฆเชฒเซ€เชฒเซ‹เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเชถเซเช‚ เชจเชนเซ€เช‚. เช† เชเช• เช‰เชฆเซเชฏเชฎเซ€ เชชเชฐเช‚เชคเซ เชธเชฐเชณ เช•เชพเชฎ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชคเชฎเชจเซ‡ เชฎเชฆเชฆ เช•เชฐเชถเซ‡ msgpuck. เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“ เชซเช•เซเชค เชเชตเชพ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชธเชพเชฅเซ‡ เชœ เชŠเชญเซ€ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡ เชœเซ‡ เชฒเซเช†เชฎเชพเช‚เชฅเซ€ เชเชฎเชชเซ€_เชฎเซ‡เชช เชชเซเชฐเช•เชพเชฐ เชธเชพเชฅเซ‡ เชœเชŸเชฟเชฒ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชคเชฐเซ€เช•เซ‡ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชธเชฐเชณ เชชเซเชฐเช•เชพเชฐเซ‹ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹