Tusia a tatou lava fa'agata fa'agata module mo tarantool

Tusia a tatou lava fa'agata fa'agata module mo tarantool

I se taimi ua mavae sa matou feagai ai ma le faʻafitauli o le faʻamamaina o tuples i avanoa tarantool. O le fa'amama e le tatau ona amata i le taimi ua leai se manatua o le tarantool, ae o le taimi muamua ma i se taimi patino. Mo lenei galuega, o le tarantool o lo'o i ai se module ua tusia i le Lua ua ta'ua mae'a. Ina ua uma ona faʻaogaina lenei module mo sina taimi puupuu, na matou iloa ai e le talafeagai mo i matou: ona o le faʻamamaina faifaipea o le tele o faʻamaumauga, na tautau Lua i le GC. O le mea lea, na matou mafaufau e uiga i le atinaʻeina o la matou lava faʻaoga ua maeʻa, ma le faʻamoemoe o le code na tusia i se gagana polokalame faʻapitoa e foia ai o matou faafitauli i se auala sili.

O se faʻataʻitaʻiga lelei mo i matou o le tarantool module ua taʻua memcached. O le auala o loʻo faʻaaogaina i totonu e faʻavae i luga o le mea moni o loʻo faia se isi fanua i le avanoa, lea e faʻaalia ai le olaga atoa o le tuple, i se isi faaupuga, ttl. O le module i tua e suʻe le avanoa, faʻatusatusa le TTL ma le taimi nei ma filifili pe tape le tuple pe leai. O le memcached module code e faigofie ma aulelei, ae tele tele. Muamua, e le amanaia le ituaiga o faasino igoa o loʻo tolotolo ma tapeina. Lona lua, i luga o pasi taʻitasi e suʻeina uma tuple, o le numera e mafai ona tele. Ma afai i totonu o le faʻaogaina o le module na foia ai le faafitauli muamua (o le faʻailoga o le laau na vavae ese i se vasega ese), ona leʻi maua ai lea e le lona lua se gauai. O nei manatu e tolu na muai fuafuaina le filifiliga e fiafia i le tusiaina o laʻu lava code.

faʻamatalaga

O faʻamaumauga mo le tarantool e lelei tele a'oa'oga e uiga i le auala e tusi ai au taualumaga teuina i C. Muamua lava, ou te fautua atu e faamasani oe lava i ai ina ia malamalama i na faaofiofi ma poloaiga ma code o le a aliali mai i lalo. E aoga foi le gauai atu i ai faasinomaga i mea o lo'o avanoa pe a tusia lau lava fa'apipi'i module, o lona uiga pusa, fau, limatusi и txn.

Sei o tatou amata mai mamao ma vaʻavaʻai pe faʻapefea le faʻaogaina o le faʻaogaina o le module mai fafo:

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)

Mo le fa'afaigofie, matou te fa'alauiloa le tarantool i le lisi o lo'o i ai le matou faletusi libcapped-expirationd.so. E lua galuega e auina atu i fafo mai le faletusi: amata ma fasioti. O le laasaga muamua o le fa'aavanoaina o nei galuega mai Lua e fa'aoga ai le box.schema.func.create ma le box.schema.user.grant. Ona fai lea o se avanoa o le tuple o le a na o le tolu fanua e aofia ai: o le muamua o se faʻamatalaga tulaga ese, o le lona lua o le imeli, ma le lona tolu o le olaga atoa o le tuple. Matou te fausia se faasino igoa i luga o le fanua muamua ma taʻua muamua. O le isi mea tatou te maua le mea feso'ota'i i la tatou faletusi.

A maeʻa le galuega sauniuni, faʻatino le galuega amata:

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

Ole fa'ata'ita'iga lea ole a aoga ile su'esu'ega e tutusa lelei ma le module ua uma, lea e tusia ile Lua. O le finauga muamua i le galuega amata o le igoa tulaga ese o le galuega. O le lona lua o le avanoa e iloagofie ai. O le lona tolu o se fa'ailoga tulaga ese lea o le a tapeina ai tuples. O lona fa o le faasino igoa lea o le a sopoia ai tuple. O le lona lima o le numera o le fanua tuple ma le olaga atoa (numera e amata mai le 1, ae le o le 0!). O le ono ma le fitu o le su'esu'eina o faatulagaga. 1024 o le numera maualuga o tuple e mafai ona vaʻaia i se fefaʻatauaiga se tasi. 3600 - taimi su'esu'e atoa ile sekone.

Manatua o le faʻataʻitaʻiga o loʻo faʻaogaina le faʻailoga tutusa mo le tolotolo ma tapeina. Afai ole la'au fa'asino lea, ona fa'atinoina lea o le savaliga mai le ki la'ititi i le ki tele. Afai ei ai se isi, mo se faʻataʻitaʻiga, faʻamaufaʻailoga o le hash, ona faia lea o le taʻavale, e pei o se tulafono, i se faasologa faʻafuaseʻi. O tuples avanoa uma e su'eina ile ata e tasi.

Se'i o tatou fa'aofi ni nai tuple i le avanoa ma le olaga atoa e 60 sekone:

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}

Sei o tatou siaki ua manuia le faaofiina:

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

Sei o tatou toe fai le filifiliga pe a maeʻa le 60+ sekone (faitau mai le amataga o le faʻaofiina o le tuple muamua) ma vaʻai ua maeʻa le faʻaogaina o le module ua maeʻa:

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

Tatou taofi le galuega:

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

Se'i o tatou va'ai i se fa'ata'ita'iga lona lua lea e fa'aogaina ai se fa'asinomaga eseese mo le fetolofi:

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)

O mea uma iinei e tutusa ma le faʻataʻitaʻiga muamua, faʻatasi ai ma nai tuusaunoaga. Matou te fausia se faasino igoa i luga o le fanua lona tolu ma taʻua exp. E le tatau ona tulaga ese le faasino igoa, e le pei o le faasino igoa e ta'ua muamua. O le felauaiga o le a faia e le exp index, ma o le tapeina o le a faia e le mea muamua. Matou te manatua muamua na faia uma na o le faʻaaogaina o le faasino igoa.

A maeʻa le galuega sauniuni, matou te faʻatautaia le galuega amata ma ni finauga fou:

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

Se'i o tatou toe fa'aofi ni nai tuple i le avanoa ma le olaga atoa e 60 sekone:

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}

A maeʻa le 30 sekone, e ala i le faʻatusa, o le a matou faʻaopoopoina ni nai tuple:

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}

Sei o tatou siaki ua manuia le faaofiina:

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

Sei o tatou toe fai le filifiliga pe a maeʻa le 60+ sekone (faitau mai le amataga o le faʻaofiina o le tuple muamua) ma vaʻai ua maeʻa le faʻaogaina o le module ua maeʻa:

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

O lo'o iai pea ni tuple o totoe i le avanoa e toe 30 sekone e ola ai. E le gata i lea, na taofi le faʻataʻitaʻiga pe a alu ese mai se tuple ma le ID o le 2 ma le olaga atoa o le 1576421257 i le tuple ma le ID o le 3 ma le olaga atoa o le 1576421287. Tuples ma le olaga atoa o le 1576421287 pe sili atu e leʻi vaʻaia ona o le faʻatonuina o le le exp index ki. O le sefe lea sa tatou mana'o e ausia i le amataga.

Tatou taofi le galuega:

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

Реализация

O le auala sili e fa'amatala ai uiga uma o se poloketi o lona fa'apogai muamua. code! I le avea ai o se vaega o le faʻasalalauga, o le a tatou taulai atu naʻo mea e sili ona taua, e taʻua, avanoa e ala i algorithms.

O finauga matou te pasi atu i le auala amata o loʻo teuina i totonu o se fausaga e taʻua 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;
};

Ole igoa ole uiga ole igoa ole galuega. Ole uiga ole space_id ole fa'ailoga avanoa. O le uiga rm_index_id o le fa'ailoaina o le fa'ailoga tulaga ese lea o le a tapeina ai tuples. O le it_index_id attribute o le fa'ailoaina lea o le fa'ailoga lea o le a fa'asalaina ai tuples. O le it_index_type attribute o le ituaiga o fa'asinomaga lea o le a laasia ai tuples. O le filed_no attribute o le numera o le fanua tuple ma le olaga atoa. O le uiga o le scan_size o le numera aupito maualuga lea o tuple o lo'o su'eina i le tasi fefa'atauaiga. O le uiga scan_time o le taimi atoa fa'ata'ita'i i sekone.

O le a tatou le mafaufau i le faavasegaina o finauga. O se galuega tigaina ae faigofie, lea o le a fesoasoani ai le faletusi ia te oe msgpuck. E na'o fa'afitauli e mafai ona tula'i mai i fa'asinomaga e pasi mai Lua o se fa'asologa o fa'amaumauga lavelave ma le ituaiga mp_map, ae le fa'aaogaina ituaiga faigofie mp_bool, mp_double, mp_int, mp_uint ma mp_array. Ae e leai se mea e manaʻomia e faʻavasega ai le faʻailoga atoa. E tatau ona e siaki lona tulaga ese, fuafua le ituaiga ma aveese le faʻamatalaga.

Matou te lisiina faʻataʻitaʻiga o galuega uma e faʻaaogaina mo le faʻavasegaina:

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

Sei o tatou agai i luma i le mea e sili ona taua - o le manatu o le pasia o avanoa ma tape tuples. O poloka taʻitasi o tuple e le sili atu nai lo scan_size e suʻeina ma suia i lalo o se fefaʻatauaiga e tasi. Afai e manuia, o lenei fefaʻatauaiga ua faia; afai e tupu se mea sese, e toe faʻafoʻi i tua. O le finauga mulimuli i le expirationd_iterate galuega o se faʻasino i le tagata suʻesuʻe lea e amata pe faʻaauau ai le suʻega. E fa'atuputeleina lenei fa'atonu i totonu se'ia tupu se mea sese, ua uma le avanoa, po'o le le mafai ona taofi le fa'agasologa muamua. O le galuega expirationd_expired siaki le olaga atoa o se tuple, expirationd_delete tape se tuple, expirationd_breakable siaki pe tatau ona tatou agai i luma.

Expirationd_iterate code galuega:

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

Fuafuaga code 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 code galuega faatino:

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 code galuega tauave:

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

Talosaga

E mafai ona e va'ai ile source code ile iinei!

puna: www.habr.com

Faaopoopo i ai se faamatalaga