ПишСм наш собствСн ΠΌΠΎΠ΄ΡƒΠ» с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ срок Π½Π° валидност Π·Π° tarantool

ПишСм наш собствСн ΠΌΠΎΠ΄ΡƒΠ» с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ срок Π½Π° валидност Π·Π° tarantool

ΠŸΡ€Π΅Π΄ΠΈ извСстно Π²Ρ€Π΅ΠΌΠ΅ сС ΡΠ±Π»ΡŠΡΠΊΠ°Ρ…ΠΌΠ΅ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с почистванСто Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ tarantool. ΠŸΠΎΡ‡ΠΈΡΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ Π½Π΅ ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π½Π° tarantool Π²Π΅Ρ‡Π΅ бСшС ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ°Π½Π°, Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° чСстота. Π—Π° Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π° tarantool ΠΈΠΌΠ° ΠΌΠΎΠ΄ΡƒΠ», написан Π½Π° Lua, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡƒΠ» Π·Π° ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅, Ρ€Π°Π·Π±Ρ€Π°Ρ…ΠΌΠ΅, Ρ‡Π΅ Π½Π΅ Π΅ подходящ Π·Π° нас: ΠΏΠΎΡ€Π°Π΄ΠΈ постоянно почистванС Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ количСства Π΄Π°Π½Π½ΠΈ, Lua висСшС Π² GC. Π—Π°Ρ‚ΠΎΠ²Π° помислихмС Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ наш собствСн ΠΌΠΎΠ΄ΡƒΠ» с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ срок Π½Π° годност, надявайки сС, Ρ‡Π΅ ΠΊΠΎΠ΄ΡŠΡ‚, написан Π½Π° Ρ€ΠΎΠ΄Π΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅, Ρ‰Π΅ Ρ€Π΅ΡˆΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ Π½ΠΈ ΠΏΠΎ Π½Π°ΠΉ-добрия възмоТСн Π½Π°Ρ‡ΠΈΠ½.

Π”ΠΎΠ±ΡŠΡ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° нас бСшС ΠΌΠΎΠ΄ΡƒΠ»ΡŠΡ‚ tarantool, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ Memcached. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΡ‚ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ сС основава Π½Π° Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π² пространството сС създава ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΆΠΈΠ²ΠΎΡ‚Π° Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°, с Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΡƒΠΌΠΈ ttl. ΠœΠΎΠ΄ΡƒΠ»ΡŠΡ‚ във Ρ„ΠΎΠ½ΠΎΠ² Ρ€Π΅ΠΆΠΈΠΌ сканира пространството, сравнява TTL с Ρ‚Π΅ΠΊΡƒΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Ρ€Π΅ΡˆΠ°Π²Π° Π΄Π°Π»ΠΈ Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΈΠ»ΠΈ Π½Π΅. ΠšΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π° memcached Π΅ прост ΠΈ Π΅Π»Π΅Π³Π°Π½Ρ‚Π΅Π½, Π½ΠΎ Ρ‚Π²ΡŠΡ€Π΄Π΅ ΠΎΠ±Ρ‰. ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ Π²Π·Π΅ΠΌΠ° ΠΏΠΎΠ΄ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° Π½Π° индСкса, ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΎΠ±Ρ…ΠΎΠΆΠ΄Π° ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°. Π’Ρ‚ΠΎΡ€ΠΎ, ΠΏΡ€ΠΈ всяко ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ сС сканират всички ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, Ρ‡ΠΈΠΉΡ‚ΠΎ Π±Ρ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС доста голям. И Π°ΠΊΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π° expirationd ΠΏΡŠΡ€Π²ΠΈΡΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ бСшС Ρ€Π΅ΡˆΠ΅Π½ (Π΄ΡŠΡ€Π²ΠΎΠ²ΠΈΠ΄Π½ΠΈΡΡ‚ индСкс бСшС ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ клас), Ρ‚ΠΎ вторият всС ΠΎΡ‰Π΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π’Π΅Π·ΠΈ Ρ‚Ρ€ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ…Π° ΠΈΠ·Π±ΠΎΡ€Π° Π² ΠΏΠΎΠ»Π·Π° Π½Π° писанСто Π½Π° собствСн ΠΊΠΎΠ΄.

описаниС

ДокумСнтацията Π·Π° 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. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ пространство, Ρ‡ΠΈΠΈΡ‚ΠΎ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ само Ρ‚Ρ€ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π°: ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ Π΅ ΠΈΠΌΠ΅ΠΉΠ», Π° Ρ‚Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ Π΅ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π° Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°ΠΌΠ΅ Π΄ΡŠΡ€Π²ΠΎΠ²ΠΈΠ΄Π΅Π½ индСкс Π²ΡŠΡ€Ρ…Ρƒ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΈ Π³ΠΎ Π½Π°Ρ€ΠΈΡ‡Π°ΠΌΠ΅ ΠΏΡŠΡ€Π²ΠΈΡ‡Π½ΠΎ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ‚Π° Π·Π° Π²Ρ€ΡŠΠ·ΠΊΠ° към Π½Π°ΡˆΠ°Ρ‚Π° Ρ€ΠΎΠ΄Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

Π‘Π»Π΅Π΄ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° стартирайтС функцията Π·Π° стартиранС:

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 Π΅ ΠΏΡŠΠ»Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° сканиранС Π² сСкунди.

Няма Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π·Π° Ρ€Π°Π·Π±ΠΎΡ€. Π’ΠΎΠ²Π° Π΅ Ρ‚Ρ€ΡƒΠ΄Π½Π°, Π½ΠΎ проста Ρ€Π°Π±ΠΎΡ‚Π°, с която Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ 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);

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡ‚ΠΎ - Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° заобикалянС Π½Π° пространството ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ. ВсСки Π±Π»ΠΎΠΊ ΠΎΡ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, Π½Π΅ ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΡ‚ 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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€