ΠΡΠ΅ Π½Π΅ΠΊΠΎΠ³ Π²ΡΠ΅ΠΌΠ΅Π½Π° ΡΡΠΎΡΠΈΠ»ΠΈ ΡΠΌΠΎ ΡΠ΅ ΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΌ ΡΠΈΡΡΠ΅ΡΠ° ΡΡΠΏΠ»Π΅ Ρ ΠΏΡΠΎΡΡΠΎΡΠΈΠΌΠ°
ΠΠΎΠ±Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°Ρ ΡΠ΅ Π±ΠΈΠΎ ΡΠ°ΡΠ°Π½ΡΠΎΠΎΠ» ΠΌΠΎΠ΄ΡΠ» ΠΏΠΎΠ΄ Π½Π°Π·ΠΈΠ²ΠΎΠΌ
ΠΠΏΠΈΡ
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π·Π° ΡΠ°ΡΠ°Π½ΡΠΎΠΎΠ» ΠΈΠΌΠ° Π²Π΅ΠΎΠΌΠ° Π΄ΠΎΠ±ΡΡ
ΠΠΎΡΠ½ΠΈΠΌΠΎ ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ° ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π°ΡΠΌΠΎ ΠΊΠ°ΠΊΠΎ ΡΠΏΠΎΡΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΌΠΎΠ΄ΡΠ» ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΌ ΡΠΎΠΊΠΎΠΌ ΡΡΠ°ΡΠ°ΡΠ°:
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)
Π Π°Π΄ΠΈ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΡΠΈ, ΠΏΠΎΠΊΡΠ΅ΡΠ΅ΠΌΠΎ ΡΠ°ΡΠ°Π½ΡΠΎΠΎΠ» Ρ ββΠ΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΡ Π³Π΄Π΅ ΡΠ΅ Π½Π°Π»Π°Π·ΠΈ Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π»ΠΈΠ±ΡΠ°ΠΏΠΏΠ΅Π΄-Π΅ΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄.ΡΠΎ. ΠΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΠΎΠ·Π΅ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅: ΡΡΠ°ΡΡ ΠΈ ΠΊΠΈΠ»Π». ΠΡΠ²ΠΈ ΠΊΠΎΡΠ°ΠΊ ΡΠ΅ Π΄Π° ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΡΠ΅ ΡΡΠΈΠ½ΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΈΠΌ ΠΈΠ· ΠΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ Π±ΠΎΠΊ.ΡΡΡ Π΅ΠΌΠ°.ΡΡΠ½Ρ.ΡΡΠ΅Π°ΡΠ΅ ΠΈ Π±ΠΎΠΊ.ΡΡΡ Π΅ΠΌΠ°.ΡΡΠ΅Ρ.Π³ΡΠ°Π½Ρ. ΠΠ°ΡΠΈΠΌ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΎΡ ΡΠΈΡΠ΅ ΡΠ΅ ΡΠΎΡΠΊΠ΅ ΡΠ°Π΄ΡΠΆΠ°ΡΠΈ ΡΠ°ΠΌΠΎ ΡΡΠΈ ΠΏΠΎΡΠ°: ΠΏΡΠ²ΠΎ ΡΠ΅ ΡΠ΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Π΄ΡΡΠ³ΠΎ ΡΠ΅ Π΅-ΠΏΠΎΡΡΠ°, Π° ΡΡΠ΅ΡΠ΅ ΡΠ΅ ΠΆΠΈΠ²ΠΎΡΠ½ΠΈ Π²Π΅ΠΊ ΡΠΎΡΠΊΠ΅. ΠΠΈ Π³ΡΠ°Π΄ΠΈΠΌΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΡΠ°Π±Π»Π° Π½Π° Π²ΡΡ Ρ ΠΏΡΠ²ΠΎΠ³ ΠΏΠΎΡΠ° ΠΈ Π½Π°Π·ΠΈΠ²Π°ΠΌΠΎ Π³Π° ΠΏΡΠΈΠΌΠ°ΡΠ½ΠΈΠΌ. ΠΠ°ΡΠΈΠΌ Π΄ΠΎΠ±ΠΈΡΠ°ΠΌΠΎ ΠΎΠ±ΡΠ΅ΠΊΠ°Ρ Π²Π΅Π·Π΅ ΡΠ° Π½Π°ΡΠΎΠΌ ΠΌΠ°ΡΠΈΡΠ½ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΌ.
ΠΠ°ΠΊΠΎΠ½ ΠΏΡΠΈΠΏΡΠ΅ΠΌΠ½ΠΈΡ ΡΠ°Π΄ΠΎΠ²Π°, ΠΏΠΎΠΊΡΠ΅Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡ ΡΡΠ°ΡΡ:
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 ΠΈ ΠΆΠΈΠ²ΠΎΡΠ½ΠΈΠΌ Π²Π΅ΠΊΠΎΠΌ ΠΎΠ΄ 1576421257 Ρ ΡΠΎΡΠΊΡ ΡΠ° ΠΠ-ΠΎΠΌ 3 ΠΈ ΠΆΠΈΠ²ΠΎΡΠ½ΠΈΠΌ Π²Π΅ΠΊΠΎΠΌ ΠΎΠ΄ 1576421287. Π’ΠΎΡΠΊΠ΅ ΡΠ° ΠΆΠΈΠ²ΠΎΡΠ½ΠΈΠΌ Π²Π΅ΠΊΠΎΠΌ ΠΎΠ΄ 1576421287 ΠΈΠ»ΠΈ Π²ΠΈΡΠ΅ Π½ΠΈΡΡ ΡΠΊΠ΅Π½ΠΈΡΠ°Π½Π΅ Π·Π±ΠΎΠ³ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄Π° ΠΊΡΡΡΠ΅Π²ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ° Π΅ΠΊΠΏ. Π’ΠΎ ΡΠ΅ ΡΡΡΠ΅Π΄Π° ΠΊΠΎΡΡ ΡΠΌΠΎ ΠΆΠ΅Π»Π΅Π»ΠΈ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ ΠΏΠΎΡΠ΅ΡΠΊΡ.
ΠΠ°ΡΡΡΠ°Π²ΠΈΠΌΠΎ Π·Π°Π΄Π°ΡΠ°ΠΊ:
capped_connection:call('libcapped-expirationd.kill', {'indexed'})
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°
ΠΠ°ΡΠ±ΠΎΡΠΈ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠ΅ ΠΈΡΠΏΡΠΈΡΠ° ΠΎ ΡΠ²ΠΈΠΌ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠ° ΠΏΡΠΎΡΠ΅ΠΊΡΠ° ΡΠ΅ ΡΠ΅Π³ΠΎΠ² ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΈΠ·Π²ΠΎΡ.
ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΊΠΎΡΠ΅ ΠΏΡΠΎΡΠ»Π΅ΡΡΡΠ΅ΠΌΠΎ Ρ ΡΡΠ°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ ΡΡΠ²Π°ΡΡ Ρ ΡΡΡΡΠΊΡΡΡΠΈ ΠΊΠΎΡΠ° ΡΠ΅ Π·ΠΎΠ²Π΅ Π΅ΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄_ΡΠ°ΡΠΊ:
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;
};
ΠΡΡΠΈΠ±ΡΡ Π½Π°ΠΌΠ΅ ΡΠ΅ Π½Π°Π·ΠΈΠ² Π·Π°Π΄Π°ΡΠΊΠ°. ΠΡΡΠΈΠ±ΡΡ ΡΠΏΠ°ΡΠ΅_ΠΈΠ΄ ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΡΠΎΡΠ°. ΠΡΡΠΈΠ±ΡΡ ΡΠΌ_ΠΈΠ½Π΄Π΅ΠΊ_ΠΈΠ΄ ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΠ³ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΊΠΎΡΠΈΠΌ ΡΠ΅ ΡΠΎΡΠΊΠ΅ Π±ΠΈΡΠΈ ΠΎΠ±ΡΠΈΡΠ°Π½Π΅. ΠΡΡΠΈΠ±ΡΡ ΠΈΡ_ΠΈΠ½Π΄Π΅ΠΊ_ΠΈΠ΄ ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΡΠ΅Π³ ΡΠ΅ ΡΠ΅ ΡΠΎΡΠΊΠ΅ ΠΏΡΠ΅Π»Π°Π·ΠΈΡΠΈ. ΠΡΡΠΈΠ±ΡΡ ΠΈΡ_ΠΈΠ½Π΄Π΅ΠΊ_ΡΠΈΠΏΠ΅ ΡΠ΅ ΡΠΈΠΏ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΡΠ΅Π³ ΡΠ΅ ΡΠ΅ ΡΠΎΡΠΊΠ΅ ΠΏΡΠ΅Π»Π°Π·ΠΈΡΠΈ. ΠΡΡΠΈΠ±ΡΡ ΡΠΈΠ»Π΅Π΄_Π½ΠΎ ΡΠ΅ Π±ΡΠΎΡ ΠΏΠΎΡΠ° ΡΡΠΏΠ»Π΅ ΡΠ° ΠΆΠΈΠ²ΠΎΡΠ½ΠΈΠΌ Π²Π΅ΠΊΠΎΠΌ. ΠΡΡΠΈΠ±ΡΡ ΡΡΠ°Π½_ΡΠΈΠ·Π΅ ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π°Π½ Π±ΡΠΎΡ ΡΠΎΡΠΊΠΈ ΠΊΠΎΡΠ΅ ΡΠ΅ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΡ Ρ ΡΠ΅Π΄Π½ΠΎΡ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠΈ. ΠΡΡΠΈΠ±ΡΡ ΡΡΠ°Π½_ΡΠΈΠΌΠ΅ ΡΠ΅ ΠΏΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ° Ρ ΡΠ΅ΠΊΡΠ½Π΄Π°ΠΌΠ°.
ΠΠ΅ΡΠ΅ΠΌΠΎ ΡΠ°Π·ΠΌΠ°ΡΡΠ°ΡΠΈ ΡΠ°ΡΡΠ»Π°ΡΠΈΠ²Π°ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½Π°ΡΠ°. ΠΠ²ΠΎ ΡΠ΅ ΠΌΡΠΊΠΎΡΡΠΏΠ°Π½, Π°Π»ΠΈ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π°Π½ ΠΏΠΎΡΠ°ΠΎ, Ρ ΡΠ΅ΠΌΡ ΡΠ΅ Π²Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠΎΠΌΠΎΡΠΈ
ΠΠ°Π²ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΎΠ²Π΅ ΡΠ²ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΊΠΎΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ Π·Π° ΡΠ°ΡΡΠ»Π°ΡΠΈΠ²Π°ΡΠ΅:
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);
Π‘Π°Π΄Π° ΠΏΡΠ΅ΡΠΈΠΌΠΎ Π½Π° ΠΎΠ½ΠΎ Π½Π°ΡΠ²Π°ΠΆΠ½ΠΈΡΠ΅ - Π»ΠΎΠ³ΠΈΠΊΡ Π·Π°ΠΎΠ±ΠΈΠ»Π°ΠΆΠ΅ΡΠ° ΠΏΡΠΎΡΡΠΎΡΠ° ΠΈ Π±ΡΠΈΡΠ°ΡΠ° ΡΡΠΏΠ»Π΅. Π‘Π²Π°ΠΊΠΈ Π±Π»ΠΎΠΊ ΡΠΎΡΠΊΠΈ Π½Π΅ Π²Π΅ΡΠΈ ΠΎΠ΄ ΡΡΠ°Π½_ΡΠΈΠ·Π΅ ΡΠ΅ ΡΠΊΠ΅Π½ΠΈΡΠ° ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΡΡΠ΅ Ρ ΠΎΠΊΠ²ΠΈΡΡ ΡΠ΅Π΄Π½Π΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ΅. ΠΠΊΠΎ ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½Π°, ΠΎΠ²Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠ΅ ΡΡΠ΅Π·Π°Π½Π°; Π°ΠΊΠΎ Π΄ΠΎΡΠ΅ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠ΅, ΠΎΠ½Π° ΡΠ΅ Π²ΡΠ°ΡΠ° Π½Π°Π·Π°Π΄. ΠΠΎΡΠ»Π΅Π΄ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΡΠ΅ Π΅ΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄_ΠΈΡΠ΅ΡΠ°ΡΠ΅ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·ΠΈΠ²Π°Ρ Π½Π° ΠΈΡΠ΅ΡΠ°ΡΠΎΡ ΠΈΠ· ΠΊΠΎΡΠ΅Π³ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΠΈΡΠ΅ ΠΈΠ»ΠΈ ΡΠ΅ Π½Π°ΡΡΠ°Π²ΡΠ°. ΠΠ²Π°Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠ°Π²Π° ΡΠ²Π΅ Π΄ΠΎΠΊ Π½Π΅ Π΄ΠΎΡΠ΅ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠ΅, Π΄ΠΎΠΊ Π½Π΅ ΠΏΠΎΠ½Π΅ΡΡΠ°Π½Π΅ ΠΏΡΠΎΡΡΠΎΡΠ° ΠΈΠ»ΠΈ Π½ΠΈΡΠ΅ ΠΌΠΎΠ³ΡΡΠ΅ Π·Π°ΡΡΡΠ°Π²ΠΈΡΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠ½Π°ΠΏΡΠ΅Π΄. Π€ΡΠ½ΠΊΡΠΈΡΠ° Π΅ΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄_Π΅ΠΊΠΏΠΈΡΠ΅Π΄ ΠΏΡΠΎΠ²Π΅ΡΠ°Π²Π° ΠΆΠΈΠ²ΠΎΡΠ½ΠΈ Π²Π΅ΠΊ ΡΡΠΏΠ»Π΅, Π΅ΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄_Π΄Π΅Π»Π΅ΡΠ΅ Π±ΡΠΈΡΠ΅ ΡΡΠΏΠ»Π΅, Π΅ΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄_Π±ΡΠ΅Π°ΠΊΠ°Π±Π»Π΅ ΠΏΡΠΎΠ²Π΅ΡΠ°Π²Π° Π΄Π° Π»ΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΠΈΠ΄Π΅ΠΌΠΎ Π΄Π°ΡΠ΅.
ΠΠΊΠΏΠΈΡΠ°ΡΠΈΠΎΠ½Π΄_ΠΈΡΠ΅ΡΠ°ΡΠ΅ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΡΠ΅:
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;
}
Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°
ΠΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π°ΡΠΈ Π½Π°
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ