
ΠΡΠ΅Π΄ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠ΅Π΄ Π½Π°Ρ Π²ΡΠ·Π½ΠΈΠΊΠ½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Ρ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°ΡΠ°. . ΠΠΎΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π½Π΅ ΠΊΠΎΠ³Π°ΡΠΎ Π½Π° tarantool Π²Π΅ΡΠ΅ ΡΠ²ΡΡΡΠ²Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎΡΡ. ΠΠ° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° Π² tarantool ΠΈΠΌΠ° ΠΌΠΎΠ΄ΡΠ», Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Lua, Π½Π°ΡΠ΅ΡΠ΅Π½ . Π‘Π»Π΅Π΄ ΠΊΡΠ°ΡΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ» ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅, ΡΠ΅ ΡΠΎΠΉ Π½Π΅ Π½ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠΆΠ΄Π°: ΠΏΡΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΈ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ Lua Π²ΠΈΡΠΈ Π² GC. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ Π·Π°ΠΌΠΈΡΠ»ΠΈΡ ΠΌΠ΅ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΌΠΎΠ΄ΡΠ» capped expirationd, Π½Π°Π΄ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅, ΡΠ΅ ΠΊΠΎΠ΄ΡΡ, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΡΠΎΠ΄Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ Π΅Π·ΠΈΠΊ, ΡΠ΅ ΡΠ΅ΡΠΈ Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π½ΠΈ ΠΏΠΎ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ Π½Π°ΡΠΈΠ½.
ΠΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°Ρ Π±Π΅ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΡ tarantool, Π½Π°ΡΠ΅ΡΠ΅Π½ . ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΡ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅, Π² ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ Π½Π° ΠΊΠΎΡΡΠ΅ΠΆΠ°, Ρ.Π΅. ttl. ΠΠΎΠ΄ΡΠ»ΡΡ Π½Π° Π·Π°Π΄Π΅Π½ ΠΏΠ»Π°Π½ ΡΠΊΠ°Π½ΠΈΡΠ° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ, ΡΡΠ°Π²Π½ΡΠ²Π° ttl Ρ ΡΠ΅ΠΊΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π²Π·Π΅ΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π»ΠΈ Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ ΠΊΠΎΡΡΠ΅ΠΆΠ° ΠΈΠ»ΠΈ Π½Π΅. ΠΠΎΠ΄ΡΡ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π° memcached Π΅ ΠΏΡΠΎΡΡ ΠΈ Π΅Π»Π΅Π³Π°Π½ΡΠ΅Π½, Π½ΠΎ ΡΠ²ΡΡΠ΄Π΅ ΠΎΠ±Ρ. ΠΡΡΠ²ΠΎ, ΡΠΎΠΉ Π½Π΅ ΠΎΡΡΠΈΡΠ° ΡΠΈΠΏΠ° ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΠ±Ρ ΠΎΠ΄ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅. ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ, ΠΏΡΠΈ Π²ΡΡΠΊΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΡΠ΅ ΡΠΊΠ°Π½ΠΈΡΠ°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠΈ, ΡΠΈΠΉΡΠΎ Π±ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ° Π³ΠΎΠ»ΡΠΌ. Π Π°ΠΊΠΎ Π² ΠΌΠΎΠ΄ΡΠ»Π° expirationd ΠΏΡΡΠ²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ ΡΠ΅ΡΠ΅Π½ (Π΄Π΅ΡΠ΅Π²ΠΎΡΠΎ-ΠΈΠ½Π΄Π΅ΠΊΡΡΡ Π΅ ΠΈΠ·Π²Π΅Π΄Π΅Π½ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΊΠ»Π°Ρ), ΡΠΎ Π²ΡΠΎΡΠΈΡΡ Π²ΡΠ΅ ΡΠ°ΠΊΠ° ΠΎΡΡΠ°Π²Π° Π±Π΅Π· Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π’Π΅Π·ΠΈ ΡΡΠΈ ΡΠΎΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π° ΠΈΠ·Π±ΠΎΡΠ° Π² ΠΏΠΎΠ»Π·Π° Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡ Π½ΠΈ ΠΊΠΎΠ΄.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° 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. ΠΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ Π° ΡΠ°ΠΌΠΎ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° 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:
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 β Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΡΠ»Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΎ. Π’ΠΎΠ²Π° Π΅ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠ°, Π½ΠΎ Π½Π΅ ΡΠ»ΠΎΠΆΠ½Π° ΡΠ°Π±ΠΎΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° . Π’ΡΡΠ΄Π½ΠΎΡΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΎΡ 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
