Kulemba gawo lathu lotha ntchito la tarantool

Kulemba gawo lathu lotha ntchito la tarantool

Kale tinkakumana ndi vuto lakuyeretsa ma tuples m'malo tarantool. Kuyeretsa kunayenera kuyambika osati pamene tarantool inali itatha kale kukumbukira, koma pasadakhale komanso pafupipafupi. Pa ntchitoyi, tarantool ili ndi gawo lolembedwa mu Lua lotchedwa kutha ntchito. Titagwiritsa ntchito gawoli kwa nthawi yochepa, tinazindikira kuti sizinali zoyenera kwa ife: chifukwa cha kuyeretsa kosalekeza kwa deta yambiri, Lua anapachikidwa mu GC. Chifukwa chake, tidaganiza zopanga gawo lathu lomwe latha, tikuyembekeza kuti kachidindo kolembedwa m'chinenero chachibadwidwe chitha kuthetsa mavuto athu m'njira yabwino kwambiri.

Chitsanzo chabwino kwa ife chinali gawo la tarantool lotchedwa memcached. Njira yomwe imagwiritsidwa ntchito mmenemo imachokera pa mfundo yakuti malo osiyana amapangidwa mu danga, zomwe zimasonyeza nthawi ya moyo wa tuple, mwa kuyankhula kwina, ttl. Gawo lakumbuyo limayang'ana malo, kufananiza TTL ndi nthawi yapano ndikusankha kuchotsa tuple kapena ayi. Khodi ya memcached module ndiyosavuta komanso yokongola, koma ndiyokhazikika. Choyamba, sizimaganizira mtundu wa index yomwe ikukwawa ndikuchotsedwa. Kachiwiri, pa chiphaso chilichonse ma tuples amafufuzidwa, kuchuluka kwake komwe kungakhale kwakukulu. Ndipo ngati mu gawo lotha nthawi vuto loyamba linathetsedwa (mlozera wamtengo unagawidwa m'kalasi yosiyana), ndiye kuti wachiwiri sanalandirebe chidwi. Mfundo zitatu izi zidakonzeratu chisankho mokomera kulemba code yanga.

mafotokozedwe

Zolemba za tarantool zili ndi zabwino kwambiri phunziro za momwe mungalembere njira zanu zosungidwa mu C. Choyamba, ndikupangira kuti muzidziwe bwino kuti mumvetsetse zoyikazo ndi malamulo ndi ma code omwe adzawonekere pansipa. M'pofunikanso kumvetsera umboni ku zinthu zomwe zilipo polemba ma module anu omwe ali ndi capped, ndiye bokosi, CHIKWANGWANI, index ΠΈ txn.

Tiyeni tiyambire patali ndikuwona momwe gawo lotha ntchito limawonekera kunja:

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)

Kuti zikhale zosavuta, timayambitsa tarantool mu bukhu lomwe laibulale yathu ya libcapped-expirationd.so ili. Ntchito ziwiri zimatumizidwa ku laibulale: kuyamba ndi kupha. Gawo loyamba ndikupangitsa kuti ntchitoyi ipezeke kuchokera ku Lua pogwiritsa ntchito box.schema.func.create ndi box.schema.user.grant. Kenako pangani malo omwe ma tuples azikhala ndi magawo atatu okha: yoyamba ndi chizindikiritso chapadera, yachiwiri ndi imelo, ndipo yachitatu ndi nthawi yamoyo wa tuple. Timamanga ndondomeko ya mtengo pamwamba pa munda woyamba ndikuutcha kuti choyambirira. Kenako timapeza chinthu cholumikizira ku library yathu yakunyumba.

Pambuyo pokonzekera, yambitsani ntchito yoyambira:

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

Chitsanzochi chidzagwira ntchito pakusanthula chimodzimodzi ndi gawo lomwe latha, lomwe linalembedwa mu Lua. Mtsutso woyamba pa ntchito yoyambira ndi dzina lapadera la ntchitoyi. Chachiwiri ndi chozindikiritsa malo. Chachitatu ndi cholozera chapadera chomwe ma tuple adzachotsedwa. Chachinayi ndi mlozera momwe ma tuple adzadutsa. Chachisanu ndi chiwerengero cha gawo la tuple ndi moyo wonse (chiwerengero chimayambira 1, osati 0!). Chachisanu ndi chimodzi ndi chachisanu ndi chiwiri ndi zoikamo za sikani. 1024 ndiye kuchuluka kwa ma tuples omwe amatha kuwonedwa pakachitika kamodzi. 3600 - nthawi yonse yojambula mumasekondi.

Dziwani kuti chitsanzocho chimagwiritsa ntchito index yomweyi pokwawa ndi kufufuta. Ngati ichi ndi index ya mtengo, ndiye kuti kudutsa kumachitika kuchokera ku kiyi yaing'ono kupita ku yayikulu. Ngati pali zina, mwachitsanzo, index ya hashi, ndiye kuti kudutsa kumachitika, monga lamulo, mwachisawawa. Ma tuple onse am'mlengalenga amafufuzidwa mu sikani imodzi.

Tiyeni tiyikemo angapo mumlengalenga ndi moyo wa masekondi 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}

Tiyeni tiwone ngati kuyikako kwachita bwino:

tarantool> box.space.tester.index.primary:select()
---
- - [0, '[email protected]', 1576418976]
  - [1, '[email protected]', 1576418976]
  - [2, '[email protected]', 1576418976]
...

Tiyeni tibwereze zosankhidwa pambuyo pa masekondi 60+ (kuwerengera kuyambira koyambirira kwa kuyika kwa tuple yoyamba) ndikuwona kuti gawo lomwe latha kale lakonzedwa kale:

tarantool> box.space.tester.index.primary:select()
---
  - []
...

Tiyeni tiyime ntchitoyi:

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

Tiyeni tiwone chitsanzo chachiwiri pomwe cholozera chosiyana chimagwiritsidwa ntchito pokwawa:

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)

Chilichonse apa ndi chofanana ndi chitsanzo choyamba, kupatulapo zochepa. Timamanga ndondomeko ya mtengo pamwamba pa munda wachitatu ndikuwutcha exp. Mlozerawu suyenera kukhala wapadera, mosiyana ndi index yomwe imatchedwa primary. Kudutsa kudzachitika ndi exp index, ndikuchotsa ndi pulayimale. Tikukumbukira kuti m'mbuyomu zonsezi zidachitika pogwiritsa ntchito index yayikulu.

Pambuyo pa ntchito yokonzekera, timayendetsa ntchito yoyambira ndi mfundo zatsopano:

capped_connection:call('libcapped-expirationd.start', {'indexed', box.space.tester.id, box.space.tester.index.primary, box.space.tester.index.exp, 3, 1024, 3600})

Tiyeni tiyikenso ma tuple angapo mu danga ndi moyo wa masekondi 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}

Pambuyo pa masekondi 30, mofananiza, tiwonjezeranso zolemba zina zingapo:

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}

Tiyeni tiwone ngati kuyikako kwachita bwino:

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]
...

Tiyeni tibwereze zosankhidwa pambuyo pa masekondi 60+ (kuwerengera kuyambira koyambirira kwa kuyika kwa tuple yoyamba) ndikuwona kuti gawo lomwe latha kale lakonzedwa kale:

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

Palinso ma tuples omwe atsala m'danga omwe adzakhala ndi masekondi 30 kuti akhale ndi moyo. Kuphatikiza apo, jambulani idayima posuntha kuchokera ku tuple yokhala ndi ID ya 2 ndi moyo wonse wa 1576421257 kupita ku tuple yokhala ndi ID ya 3 komanso moyo wa 1576421287. makiyi a exp index. Izi ndi ndalama zomwe timafuna kuti tipeze poyambira.

Tiyeni tiyime ntchitoyi:

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

РСализация

Njira yabwino yofotokozera mbali zonse za polojekiti ndi chiyambi chake. code! Monga gawo la zofalitsa, tidzangoyang'ana pa mfundo zofunika kwambiri, zomwe ndi ma algorithms a space bypass.

Zotsutsana zomwe timadutsa poyambira zimasungidwa mu dongosolo lotchedwa 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;
};

Dzinali ndi dzina la ntchitoyo. The space_id chikhalidwe ndi chizindikiritso cha danga. Chikhalidwe cha rm_index_id ndicho chizindikiritso cha index yapadera yomwe ma tuples azichotsedwa. Chikhalidwe cha it_index_id ndicho chizindikiritso cha index yomwe ma tuple adzadutsa. Mtundu wa it_index_type ndi mtundu wa index yomwe ma tuple adzadutsa. The filed_no chikhalidwe ndi chiwerengero cha tuple munda ndi moyo. The scan_size character is the maximum number of tuples that is scanned in one transaction. The scan_time attribute ndi nthawi yonse yojambula mumasekondi.

Sitiganiziranso zofotokozera. Iyi ndi ntchito yovuta koma yosavuta, yomwe laibulale ingakuthandizeni msgpuck. Zovuta zimatha kubwera ndi ma index omwe amaperekedwa kuchokera ku Lua monga dongosolo la deta lovuta ndi mtundu wa mp_map, osagwiritsa ntchito mitundu yosavuta mp_bool, mp_double, mp_int, mp_uint ndi mp_array. Koma palibe chifukwa chowerengera index yonse. Mukungoyenera kuyang'ana zosiyana zake, kuwerengera mtundu wake ndikuchotsa chozindikiritsa.

Timalemba ma prototypes a ntchito zonse zomwe zimagwiritsidwa ntchito pogawa:

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

Tsopano tiyeni tipitirire ku chinthu chofunikira kwambiri - malingaliro odutsa malo ndikuchotsa ma tuples. Chida chilichonse cha ma tuple osakulirapo kuposa scan_size chimasinthidwa ndikusinthidwa pakachitika kamodzi. Ngati zatheka, izi zachitika; ngati cholakwika chichitika, chimabwezeredwa. Mtsutso womaliza ku expirationd_iterate function ndi cholozera kwa iterator pomwe kusanthula kumayambira kapena kumapitilira. Iterator iyi imakulitsidwa mkati mpaka cholakwika chichitika, danga limatha, kapena sizingatheke kuyimitsa ntchitoyi pasadakhale. Ntchito expirationd_expired imayang'ana nthawi ya moyo wa tuple, expirationd_delete imachotsa tuple, expirationd_breakable imayang'ana ngati tikufunika kupitiriza.

Nambala ya ntchito ya 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;
}

Khodi yantchito expiration_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 ntchito code:

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

Khodi yantchito expiration_breakable:

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

Ntchito

Mutha kuwona gwero la code pa apa!

Source: www.habr.com

Kuwonjezera ndemanga