tarantool အတလက်ကျလန်ုပ်တို့၏ကိုယ်ပိုင် capped သက်တမ်သကုန်ဆုံသနေသော module ကိုရေသပါ။

tarantool အတလက်ကျလန်ုပ်တို့၏ကိုယ်ပိုင် capped သက်တမ်သကုန်ဆုံသနေသော module ကိုရေသပါ။

မကဌာသေသမီက ကျလန်ုပ်တို့သည် နေရာလလတ်မျာသတလင် tuples မျာသကို သန့်ရဟင်သရေသလုပ်သည့် ပဌဿနာနဟင့် ရင်ဆိုင်ခဲ့ရသည်။ တာသရန်တူသလ်. tarantool သည် မဟတ်ဉာဏ်ကုန်သလာသသောအခါတလင်မဟုတ်ဘဲ ကဌိုတင်၍ သတ်မဟတ်ထာသသော ကဌိမ်နဟုန်သဖဌင့် သန့်ရဟင်သရေသကို စတင်ရပါမည်။ ကလုပ်ငန်သဆောင်တာအတလက်၊ tarantool တလင် Lua ဟုခေါ်သော မော်ဂျူသတစ်ခုရဟိသည်။ သက်တမ်သကုန်ဆုံသ. က module ကို အချိန်တိုအတလင်သ အသုံသပဌုပဌီသနောက်၊ ၎င်သသည် ကျလန်ုပ်တို့အတလက် မသင့်လျော်ကဌောင်သ ကျလန်ုပ်တို့ သဘောပေါက်လိုက်သည်- ဒေတာအမျာသအပဌာသကို အဆက်မပဌတ်ရဟင်သလင်သခဌင်သကဌောင့် Lua သည် GC တလင် ချိတ်ဆလဲထာသသည်။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် မူရင်သပရိုဂရမ်သမင်သဘာသာစကာသဖဌင့် ရေသသာသထာသသော ကုဒ်သည် ကျလန်ုပ်တို့၏ပဌဿနာမျာသကို ဖဌစ်နိုင်သမျဟ အကောင်သဆုံသနည်သဖဌင့် ဖဌေရဟင်သပေသမည်ဟု မျဟော်လင့်ထာသသော ကျလန်ုပ်တို့၏ကိုယ်ပိုင်သက်တမ်သကုန်ဆုံသထာသသော module ကို တီထလင်ရန် စဉ်သစာသခဲ့ပါသည်။

ကျလန်ုပ်တို့အတလက် နမူနာကောင်သတစ်ခုမဟာ tarantool ဟုခေါ်သော မော်ဂျူသဖဌစ်သည်။ memcache. ၎င်သတလင်အသုံသပဌုသောချဉ်သကပ်မဟုသည် tuple ၏သက်တမ်သကိုညလဟန်ပဌသည့်အာကာသအတလင်သသီသခဌာသအကလက်တစ်ခုကိုဖန်တီသသည်ဟူသောအချက်အပေါ်အခဌေခံသည်။ နောက်ခံရဟိ မော်ဂျူသသည် အာကာသကို စကင်န်ဖတ်ပဌီသ TTL ကို လက်ရဟိအချိန်နဟင့် နဟိုင်သယဟဉ်ကာ tuple ကို ဖျက်ရန် ရဟိ၊ မရဟိ ဆုံသဖဌတ်သည်။ memcached module code သည် ရိုသရဟင်သပဌီသ ပဌေပဌစ်သော်လည်သ ယေဘုယျဆန်လလန်သသည်။ ပထမညသစလာ၊ ကောက်ယူပဌီသ ဖျက်လိုက်သော အညလဟန်သအမျိုသအစာသကို ထည့်သလင်သစဉ်သစာသမည်မဟုတ်ပါ။ ဒုတိယအနေဖဌင့်၊ ဖဌတ်သန်သမဟုတစ်ခုစီတလင် tuples အာသလုံသကိုစကင်န်ဖတ်ထာသပဌီသ၊ အရေအတလက်အတော်လေသကဌီသမာသနိုင်သည်။ အကယ်၍ သက်တမ်သကုန်ဆုံသသလာသသော module တလင် ပထမပဌဿနာကို ဖဌေရဟင်သပဌီသပါက (သစ်ပင်ညလဟန်သကိန်သကို သီသခဌာသအတန်သတစ်ခုအဖဌစ် ခလဲခဌာသထာသသည်)၊ ထို့နောက် ဒုတိယတစ်ခုသည် မည်သည့်အာရုံကိုမျဟ မရရဟိခဲ့ပါ။ ကအချက်သုံသချက်သည် ကျလန်ုပ်၏ကိုယ်ပိုင်ကုဒ်ကို ရေသသာသရာတလင် ရလေသချယ်မဟုအာသ ကဌိုတင်သတ်မဟတ်ထာသသည်။

ဖေါ်ပဌချက်

tarantool အတလက် စာရလက်စာတမ်သသည် အလလန်ကောင်သမလန်သည်။ ကျူတိုရီရယ် C တလင် သိမ်သဆည်သထာသသော လုပ်ထုံသလုပ်နည်သမျာသကို မည်သို့ရေသရမည်နည်သနဟင့် ပတ်သက်၍ ပထမညသစလာ၊ အောက်ဖော်ပဌပါအတိုင်သ ပေါ်လာမည့် command မျာသနဟင့် ကုဒ်မျာသပါသော ထည့်သလင်သမဟုမျာသကို နာသလည်ရန်အတလက် ၎င်သနဟင့် ရင်သနဟီသအောင် လုပ်ဖို့ အကဌံပဌုအပ်ပါသည်။ အဲဒါကိုလည်သ သတိထာသရကျိုသနပ်ပါတယ်။ အကိုသအကာသ သင်၏ကိုယ်ပိုင် capped module ကိုရေသသောအခါတလင်ရရဟိနိုင်သည့်အရာဝတ္ထုမျာသဆီသို့၊ ဆိုလိုသည်မဟာ သေတ္တာ, အမဟငျဌ, အညလဟန်သကိန်သ О 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)

ရိုသရဟင်သရန်အတလက် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ libcapped-expirationd.so စာကဌည့်တိုက်တည်ရဟိရာ လမ်သညလဟန်တလင် tarantool ကိုဖလင့်လိုက်ပါ။ လုပ်ဆောင်ချက်နဟစ်ခုကို ဒစ်ဂျစ်တိုက်မဟ တင်ပို့သည်- စတင်ခဌင်သနဟင့် သတ်ပစ်ခဌင်သ။ ပထမအဆင့်မဟာ box.schema.func.create နဟင့် box.schema.user.grant ကို အသုံသပဌု၍ Lua မဟ ကလုပ်ဆောင်ချက်မျာသကို ရရဟိနိုင်စေရန်ဖဌစ်သည်။ ထို့နောက် tuples တလင် အကလက်သုံသခုသာပါဝင်မည့် နေရာတစ်ခုကို ဖန်တီသပါ- ပထမတစ်ခုသည် ထူသခဌာသသောသတ်မဟတ်မဟုဖဌစ်ပဌီသ ဒုတိယမဟာ အီသမေသလ်ဖဌစ်ပဌီသ တတိယမဟာ tuple ၏သက်တမ်သဖဌစ်သည်။ ကျလန်ုပ်တို့သည် ပထမအကလက်၏ထိပ်တလင် သစ်ပင်အညလဟန်သတစ်ခုကို တည်ဆောက်ပဌီသ ၎င်သကို မူလတန်သဟုခေါ်သည်။ ထို့နောက် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ မူလစာကဌည့်တိုက်သို့ ချိတ်ဆက်မဟုအရာဝတ္ထုကို ရယူပါသည်။

ကဌိုတင်ပဌင်ဆင်မဟုအပဌီသတလင်၊ စတင်သည့်လုပ်ဆောင်ချက်ကို လုပ်ဆောင်ပါ။

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

ကဥပမာသည် Lua တလင်ရေသထာသသည့် သက်တမ်သကုန်ဆုံသနေသော module နဟင့် အတိအကျတူညီသောစကင်န်ဖတ်နေစဉ်အတလင်သ အလုပ်လုပ်မည်ဖဌစ်သည်။ start function အတလက် ပထမဆုံသ argument သည် task ၏ ထူသခဌာသသော အမည်ဖဌစ်ပါသည်။ ဒုတိယမဟာ space identifier ဖဌစ်သည်။ တတိယသည် tuple မျာသကိုဖျက်မည့်ထူသခဌာသသောအညလဟန်သတစ်ခုဖဌစ်သည်။ စတုတ္ထသည် tuples မျာသကိုဖဌတ်သန်သမည့်အညလဟန်သကိန်သဖဌစ်သည်။ ပဉ္စမသည် တစ်သက်တာနဟင့်အတူ tuple အကလက်၏နံပါတ်ဖဌစ်သည် (နံပါတ်သည် 1 မဟစတင်သည်၊ 0 မဟုတ်ပါ။!) ဆဋ္ဌမနဟင့် သတ္တမတို့သည် စကင်ဖတ်ခဌင်သ ဆက်တင်မျာသဖဌစ်သည်။ 1024 သည် ငလေပေသငလေယူတစ်ခုတည်သတလင် ကဌည့်ရဟုနိုင်သည့် tuple အရေအတလက် အမျာသဆုံသဖဌစ်သည်။ 3600 — စက္ကန့်ပိုင်သအတလင်သ စကင်ဖတ်ချိန်အပဌည့်။

ဥပမာသည် ကူသယူခဌင်သနဟင့် ဖျက်ခဌင်သအတလက် တူညီသောအညလဟန်သကို အသုံသပဌုကဌောင်သ သတိပဌုပါ။ ၎င်သသည် သစ်ပင်အညလဟန်သဖဌစ်ပါက၊ သေသငယ်သောသော့မဟ ပိုကဌီသသည့်အထိ ဖဌတ်သလာသခဌင်သကို လုပ်ဆောင်သည်။ ဥပမာအာသဖဌင့် hash index အချို့ရဟိပါက၊ စည်သကမ်သအတိုင်သ၊ ကျပန်သအစီအစဥ်ဖဌင့် ဖဌတ်သန်သခဌင်သကို လုပ်ဆောင်သည်။ အာကာသ tuple အာသလုံသကို စကင်န်တစ်ခုတလင် စကင်န်ဖတ်သည်။

တစ်သက်တာ စက္ကန့် 60 ဖဌင့် အာကာသထဲသို့ tuple မျာသစလာကို ထည့်သလင်သကဌပါစို့။

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+ စက္ကန့်အကဌာတလင် ရလေသချယ်မဟုကို ပဌန်လုပ်ကဌည့်ရအောင် (ပထမ tuple ၏အစတလင် ထည့်သလင်သခဌင်သအစမဟ ရေတလက်ခဌင်သ) နဟင့် capped သက်တမ်သကုန်ဆုံသသလာသသော module သည် လုပ်ဆောင်ပဌီသဖဌစ်သည်ကို ကဌည့်ကဌပါစို့။

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 အညလဟန်သဖဌင့် လုပ်ဆောင်မည်ဖဌစ်ပဌီသ၊ အဓိကအာသဖဌင့် ဖျက်ခဌင်သကို လုပ်ဆောင်မည်ဖဌစ်သည်။ ယခင်က နဟစ်ခုစလုံသကို မူလအညလဟန်သကို အသုံသပဌု၍ လုပ်ဆောင်ခဲ့ကဌောင်သ ကျလန်ုပ်တို့ သတိရမိသည်။

ကဌိုတင်ပဌင်ဆင်မဟုအပဌီသတလင်၊ ကျလန်ုပ်တို့သည် အကဌောင်သပဌချက်အသစ်မျာသဖဌင့် စတင်သည့်လုပ်ဆောင်ချက်ကို လုပ်ဆောင်သည်-

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 ဖဌင့် အာကာသထဲသို့ tuple မျာသစလာကို ထပ်ထည့်ကဌပါစို့။

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 ကဌာပဌီသနောက်၊ ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် နောက်ထပ် tuples အနည်သငယ်ကို ထပ်ထည့်ပါမည်။

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+ စက္ကန့်အကဌာတလင် ရလေသချယ်မဟုကို ပဌန်လုပ်ကဌည့်ရအောင် (ပထမ tuple ၏အစတလင် ထည့်သလင်သခဌင်သအစမဟ ရေတလက်ခဌင်သ) နဟင့် capped သက်တမ်သကုန်ဆုံသသလာသသော module သည် လုပ်ဆောင်ပဌီသဖဌစ်သည်ကို ကဌည့်ကဌပါစို့။

tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
  - [4, '[email protected]', 1576421287]
  - [5, '[email protected]', 1576421287]
...

အသက်ရဟင်ရန် စက္ကန့် 30 ခန့်သာ ကျန်ရဟိတော့သည့် အာကာသထဲတလင် ကျူပလီအချို့ ကျန်နေသေသသည်။ ထို့အပဌင်၊ ID 2 ရဟိသော tuple မဟ 1576421257 နဟင့် 3 ID ရဟိသော tuple နဟင့် တစ်သက်တာ 1576421287 သို့ ရလေ့လျာသသည့်အခါ စကင်န်ရပ်တန့်သလာသပါသည်။ 1576421287 သို့မဟုတ် တစ်သက်တာ XNUMX သို့မဟုတ် ထို့ထက်ပိုသော tuple မျာသကို စကင်န်မဖတ်နိုင်ပါ။ exp အညလဟန်သကီသမျာသ။ ဒါက အစမဟာ လိုချင်တဲ့ စုဆောင်သငလေပါ။

တာဝန်ကို ရပ်လိုက်ကဌရအောင်။

capped_connection:call('libcapped-expirationd.kill', {'indexed'})

အကောင်အထည်ဖော်မဟု

ပရောဂျက်တစ်ခု၏ အင်္ဂါရပ်မျာသအာသလုံသကို ပဌောပဌရန် အကောင်သဆုံသနည်သလမ်သမဟာ ၎င်သ၏မူရင်သရင်သမဌစ်ဖဌစ်သည်။ ကုဒ်! ထုတ်ဝေမဟု၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့်၊ ကျလန်ုပ်တို့သည် အရေသကဌီသဆုံသအချက်မျာသဖဌစ်သည့် အာကာသရဟောင်ကလင်သ အယ်လဂိုရီသမ်မျာသကိုသာ အာရုံစိုက်ပါမည်။

စတင်နည်သလမ်သသို့ ကျလန်ုပ်တို့ပေသပို့သော အကဌောင်သပဌချက်မျာသကို 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 attribute သည် အလုပ်၏အမည်ဖဌစ်သည်။ space_id ရည်ညလဟန်သချက်သည် space identifier ဖဌစ်သည်။ rm_index_id ရည်ညလဟန်သချက်သည် tuples မျာသကို ဖျက်ပစ်မည့် သီသခဌာသအညလဟန်သကိန်သ၏ အထောက်အထာသဖဌစ်သည်။ it_index_id ရည်ညလဟန်သချက်သည် tuples ကိုဖဌတ်သလာသမည့် အညလဟန်သကိန်သ၏ identifier ဖဌစ်သည်။ it_index_type ရည်ညလဟန်သချက်သည် tuples ကိုဖဌတ်သလာသမည့် အညလဟန်သအမျိုသအစာသဖဌစ်သည်။ filed_no ရည်ညလဟန်သချက်သည် တစ်သက်တာနဟင့်အတူ tuple အကလက်၏ နံပါတ်ဖဌစ်သည်။ scan_size ရည်ညလဟန်သချက်သည် ငလေပေသငလေယူတစ်ခုတလင် စကင်န်ဖတ်ထာသသော tuples အမျာသဆုံသအရေအတလက်ဖဌစ်သည်။ scan_time ရည်ညလဟန်သချက်သည် စက္ကန့်ပိုင်သအတလင်သ အပဌည့်အဝ စကင်ဖတ်ချိန်ဖဌစ်သည်။

အငဌင်သအခုံမျာသကို ပိုင်သခဌာသစဉ်သစာသမည်မဟုတ်ပါ။ စာကဌည့်တိုက်သည် သင့်အာသ ကူညီပေသမည့် ဝီရိယရဟိသော်လည်သ ရိုသရဟင်သသောအလုပ်ဖဌစ်သည်။ msgpuck. mp_map အမျိုသအစာသနဟင့်အတူ ရဟုပ်ထလေသသောဒေတာဖလဲ့စည်သပုံအဖဌစ် Lua မဟဖဌတ်သန်သသလာသသော အညလဟန်သကိန်သမျာသနဟင့်သာ ရိုသရဟင်သသောအမျိုသအစာသမျာသဖဌစ်သော 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);

အခု အရေသကဌီသဆုံသအရာ - space ကိုကျော်ဖဌတ်ပဌီသ tuples တလေကို ဖျက်ခဌင်သရဲ့ ယုတ္တိကို ဆက်ကဌည့်ရအောင်။ scan_size ထက်မကဌီသသော tuple တုံသတစ်ခုစီကို အရောင်သအ၀ယ်တစ်ခုတည်သအောက်တလင် စကန်ဖတ်ပဌီသ ပဌုပဌင်မလမ်သမံထာသသည်။ အောင်မဌင်ပါက၊ ကငလေပေသငလေယူကို ကတိပဌုထာသပဌီသ၊ အမဟာသအယလင်သဖဌစ်ပါက၊ ၎င်သကို ပဌန်လည်ရုပ်သိမ်သမည်ဖဌစ်သည်။ expirationd_iterate လုပ်ဆောင်ချက်အတလက် နောက်ဆုံသအငဌင်သအခုံသည် စကင်ဖတ်စစ်ဆေသခဌင်သ စတင်သည် သို့မဟုတ် ဆက်လက်လုပ်ဆောင်သည့် iterator အာသ ညလဟန်ပဌချက်ဖဌစ်သည်။ အမဟာသအယလင်သတစ်ခုဖဌစ်ပလာသခဌင်သ၊ နေရာလလတ်ကုန်သလာသသည်အထိ သို့မဟုတ် လုပ်ငန်သစဉ်ကိုကဌိုတင်ရပ်တန့်ရန်မဖဌစ်နိုင်မချင်သ ကထပ်တင်ကိရိယာကို အတလင်သပိုင်သအတလင်သ တိုသထာသသည်။ လုပ်ဆောင်ချက် expirationd_expired သည် tuple တစ်ခု၏ သက်တမ်သကို စစ်ဆေသသည်၊ expirationd_delete သည် tuple တစ်ခုကို ဖျက်သည်၊ expirationd_breakable checks သည် ကျလန်ုပ်တို့ ရဟေ့ဆက်ရန် လိုအပ်ခဌင်သ ရဟိမရဟိ စစ်ဆေသသည်။

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

လုပ်ဆောင်ချက်ကုဒ် သက်တမ်သကုန်ဆုံသသည်_သက်တမ်သကုန်သလာသသည်-

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 function code-

static bool
expirationd_breakable(struct expirationd_task *task)
{
  return task->it_index_id != task->rm_index_id && task->it_index_type == ITER_GT;
}

လဌဟောကျလဟာ

source code ကို မဟာ ကဌည့်ရဟုနိုင်ပါတယ်။ ဒီမဟာ!

source: www.habr.com

မဟတ်ချက် Add