ПисањС сопствСног ΠΌΠΎΠ΄ΡƒΠ»Π° са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΌ Ρ€ΠΎΠΊΠΎΠΌ Ρ‚Ρ€Π°Ρ˜Π°ΡšΠ° Π·Π° Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ»

ПисањС сопствСног ΠΌΠΎΠ΄ΡƒΠ»Π° са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΌ Ρ€ΠΎΠΊΠΎΠΌ Ρ‚Ρ€Π°Ρ˜Π°ΡšΠ° Π·Π° Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ»

ΠŸΡ€Π΅ Π½Π΅ΠΊΠΎΠ³ Π²Ρ€Π΅ΠΌΠ΅Π½Π° суочили смо сС са ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΌ Ρ‡ΠΈΡˆΡ›Π΅ΡšΠ° Ρ‚ΡƒΠΏΠ»Π΅ Ρƒ просторима Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ». Π§ΠΈΡˆΡ›Π΅ΡšΠ΅ јС Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π·Π°ΠΏΠΎΡ‡Π΅Ρ‚ΠΈ Π½Π΅ ΠΊΠ°Π΄Π° јС Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ»-Ρƒ Π²Π΅Ρ› понСстало ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π΅, Π²Π΅Ρ› ΡƒΠ½Π°ΠΏΡ€Π΅Π΄ ΠΈ Π½Π° ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΎΡ˜ Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜ΠΈ. Π—Π° овај Π·Π°Π΄Π°Ρ‚Π°ΠΊ, Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ» ΠΈΠΌΠ° ΠΌΠΎΠ΄ΡƒΠ» написан Ρƒ Π›ΡƒΠ° Ρ˜Π΅Π·ΠΈΠΊΡƒ који сС Π·ΠΎΠ²Π΅ ΠΈΡΡ‚ΠΈΡ†Π°ΡšΠ΅. Након ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ° ΠΎΠ²ΠΎΠ³ ΠΌΠΎΠ΄ΡƒΠ»Π°, схватили смо Π΄Π° нијС ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π°Π½ Π·Π° нас: Π·Π±ΠΎΠ³ сталног Ρ‡ΠΈΡˆΡ›Π΅ΡšΠ° Π²Π΅Π»ΠΈΠΊΠ΅ ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, Π›ΡƒΠ° јС висила Ρƒ Π“Π¦-Ρƒ. Π‘Ρ‚ΠΎΠ³Π° смо Ρ€Π°Π·ΠΌΠΈΡˆΡ™Π°Π»ΠΈ ΠΎ Ρ€Π°Π·Π²ΠΎΡ˜Ρƒ сопствСног ΠΌΠΎΠ΄ΡƒΠ»Π° са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΌ Ρ€ΠΎΠΊΠΎΠΌ Ρ‚Ρ€Π°Ρ˜Π°ΡšΠ°, Π½Π°Π΄Π°Ρ˜ΡƒΡ›ΠΈ сС Π΄Π° Ρ›Π΅ ΠΊΠΎΠ΄ написан Π½Π° ΠΌΠ°Ρ‚Π΅Ρ€ΡšΠ΅ΠΌ програмском Ρ˜Π΅Π·ΠΈΠΊΡƒ Ρ€Π΅ΡˆΠΈΡ‚ΠΈ нашС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π½Π° Π½Π°Ρ˜Π±ΠΎΡ™ΠΈ ΠΌΠΎΠ³ΡƒΡ›ΠΈ Π½Π°Ρ‡ΠΈΠ½.

Π”ΠΎΠ±Π°Ρ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° нас јС Π±ΠΈΠΎ Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ» ΠΌΠΎΠ΄ΡƒΠ» ΠΏΠΎΠ΄ Π½Π°Π·ΠΈΠ²ΠΎΠΌ ΠΌΠ΅ΠΌΡ†Π°Ρ†Ρ…Π΅Π΄. ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏ који сС Ρƒ ΡšΠ΅ΠΌΡƒ користи заснива сС Π½Π° Ρ‡ΠΈΡšΠ΅Π½ΠΈΡ†ΠΈ Π΄Π° сС Ρƒ простору ΠΊΡ€Π΅ΠΈΡ€Π° посСбно ΠΏΠΎΡ™Π΅ којС ΡƒΠΊΠ°Π·ΡƒΡ˜Π΅ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΈ Π²Π΅ΠΊ Ρ‚ΡƒΠΏΠ»Π΅, Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ€Π΅Ρ‡ΠΈΠΌΠ°, Ρ‚Ρ‚Π». ΠœΠΎΠ΄ΡƒΠ» Ρƒ ΠΏΠΎΠ·Π°Π΄ΠΈΠ½ΠΈ скСнира простор, ΡƒΠΏΠΎΡ€Π΅Ρ’ΡƒΡ˜Π΅ Π’Π’Π› са Ρ‚Ρ€Π΅Π½ΡƒΡ‚Π½ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΎΠΌ ΠΈ ΠΎΠ΄Π»ΡƒΡ‡ΡƒΡ˜Π΅ Π΄Π° Π»ΠΈ Π΄Π° ΠΎΠ±Ρ€ΠΈΡˆΠ΅ Ρ‚ΡƒΠΏΠ»Π΅ ΠΈΠ»ΠΈ Π½Π΅. Код ΠΌΠΎΠ΄ΡƒΠ»Π° ΠΌΠ΅ΠΌΡ†Π°Ρ†Ρ…Π΅Π΄ јС Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π°Π½ ΠΈ Π΅Π»Π΅Π³Π°Π½Ρ‚Π°Π½, Π°Π»ΠΈ ΠΏΡ€Π΅Π²ΠΈΡˆΠ΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ‡ΠΊΠΈ. ΠŸΡ€Π²ΠΎ, Π½Π΅ ΡƒΠ·ΠΈΠΌΠ° Ρƒ ΠΎΠ±Π·ΠΈΡ€ Ρ‚ΠΈΠΏ индСкса који сС ΠΏΠΎΠΏΠΈΡΡƒΡ˜Π΅ ΠΈ Π±Ρ€ΠΈΡˆΠ΅. Π”Ρ€ΡƒΠ³ΠΎ, Π½Π° сваком ΠΏΡ€ΠΎΠ»Π°Π·Ρƒ сС ΡΠΊΠ΅Π½ΠΈΡ€Π°Ρ˜Ρƒ свС Ρ‚ΠΎΡ€ΠΊΠ΅, Ρ‡ΠΈΡ˜ΠΈ Π±Ρ€ΠΎΡ˜ ΠΌΠΎΠΆΠ΅ Π±ΠΈΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Π²Π΅Π»ΠΈΠΊ. И Π°ΠΊΠΎ јС Ρƒ ΠΌΠΎΠ΄ΡƒΠ»Ρƒ истСкао ΠΏΡ€Π²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ (индСкс стабла јС издвојСн Ρƒ посСбну класу), ΠΎΠ½Π΄Π° сС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΈ Π΄Π°Ρ™Π΅ нијС ΠΎΠ±Ρ€Π°Ρ›Π°Π»Π° паТња. ОвС Ρ‚Ρ€ΠΈ Ρ‚Π°Ρ‡ΠΊΠ΅ су ΠΏΡ€Π΅Π΄ΠΎΠ΄Ρ€Π΅Π΄ΠΈΠ»Π΅ ΠΈΠ·Π±ΠΎΡ€ Ρƒ корист писања сопствСног ΠΊΠΎΠ΄Π°.

Опис

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π·Π° Ρ‚Π°Ρ€Π°Π½Ρ‚ΠΎΠΎΠ» ΠΈΠΌΠ° Π²Π΅ΠΎΠΌΠ° Π΄ΠΎΠ±Ρ€Ρƒ ΠŸΡ€ΠΈΡ€ΡƒΡ‡Π½ΠΈΠΊ ΠΎ Ρ‚ΠΎΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ својС ΡƒΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Π½Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Ρƒ Π¦. ΠŸΡ€Π΅ свСга, ΠΏΡ€Π΅Π΄Π»Π°ΠΆΠ΅ΠΌ Π΄Π° сС ΡƒΠΏΠΎΠ·Π½Π°Ρ‚Π΅ са Ρ‚ΠΈΠΌ ΠΊΠ°ΠΊΠΎ бистС Ρ€Π°Π·ΡƒΠΌΠ΅Π»ΠΈ ΠΎΠ½Π΅ ΡƒΠΌΠ΅Ρ‚ΠΊΠ΅ са ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠ° ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ који Ρ›Π΅ сС ΠΏΠΎΡ˜Π°Π²ΠΈΡ‚ΠΈ испод. Π’Π°ΠΊΠΎΡ’Π΅ Π²Ρ€Π΅Π΄ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ ΠΏΠ°ΠΆΡšΡƒ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†Π° Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚Π΅ који су доступни ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ писања вашСг сопствСног ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎΠ³ ΠΌΠΎΠ΄ΡƒΠ»Π°, Π½Π°ΠΈΠΌΠ΅ ΠΊΡƒΡ‚ΠΈΡ˜Π°, Π²Π»Π°ΠΊΠ½ΠΎ, индСкс ΠΈ Ρ‚ΠΊΠ½.

ΠŸΠΎΡ‡Π½ΠΈΠΌΠΎ ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ° ΠΈ поглСдајмо ΠΊΠ°ΠΊΠΎ споља ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΌΠΎΠ΄ΡƒΠ» са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΌ Ρ€ΠΎΠΊΠΎΠΌ Ρ‚Ρ€Π°Ρ˜Π°ΡšΠ°:

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;
}

Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°

Π˜Π·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ‚ΠΈ Π½Π° ΠΎΠ²Π΄Π΅!

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€