ื›ืชื™ื‘ืช ืžื•ื“ื•ืœ ืคื’ ืชืคื•ื’ื” ืžืฉืœื ื• ืขื‘ื•ืจ tarantool

ื›ืชื™ื‘ืช ืžื•ื“ื•ืœ ืคื’ ืชืคื•ื’ื” ืžืฉืœื ื• ืขื‘ื•ืจ tarantool

ืœืคื ื™ ื–ืžืŸ ืžื” ื”ืชืžื•ื“ื“ื ื• ืขื ื”ื‘ืขื™ื” ืฉืœ ื ื™ืงื•ื™ ื˜ืคืœื™ื ื‘ื—ืœืœื™ื ื˜ืจื ื˜ื•ืœ. ื”ื™ื” ืฆื•ืจืš ืœื”ืชื—ื™ืœ ืืช ื”ื ื™ืงื•ื™ ืœื ื›ืืฉืจ ื‘-tarantool ื›ื‘ืจ ื ื’ืžืจ ื”ื–ื™ื›ืจื•ืŸ, ืืœื ืžืจืืฉ ื•ื‘ืชื“ื™ืจื•ืช ืžืกื•ื™ืžืช. ืขื‘ื•ืจ ืžืฉื™ืžื” ื–ื•, ืœ-tarantool ื™ืฉ ืžื•ื“ื•ืœ ืฉื ื›ืชื‘ ื‘-Lua ืฉื ืงืจื ืชืคื•ื’ื”. ืœืื—ืจ ืฉื”ืฉืชืžืฉื ื• ื‘ืžื•ื“ื•ืœ ื–ื” ื–ืžืŸ ืงืฆืจ, ื”ื‘ื ื• ืฉื”ื•ื ืœื ืžืชืื™ื ืœื ื•: ืขืงื‘ ื ื™ืงื•ื™ ืžืชืžื™ื“ ืฉืœ ื›ืžื•ื™ื•ืช ื’ื“ื•ืœื•ืช ืฉืœ ื ืชื•ื ื™ื, Lua ื ืชืœื” ื‘-GC. ืœื›ืŸ, ื—ืฉื‘ื ื• ืœืคืชื— ืžื•ื“ื•ืœ ืคื’ ืชื•ืงืฃ ืžืฉืœื ื•, ื‘ืชืงื•ื•ื” ืฉื”ืงื•ื“ ืฉื ื›ืชื‘ ื‘ืฉืคืช ืชื›ื ื•ืช ืžืงื•ืžื™ืช ื™ืคืชื•ืจ ืืช ื”ื‘ืขื™ื•ืช ืฉืœื ื• ื‘ืฆื•ืจื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ.

ื“ื•ื’ืžื” ื˜ื•ื‘ื” ืขื‘ื•ืจื ื• ื”ื™ื™ืชื” ืžื•ื“ื•ืœ tarantool ืฉื ืงืจื ื ืฉืœื— ืœืžื—ืฉื‘. ื”ื’ื™ืฉื” ื”ื ื”ื•ื’ื” ื‘ื• ืžืชื‘ืกืกืช ืขืœ ื›ืš ืฉื ื•ืฆืจ ืฉื“ื” ื ืคืจื“ ื‘ื—ืœืœ, ื”ืžืขื™ื“ ืขืœ ืžืฉืš ื—ื™ื™ื• ืฉืœ ื”ื˜ืคื•ืœ, ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ttl. ื”ืžื•ื“ื•ืœ ื‘ืจืงืข ืกื•ืจืง ืืช ื”ื—ืœืœ, ืžืฉื•ื•ื” ืืช ื”-TTL ืœืฉืขื” ื”ื ื•ื›ื—ื™ืช ื•ืžื—ืœื™ื˜ ืื ืœืžื—ื•ืง ืืช ื”-tuple ืื• ืœื. ืงื•ื“ ื”ืžื•ื“ื•ืœ ื”-memcached ื”ื•ื ืคืฉื•ื˜ ื•ืืœื’ื ื˜ื™, ืื‘ืœ ื’ื ืจื™ ืžื“ื™. ืจืืฉื™ืช, ื–ื” ืœื ืœื•ืงื— ื‘ื—ืฉื‘ื•ืŸ ืืช ืกื•ื’ ื”ืื™ื ื“ืงืก ืฉื ืกืจืง ื•ื ืžื—ืง. ืฉื ื™ืช, ื‘ื›ืœ ืžืขื‘ืจ ื ืกืจืงื™ื ื›ืœ ื”ื˜ืคื•ืœื™ื, ืฉืžืกืคืจื ื™ื›ื•ืœ ืœื”ื™ื•ืช ื“ื™ ื’ื“ื•ืœ. ื•ืื ื‘ืžื•ื“ื•ืœ ืฉืคื’ ืชื•ืงืคื• ื ืคืชืจื” ื”ื‘ืขื™ื” ื”ืจืืฉื•ื ื” (ืื™ื ื“ืงืก ื”ืขืฅ ื”ื•ืคืจื“ ืœืžื—ืœืงื” ื ืคืจื“ืช), ืื– ื”ืฉื ื™ ืขื“ื™ื™ืŸ ืœื ืงื™ื‘ืœ ืชืฉื•ืžืช ืœื‘. ืฉืœื•ืฉ ื”ื ืงื•ื“ื•ืช ื”ืœืœื• ืงื‘ืขื• ืžืจืืฉ ืืช ื”ื‘ื—ื™ืจื” ืœื˜ื•ื‘ืช ื›ืชื™ื‘ืช ืงื•ื“ ืžืฉืœื™.

ืชื™ืื•ืจ

ื”ืชื™ืขื•ื“ ืขื‘ื•ืจ 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. ืœืื—ืจ ืžื›ืŸ ืฆื•ืจ ืžืจื—ื‘ ืฉื”ื˜ื•ืคืœื™ื ืฉืœื• ื™ื›ื™ืœื• ืจืง ืฉืœื•ืฉื” ืฉื“ื•ืช: ื”ืจืืฉื•ืŸ ื”ื•ื ืžื–ื”ื” ื™ื™ื—ื•ื“ื™, ื”ืฉื ื™ ื”ื•ื ื“ื•ืืจ ืืœืงื˜ืจื•ื ื™, ื•ื”ืฉืœื™ืฉื™ ื”ื•ื ืžืฉืš ื”ื—ื™ื™ื ืฉืœ ื”-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. ื”ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ ืœืคื•ื ืงืฆื™ื™ืช start ื”ื•ื ื”ืฉื ื”ื™ื™ื—ื•ื“ื™ ืฉืœ ื”ืžืฉื™ืžื”. ื”ืฉื ื™ ื”ื•ื ืžื–ื”ื” ื”ื—ืœืœ. ื”ืฉืœื™ืฉื™ ื”ื•ื ืื™ื ื“ืงืก ื™ื™ื—ื•ื“ื™ ืฉื‘ืืžืฆืขื•ืชื• ื™ื™ืžื—ืงื• tuples. ื”ืจื‘ื™ืขื™ ื”ื•ื ื”ืžื“ื“ ืœืคื™ื• ื™ืขื‘ืจื• ื”ื˜ืคื•ืœื™ื. ื”ื—ืžื™ืฉื™ ื”ื•ื ื”ืžืกืคืจ ืฉืœ ืฉื“ื” ื”ื˜ืคื•ืœ ืขื ืžืฉืš ื”ื—ื™ื™ื (ื”ืžืกืคื•ืจ ืžืชื—ื™ืœ ืž-1, ืœื ืž-0!). ื”ืฉื™ืฉื™ ื•ื”ืฉื‘ื™ืขื™ ื”ื ื”ื’ื“ืจื•ืช ืกืจื™ืงื”. 1024 ื”ื•ื ื”ืžืกืคืจ ื”ืžืจื‘ื™ ืฉืœ tuples ืฉื ื™ืชืŸ ืœืจืื•ืช ื‘ืขืกืงื” ืื—ืช. 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}

ื‘ื•ืื• ื ื‘ื“ื•ืง ืฉื”ื”ื›ื ืกื” ื”ืฆืœื™ื—ื”:

tarantool> box.space.tester.index.primary:select()
---
- - [0, '[email protected]', 1576418976]
  - [1, '[email protected]', 1576418976]
  - [2, '[email protected]', 1576418976]
...

ื‘ื•ืื• ื ื—ื–ื•ืจ ืขืœ ื”ื‘ื—ื™ืจื” ืœืื—ืจ 60+ ืฉื ื™ื•ืช (ืœืกืคื•ืจ ืžืชื—ื™ืœืช ื”ื”ื›ื ืกื” ืฉืœ ื”-tuple ื”ืจืืฉื•ืŸ) ื•ื ืจืื” ืฉืžื•ื“ื•ืœ ื”-capped expirationed ื›ื‘ืจ ืขื•ื‘ื“:

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

ื‘ื•ื ื ื›ื ื™ืก ืฉื•ื‘ ื›ืžื” ื˜ืคื•ืœื™ื ืœื—ืœืœ ืขื ืื•ืจืš ื—ื™ื™ื ืฉืœ 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+ ืฉื ื™ื•ืช (ืœืกืคื•ืจ ืžืชื—ื™ืœืช ื”ื”ื›ื ืกื” ืฉืœ ื”-tuple ื”ืจืืฉื•ืŸ) ื•ื ืจืื” ืฉืžื•ื“ื•ืœ ื”-capped expirationed ื›ื‘ืจ ืขื•ื‘ื“:

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

ืขื“ื™ื™ืŸ ื ื•ืชืจื• ื›ืžื” ื˜ื™ืคื•ืกื™ื ื‘ื—ืœืœ ืฉื™ื”ื™ื• ืœื”ื ืขื•ื“ ื›-30 ืฉื ื™ื•ืช ืœื—ื™ื•ืช. ื™ืชืจื” ืžื›ืš, ื”ืกืจื™ืงื” ื”ื•ืคืกืงื” ื‘ืขืช ืžืขื‘ืจ ืžื˜ื•ืคืœ ืขื ืžื–ื”ื” 2 ื•ืื•ืจืš ื—ื™ื™ื ืฉืœ 1576421257 ืœื˜ื•ืคืœ ืขื ืžื–ื”ื” 3 ื•ืื•ืจืš ื—ื™ื™ื ืฉืœ 1576421287. Tuples ืขื ืื•ืจืš ื—ื™ื™ื ืฉืœ 1576421287 ื•ืžืขืœื” ืœื ื ืกืจืงื• ืขืงื‘ ื”ื–ืžื ื” ืฉืœ ืžืคืชื—ื•ืช ื”-exp index. ื–ื” ื”ื—ื™ืกื›ื•ืŸ ืฉืจืฆื™ื ื• ืœื”ืฉื™ื’ ื›ื‘ืจ ื‘ื”ืชื—ืœื”.

ื‘ื•ืื• ื ืขืฆื•ืจ ืืช ื”ืžืฉื™ืžื”:

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 ื”ื•ื ืžืฆื‘ื™ืข ืœืื™ื˜ืจื˜ื•ืจ ืฉืžืžื ื• ืžืชื—ื™ืœื” ืื• ื ืžืฉื›ืช ื”ืกืจื™ืงื”. ืื™ื˜ืจื˜ื•ืจ ื–ื” ืžื•ื’ื“ืœ ื‘ืื•ืคืŸ ืคื ื™ืžื™ ืขื“ ืฉืžืชืจื—ืฉืช ืฉื’ื™ืื”, ื”ืฉื˜ื— ืื•ื–ืœ ืื• ืฉืœื ื ื™ืชืŸ ืœืขืฆื•ืจ ืืช ื”ืชื”ืœื™ืš ืžืจืืฉ. ื”ืคื•ื ืงืฆื™ื” expirationd_expired ื‘ื•ื“ืงืช ืืช ืžืฉืš ื”ื—ื™ื™ื ืฉืœ tuple, expirationd_delete ืžื•ื—ืงืช tuple, 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”