ΠΡΠ΅Π΄ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ
ΠΌΠ΅ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ
ΠΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°Ρ Π±Π΅ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΡ tarantool, Π½Π°ΡΠ΅ΡΠ΅Π½
ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π·Π° tarantool Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΠ°
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ ΠΎΡΠ΄Π°Π»Π΅Ρ ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΌΠΎΠ΄ΡΠ»ΡΡ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΡΡΠΎΠΊ Π½Π° Π³ΠΎΠ΄Π½ΠΎΡΡ ΠΎΡΠ²ΡΠ½:
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. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΡΠΈΠΈΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠΈ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ°ΠΌΠΎ ΡΡΠΈ ΠΏΠΎΠ»Π΅ΡΠ°: ΠΏΡΡΠ²ΠΎΡΠΎ Π΅ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Π²ΡΠΎΡΠΎΡΠΎ Π΅ ΠΈΠΌΠ΅ΠΉΠ», Π° ΡΡΠ΅ΡΠΎΡΠΎ Π΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΆΠΈΠ²ΠΎΡΠ° Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠ°. ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ Π΄ΡΡΠ²ΠΎΠ²ΠΈΠ΄Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π²ΡΡΡ Ρ ΠΏΡΡΠ²ΠΎΡΠΎ ΠΏΠΎΠ»Π΅ ΠΈ Π³ΠΎ Π½Π°ΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΡΠ²ΠΈΡΠ½ΠΎ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡΠ° Π·Π° Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ Π½Π°ΡΠ°ΡΠ° ΡΠΎΠ΄Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°.
Π‘Π»Π΅Π΄ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΡΠ΅Π»Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅:
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})
Π’ΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΡΠΎΡΠ½ΠΎ ΠΊΠ°ΠΊΡΠΎ ΠΌΠΎΠ΄ΡΠ»ΡΡ expirationd, ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Lua. ΠΡΡΠ²ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° start Π΅ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°. ΠΡΠΎΡΠΈΡΡ Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ. Π’ΡΠ΅ΡΠΈΡΡ Π΅ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΡΠΈΡΠΈ. Π§Π΅ΡΠ²ΡΡΡΠΈΡΡ Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΡΡ, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΠ±Ρ ΠΎΠΆΠ΄Π°Π½ΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅. ΠΠ΅ΡΠΈΡΡ Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠ° Ρ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΠΆΠΈΠ²ΠΎΡΠ° (Π½ΠΎΠΌΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π° ΠΎΡ 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+ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ (Π±ΡΠΎΠ΅ΠΉΠΊΠΈ ΠΎΡ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΆ) ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ» expirationd Π²Π΅ΡΠ΅ Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½:
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 ΠΈΠ½Π΄Π΅ΠΊΡ, Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ΡΠΎ ΠΎΡ ΠΏΡΡΠ²ΠΈΡΠ΅Π½. Π‘ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ ΡΠΈ, ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅ Π±ΡΡ Π° Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΡΡΠ²ΠΈΡΠ½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ.
Π‘Π»Π΅Π΄ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΡΠ΅Π»Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° start Ρ Π½ΠΎΠ²ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ:
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+ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ (Π±ΡΠΎΠ΅ΠΉΠΊΠΈ ΠΎΡ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΆ) ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ» expirationd Π²Π΅ΡΠ΅ Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½:
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 ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ Π±ΡΡ Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΠΏΠΎΠ΄ΡΠ΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° exp. Π’ΠΎΠ²Π° ΡΠ° ΠΈΠΊΠΎΠ½ΠΎΠΌΠΈΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ Π² ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ.
ΠΠ° ΡΠΏΡΠ΅ΠΌ Π·Π°Π΄Π°ΡΠ°ΡΠ°:
capped_connection:call('libcapped-expirationd.kill', {'indexed'})
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° Π΄Π°Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ Π½Π΅Π³ΠΎΠ²ΠΈΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π΅Π½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ.
ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° start, ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² ΡΡΡΡΠΊΡΡΡΠ°, Π½Π°ΡΠ΅ΡΠ΅Π½Π° 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;
};
ΠΡΡΠΈΠ±ΡΡΡΡ name Π΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°. ΠΡΡΠΈΠ±ΡΡΡΡ space_id Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ. ΠΡΡΠΈΠ±ΡΡΡΡ rm_index_id Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΡΠΈΡΠΈ. ΠΡΡΠΈΠ±ΡΡΡΡ it_index_id Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡΡ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΠ±Ρ ΠΎΠΆΠ΄Π°Π½ΠΈ. ΠΡΡΠΈΠ±ΡΡΡΡ it_index_type Π΅ ΡΠΈΠΏΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΠ±Ρ ΠΎΠΆΠ΄Π°Π½ΠΈ. ΠΡΡΠΈΠ±ΡΡΡΡ filed_no Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠ° Ρ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΠΆΠΈΠ²ΠΎΡΠ°. ΠΡΡΠΈΠ±ΡΡΡΡ scan_size Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ Π±ΡΠΎΠΉ ΠΊΠΎΡΡΠ΅ΠΆΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠΊΠ°Π½ΠΈΡΠ°Ρ Π² Π΅Π΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ. ΠΡΡΠΈΠ±ΡΡΡΡ 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);
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ - Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠΈ. ΠΡΠ΅ΠΊΠΈ Π±Π»ΠΎΠΊ ΠΎΡ ΠΊΠΎΡΡΠ΅ΠΆΠΈ, Π½Π΅ ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΡ 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);
}
ΠΠΎΠ΄ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Expirationd_breakable:
static bool
expirationd_breakable(struct expirationd_task *task)
{
return task->it_index_id != task->rm_index_id && task->it_index_type == ITER_GT;
}
App
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com