Na-ede modul mebie nke anyị maka tarantool

Na-ede modul mebie nke anyị maka tarantool

Oge ụfọdụ gara aga, anyị nwere nsogbu nke ihicha tuples na oghere tarantool. Ekwesịrị ịmalite nhicha ọ bụghị mgbe tarantool na-agwụlarị ebe nchekwa, mana n'ihu na n'oge ụfọdụ. Maka ọrụ a, tarantool nwere modul edere na Lua nke a na-akpọ ngafe. Mgbe anyị jisịrị modul a obere oge, anyị chọpụtara na ọ dịghị mma maka anyị: n'ihi nhicha mgbe niile nke nnukwu data, Lua kpọgidere na GC. Ya mere, anyị chere maka ịmepụta modul nke anyị kpuchiri ekpuchi, na-atụ anya na koodu e dere n'asụsụ mmemme ga-edozi nsogbu anyị n'ụzọ kacha mma.

Ezigbo ihe atụ maka anyị bụ modul tarantool a na-akpọ kpochapụrụ. Ụzọ eji eme ihe na ya dabeere n'eziokwu na a na-emepụta ebe dị iche iche na mbara igwe, nke na-egosi oge ndụ nke tuple, na okwu ndị ọzọ, ttl. Modul dị n'azụ na-enyocha oghere, jiri TTL tụnyere oge dị ugbu a wee kpebie ma ọ ga-ehichapụ tuple ma ọ bụ na ọ gaghị ehichapụ. Koodu modul memcached dị mfe ma maa mma, mana ọnweghị oke. Nke mbụ, ọ naghị eburu n'uche ụdị index nke a na-adọkpụ na ihichapụ. Nke abuo, na nke ọ bụla ngafe niile tuples na-scanned, ọnụ ọgụgụ nke nwere ike ịbụ nnọọ nnukwu. Ma ọ bụrụ na n'ime modul mebie, edozi nsogbu mbụ (a na-ekewa index osisi n'ime klas dị iche), mgbe ahụ nke abụọ ka enwetaghị nlebara anya ọ bụla. Isi ihe atọ ndị a ekpebiela nhọrọ maka ide koodu nke m.

Nkowasi

Akwụkwọ maka tarantool nwere ezigbo mma nkuzi banyere otu esi ede usoro gị echekwara na C. Nke mbụ, m na-atụ aro ka ị mara onwe gị na ya iji ghọta ihe ntinye ndị ahụ na iwu na koodu ga-apụta n'okpuru. Ọ dịkwa mma ịṅa ntị ntụaka n'ihe ndị dị mgbe ị na-ede modul nke aka gị, ya bụ igbe, eriri, index и Nkechi.

Ka anyị si n'ebe dị anya malite lee ka modul mebiela n'isi dị ka site n'èzí:

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)

Maka ịdị mfe, anyị na-ewepụta tarantool na ndekọ ebe ọbá akwụkwọ anyị libcapped-expirationd.so dị. A na-ebupụ ọrụ abụọ site na ọba akwụkwọ: malite na igbu. Nzọụkwụ mbụ bụ ime ka ọrụ ndị a dị na Lua site na iji box.schema.func.create na box.schema.user.grant. Mgbe ahụ mepụta oghere nke tuples ga-enwe naanị ubi atọ: nke mbụ bụ njirimara pụrụ iche, nke abụọ bụ email, na nke atọ bụ ndụ nke tuple. Anyị na-ewu osisi index n'elu nke mbụ ubi na-akpọ ya isi. Ọzọ anyị ga-enweta ihe njikọ na ọba akwụkwọ ala anyị.

Mgbe ọrụ nkwadebe, rụọ ọrụ mmalite:

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

Ọmụmaatụ a ga-arụ ọrụ n'oge nyocha kpọmkwem otu modul mebiela, nke edere na Lua. Arụmụka mbụ maka ọrụ mmalite bụ aha pụrụ iche nke ọrụ ahụ. Nke abụọ bụ ihe nchọpụta oghere. Nke atọ bụ ndeksi pụrụ iche nke a ga-ehichapụ tuples. Nke anọ bụ index nke a ga-esi na-agafe tuples. Nke ise bụ ọnụ ọgụgụ nke tuple ubi na ndụ (ọnụọgụ na-amalite site 1, ọ bụghị 0!). Nke isii na nke asaa bụ ntọala nyocha. 1024 bụ ọnụ ọgụgụ kachasị elu nke tuples enwere ike ịlele n'otu azụmahịa. 3600 - oge nyocha zuru oke na sekọnd.

Rịba ama na ihe atụ na-eji otu index maka crawling na ihichapụ. Ọ bụrụ na nke a bụ ndepụta osisi, mgbe ahụ, a na-eme njem ahụ site na obere igodo gaa na nke ka ukwuu. Ọ bụrụ na e nwere ndị ọzọ, dịka ọmụmaatụ, hash index, mgbe ahụ, a na-eme njem ahụ, dịka iwu, n'usoro n'usoro. A na-enyocha oghere oghere niile n'otu nyocha.

Ka anyị tinye ọtụtụ tuples n'ime oghere na ndụ nke 60 sekọnd:

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}

Ka anyị lelee na ntinye ahụ gara nke ọma:

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

Ka anyị kwugharịa họrọ mgbe 60+ sekọnd (gụọ site na mmalite nke ntinye nke mbụ tuple) wee hụ na capped expired modul ahazilarị:

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

Ka anyị kwụsị ọrụ ahụ:

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

Ka anyị leba anya n'ihe atụ nke abụọ ebe a na-eji ndetu dị iche iche maka iri ari:

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)

Ihe niile ebe a bụ otu ihe ahụ dị na ihe atụ mbụ, ma ewezuga ole na ole. Anyị na-ewu osisi index n'elu nke atọ ubi na-akpọ ya exp. Ndekọ ndeksi a ekwesịghị ịbụ ihe pụrụ iche, n'adịghị ka ndeksi a na-akpọ isi. A ga-eme njem site na index index, yana ihichapụ site na isi. Anyị na-echeta na n'oge gara aga, a na-eme ha abụọ naanị site na iji ndeksi mbụ.

Mgbe ọrụ nkwadebe gasịrị, anyị na-eji arụmụka ọhụrụ na-arụ ọrụ mmalite:

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

Ka anyị tinye ọtụtụ tuples n'ime oghere ọzọ na ndụ nke 60 sekọnd:

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}

Mgbe sekọnd 30 gachara, site na ntụnyere, anyị ga-agbakwunye tuples ole na ole:

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}

Ka anyị lelee na ntinye ahụ gara nke ọma:

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

Ka anyị kwugharịa họrọ mgbe 60+ sekọnd (gụọ site na mmalite nke ntinye nke mbụ tuple) wee hụ na capped expired modul ahazilarị:

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

A ka nwere ụfọdụ tuples fọdụrụ na oghere nke ga-enwe ihe dị ka sekọnd 30 ọzọ iji dịrị ndụ. Ọzọkwa, iṅomi kwụsịrị mgbe na-akpụ akpụ si a tuple na ihe ID nke 2 na a ndụ nke 1576421257 ka a tuple na ihe ID nke 3 na ndụ nke 1576421287. igodo index nke exp. Nke a bụ ego anyị chọrọ inweta na mmalite.

Ka anyị kwụsị ọrụ ahụ:

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

Mmejuputa iwu

Ụzọ kachasị mma isi kọwaa atụmatụ niile nke ọrụ bụ isi mmalite ya. koodu! Dịka akụkụ nke mbipụta ahụ, anyị ga-elekwasị anya naanị na isi ihe kachasị mkpa, ya bụ, oghere oghere algọridim.

A na-echekwa arụmụka anyị na-agafe na usoro mmalite n'ụdị a na-akpọ 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;
};

Njirimara aha bụ aha ọrụ ahụ. Njirimara space_id bụ njirimara oghere. Njirimara rm_index_id bụ ihe nchọpụta nke ndeksi pụrụ iche nke a ga-ehichapụ tuples. Àgwà it_index_id bụ ihe nchọpụta index nke a ga-eji gafee tuples. Àgwà it_index_type bụ ụdị index nke a ga-esi na-agafe tuples. Njirimara filed_no bụ ọnụọgụ nke ubi tuple nwere oge ndụ. Njirimara scan_size bụ ọnụ ọgụgụ kachasị elu nke tuples na-enyocha n'otu azụmahịa. Njirimara scan_time bụ oge nyocha zuru oke na sekọnd.

Anyị agaghị atụle ịkọwa arụmụka. Nke a bụ ọrụ na-egbu mgbu ma dị mfe, nke ọbá akwụkwọ ga-enyere gị aka msgpuck. Naanị ihe isi ike nwere ike ibilite site na ndeksi sitere na Lua dị ka usoro data dị mgbagwoju anya nwere ụdị mp_map, na ejighị ụdị mp_bool, mp_double, mp_int, mp_uint na mp_array dị mfe. Ma ọ dịghị mkpa ka ihichapụ index dum. Naanị ị ga-enyocha ọpụrụiche ya, gbakọọ ụdị ma wepụta njirimara.

Anyị depụtara ụdị ọrụ niile a na-eji maka ntule:

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

Ugbu a, ka anyị gaa n'ihu na ihe kachasị mkpa - mgbagha nke ịgafe oghere na ihichapụ tuples. Nke ọ bụla ngọngọ nke tuples adịghị ibu karịa scan_size na-scanned na gbanwetụrụ n'okpuru otu azụmahịa. Ọ bụrụ na ịga nke ọma, a na-eme azụmahịa a; ọ bụrụ na njehie emee, a ga-atụgharị ya azụ. Arụmụka ikpeazụ na ọrụ expirationd_iterate bụ ntụnye aka na iterator nke nyocha na-amalite ma ọ bụ na-aga n'ihu. A na-abawanye n'ime iterator a n'ime ya ruo mgbe njehie mere, ohere ahụ agwụla, ma ọ bụ na ọ gaghị ekwe omume ịkwụsị usoro ahụ tupu oge eruo. Ọrụ expirationd_expired na-enyocha oge ndụ nke tuple, expirationd_delete na-ehichapụ tuple, expirationd_breakable checks ma anyị kwesịrị ịga n'ihu.

Koodu ọrụ 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;
}

Koodu ọrụ expired_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;
}

Koodu ọrụ 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);
}

Koodu ọrụ ngafe_breakable:

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

Ngwa

Ị nwere ike ịlele koodu mmalite na ebe a!

isi: www.habr.com

Tinye a comment