
ΠΡΠ΅Π΄ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ ΠΌΠ΅ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π° ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠΈ Π² ΡΠΏΠ΅ΠΉΡΠΎΠ²Π΅ΡΠ΅. . ΠΡΠΎΡΠ΅ΡΡΡ Π½Π° ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π½Π΅ ΡΠ°ΠΌΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° tarantool Π²Π΅ΡΠ΅ ΡΠ²ΡΡΡΠ²Π°, Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎΡΡ. ΠΠ° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° Π² tarantool ΠΈΠΌΠ° ΠΌΠΎΠ΄ΡΠ», Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Lua, Π½Π°ΡΠ΅ΡΠ΅Π½ . Π‘Π»Π΅Π΄ ΠΊΡΠ°ΡΠΊΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ» ΠΎΡΡΠ·Π½Π°Ρ ΠΌΠ΅, ΡΠ΅ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° Π½Π°Ρ: ΠΏΡΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, Lua ΡΠ΅ Π·Π°Π±Π°Π²ΡΡΠ΅ ΠΏΠΎΡΠ°Π΄ΠΈ GC. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΌΠΎΠ΄ΡΠ» capped expirationd, ΠΊΠ°ΡΠΎ ΡΠ΅ Π½Π°Π΄ΡΠ²Π°Ρ ΠΌΠ΅, ΡΠ΅ ΠΊΠΎΠ΄ΡΡ, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π½Π°ΡΠΈΠ²Π΅Π½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΠ½Π³ Π΅Π·ΠΈΠΊ, ΡΠ΅ ΡΠ΅ΡΠΈ Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π½ΠΈ ΠΏΠΎ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ Π½Π°ΡΠΈΠ½.
ΠΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°Ρ Π΅ ΠΌΠΎΠ΄ΡΠ»ΡΡ tarantool, Π½Π°ΡΠ΅ΡΠ΅Π½ . ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΡ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ Π² ΡΠΏΠ΅ΠΉΡΠ° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅, Π² ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠ°, ΡΠΎΠ΅ΡΡ ttl. ΠΠΎΠ΄ΡΠ»ΡΡ Π½Π° Π·Π°Π΄Π΅Π½ ΠΏΠ»Π°Π½ ΡΠΊΠ°Π½ΠΈΡΠ° ΡΠΏΠ΅ΠΉΡΠ°, ΡΡΠ°Π²Π½ΡΠ²Π° ttl Ρ ΡΠ΅ΠΊΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π²Π·Π΅ΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π»ΠΈ Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ ΠΊΠΎΡΡΠ΅ΠΆΠ° ΠΈΠ»ΠΈ Π½Π΅. ΠΠΎΠ΄ΡΡ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π° memcached Π΅ ΠΏΡΠΎΡΡ ΠΈ Π΅Π»Π΅Π³Π°Π½ΡΠ΅Π½, Π½ΠΎ ΡΠ²ΡΡΠ΄Π΅ ΠΎΠ±Ρ. ΠΡΡΠ²ΠΎ, ΡΠΎΠΉ Π½Π΅ Π²Π·Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠΈΠΏΠ° ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΠ±Ρ ΠΎΠ΄ΡΡ ΠΈ ΠΈΠ·ΡΡΠΈΡΠ΅ΡΠΎ. ΠΡΠΎΡΠΎ, ΠΏΡΠΈ Π²ΡΠ΅ΠΊΠΈ ΠΎΠ±Ρ ΠΎΠ΄ ΡΠ΅ ΡΠΊΠ°Π½ΠΈΡΠ°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠΈ, ΡΠΈΠΉΡΠΎ Π±ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ° Π³ΠΎΠ»ΡΠΌ. Π Π°ΠΊΠΎ Π² ΠΌΠΎΠ΄ΡΠ»Π° expirationd ΠΏΡΡΠ²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ ΡΠ΅ΡΠ΅Π½ (tree-ΠΈΠ½Π΄Π΅ΠΊΡΡΡ Π΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ Π² ΡΠ²ΠΎΠΉ ΠΊΠ»Π°Ρ), Π²ΡΠΎΡΠΈΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ» Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π’Π΅Π·ΠΈ ΡΡΠΈ ΡΠΎΡΠΊΠΈ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π° ΠΈΠ·Π±ΠΎΡΠ° Π² ΠΏΠΎΠ»Π·Π° Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΊΠΎΠ΄.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° tarantool ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΈ Ρ ΡΠ°Π½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ Π½Π° C. ΠΠ΅Π΄Π½Π°Π³Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ Π½Π΅Π³ΠΎ, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΡΡΠ° Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ ΠΊΠΎΠ΄, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊ ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅, Π½Π°Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ capped ΠΌΠΎΠ΄ΡΠ», Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° , , ΠΈ .
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ ΠΎΡΠ΄Π°Π»Π΅Ρ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΌΠΎΠ΄ΡΠ»ΡΡ capped expirationd ΠΎΡΠ²ΡΠ½:
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. ΠΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Ρ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ: start ΠΈ kill. Π ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ ΠΎΡ Lua Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° box.schema.func.create ΠΈ box.schema.user.grant. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠΏΠ΅ΠΉΡ, ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ°ΠΌΠΎ ΡΡΠΈ ΠΏΠΎΠ»Π΅ΡΠ°: ΠΏΡΡΠ²ΠΎΡΠΎ - ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Π²ΡΠΎΡΠΎΡΠΎ - Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½Π° ΠΏΠΎΡΠ°, ΡΡΠ΅ΡΠΎΡΠΎ - Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΆΠΈΠ²ΠΎΡ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠ°. ΠΡΡΡ Ρ ΠΏΡΡΠ²ΠΎΡΠΎ ΠΏΠΎΠ»Π΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ tree-ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈ Π³ΠΎ Π½Π°ΡΠΈΡΠ°ΠΌΠ΅ primary. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Ρ Π½Π°ΡΠ°ΡΠ° ΠΌΠ΅ΡΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°.
Π‘Π»Π΅Π΄ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° start:
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 - Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΡΠ»Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ Π·Π° ΠΎΠ±Ρ ΠΎΠ΄ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ. ΠΠΊΠΎ ΡΠΎΠ²Π° Π΅ tree-ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΎΠ±Ρ ΠΎΠ΄ΡΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΡ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΈΡ ΠΊΠ»ΡΡ Π΄ΠΎ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠΈΡ. ΠΠΊΠΎ Π΅ Π½ΡΠΊΠ°ΠΊΡΠ² Π΄ΡΡΠ³, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ hash-ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΎΠ±Ρ ΠΎΠ΄ΡΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ΅Π΄. ΠΡΠΈ Π΅Π΄Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Π³Π»Π΅ΠΆΠ΄Π°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠΈ Π½Π° ΡΠΏΠ΅ΠΉΡΠ°.
ΠΠ΅ΠΊΠ° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Π² ΡΠΏΠ΅ΠΉΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠ° Ρ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΆΠΈΠ²ΠΎΡ 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]
...ΠΠ° ΠΏΠΎΠ²ΡΠΎΡΠΈΠΌ select ΡΠ»Π΅Π΄ 60+ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ (ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΠΌΠ΅ ΠΎΡ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΆ) ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΡ capped 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)Π’ΡΠΊ Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΡΠΎΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π² ΠΏΡΡΠ²ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΌΠ°Π»ΠΊΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΡΡΡ Ρ ΡΡΠ΅ΡΠΎΡΠΎ ΠΏΠΎΠ»Π΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ tree ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈ Π³ΠΎ Π½Π°ΡΠΈΡΠ°ΠΌΠ΅ exp. Π’ΠΎΠ·ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠ΅Π½ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½, Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° Ρ ΠΈΠΌΠ΅ΡΠΎ primary. ΠΠ±Ρ ΠΎΠ΄ΡΡ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° exp, Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ΡΠΎ ΠΏΠΎ primary. ΠΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ Π° ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ.
Π‘Π»Π΅Π΄ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° 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, '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]
...ΠΠ° ΠΏΠΎΠ²ΡΠΎΡΠΈΠΌ select ΡΠ»Π΅Π΄ 60+ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ (ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΠΌΠ΅ ΠΎΡ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΆ) ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΡ capped expirationd Π²Π΅ΡΠ΅ Π΅ ΡΡΠ°Π±ΠΎΡΠΈΠ»:
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 ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ Π±ΡΡ Π° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°Π½ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π±Π°ΡΠ° Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° exp. Π’ΠΎΠ²Π° Π΅ ΠΈΠΊΠΎΠ½ΠΎΠΌΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΈΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ.
ΠΠ° ΡΠΏΡΠ΅ΠΌ Π·Π°Π΄Π°ΡΠ°ΡΠ°:
capped_connection:call('libcapped-expirationd.kill', {'indexed'})Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈΡΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ. ! Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΡΠΏΡΠ΅ΠΌ ΡΠ°ΠΌΠΎ Π½Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π·Π° ΠΎΠ±Ρ ΠΎΠ΄ Π½Π° ΡΠΏΠ΅ΠΉΡΠ°.
ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° start, ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² ΡΡΡΡΠΊΡΡΡΠ°, Π½Π°ΡΠ΅ΡΠ΅Π½Π° expirationd_task:
ΡΡΡΡΠΊΡΡΡΠ° 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 β ΡΠΈΠΏ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΠ±Ρ ΠΎΠ΄Π° Π½Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅. ΠΡΡΠΈΠ±ΡΡ field_no β Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ Π½Π° Π·Π°ΠΏΠΈΡΠ° Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ. ΠΡΡΠΈΠ±ΡΡ scan_size β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π³Π»Π΅Π΄Π° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ. ΠΡΡΠΈΠ±ΡΡ scan_time β Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΡΠ»Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΡΠΌΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅. Π’ΠΎΠ²Π° Π΅ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠ°, Π½ΠΎ Π½Π΅ ΡΠ»ΠΎΠΆΠ½Π° ΡΠ°Π±ΠΎΡΠ°, Π² ΠΊΠΎΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° . ΠΠΎΠΆΠ΅ Π΄Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΎΡ 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 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;
}ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° !
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
