Kunyora yedu capped expiration module yetarantool

Kunyora yedu capped expiration module yetarantool

Imwe nguva yapfuura takatarisana nedambudziko rekuchenesa tuples munzvimbo tarantool. Kuchenesa kwaifanira kutangwa kwete apo tarantool yakanga yatopera mundangariro, asi pachine nguva uye pane imwe frequency. Kune iri basa, tarantool ine module yakanyorwa muLua inonzi kupera. Mushure mekushandisa iyi module kwenguva pfupi, takaona kuti yakanga isina kukodzera kwatiri: nekuda kwekugara kuchenesa kwehuwandu hwe data, Lua akarembera muGC. Nokudaro, takafunga nezvekugadzira yedu capped expiration module, tichitarisira kuti kodhi yakanyorwa mumutauro wemutauro wepurogiramu yaizogadzirisa matambudziko edu nenzira yakanakisisa.

Muenzaniso wakanaka kwatiri waiva tarantool module inonzi memcached. Nzira inoshandiswa mairi inobva pakuti imwe nzvimbo yakasiyana yakasikwa munzvimbo, iyo inoratidza hupenyu hwetuple, mune mamwe mazwi, ttl. Iyo module kumashure inotarisa nzvimbo, inofananidza iyo TTL nenguva iripo uye inosarudza kudzima tuple kana kwete. Iyo memcached module kodhi iri nyore uye inoyevedza, asi yakawandisa. Chekutanga, hazvitarise mhando ye index iri kukambaira nekudzimwa. Chechipiri, pane imwe neimwe tuples inoongororwa, nhamba yacho inogona kuva yakakura. Uye kana mune yakapera module dambudziko rekutanga rakagadziriswa (iyo indekisi yemiti yakakamurwa kuita kirasi yakaparadzana), saka yechipiri haina kutariswa. Aya mapoinzi matatu akafanosarudzira sarudzo mukufarira kunyora yangu kodhi.

tsananguro

Zvinyorwa zvetarantool zvine zvakanaka kwazvo tutorial pamusoro pekunyora maitiro ako akachengetwa muC. Chokutanga pane zvose, ndinokurudzira kuti uzvizivise nayo kuitira kuti unzwisise izvo zvakaiswa nemirairo uye kodhi ichaonekwa pasi apa. Zvakakodzerawo kuteerera reference kune zvinhu zviripo paunenge uchinyora yako capped module, kureva bhokisi, faibha, indekisi ΠΈ txn.

Ngatitangei kubva kure uye titarise kuti iyo capped expiration module inoita sei kubva kunze:

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 zvive nyore, tinovhura tarantool mudhairekitori panowanikwa libcapped-expirationd.so raibhurari yedu. Mabasa maviri anotengeswa kubva kuraibhurari: kutanga uye kuuraya. Danho rekutanga kuita kuti mabasa aya awanikwe kubva kuLua uchishandisa box.schema.func.create uye box.schema.user.grant. Wobva wagadzira nzvimbo ine matuples achange aine minda mitatu chete: yekutanga identifier yakasarudzika, yechipiri i-email, uye yechitatu ndiyo yehupenyu hwetuple. Isu tinovaka indekisi yemuti pamusoro pemunda wekutanga uye tinoidana iyo yekutanga. Tevere tinowana chinhu chekubatanidza kuraibhurari yedu yekuzvarwa.

Mushure mekuita basa rekugadzirira, mhanyisa yekutanga basa:

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

Uyu muenzaniso uchashanda panguva yekuongorora zvakangofanana neiyo yapera nguva module, iyo yakanyorwa muLua. Nharo yekutanga kune yekutanga basa ndiro zita rakasiyana rebasa. Chechipiri ndicho chinoratidza nzvimbo. Yechitatu indekisi yakasarudzika iyo tuples ichadzimwa. Yechina indekisi iyo tuples ichafambiswa. Yechishanu ndiyo nhamba yemunda we tuple nehupenyu hwese (nhamba inotangira pa1, kwete 0!). Yechitanhatu neyechinomwe ndeye scanning marongero. 1024 ndiyo nhamba yepamusoro yematuples anogona kutariswa mune imwechete kutengeserana. 3600 - yakazara scan nguva mumasekondi.

Ziva kuti muenzaniso unoshandisa indekisi imwechete yekukambaira nekudzima. Kana iyi indekisi yemuti, saka kutenderera kunoitwa kubva kudiki kiyi kuenda kune yakakura. Kana pane imwe, semuenzaniso, hashi index, ipapo kutenderera kunoitwa, sekutonga, mukurongeka. Yese nzvimbo tuples inoongororwa mune imwe scan.

Ngatiisei akati wandei munzvimbo nehupenyu hwemasekonzi makumi matanhatu:

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}

Ngatitarisei kuti kuiswa kwabudirira here:

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

Ngatidzokororei zvakasarudzwa mushure memakumi matanhatu+ masekonzi (kuverenga kubva pakutanga kwekuiswa kweyekutanga tuple) uye ona kuti iyo capped yapera module yatogadziriswa:

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

Ngatimise basa racho:

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

Ngatitarisei muenzaniso wechipiri apo indekisi yakaparadzana inoshandiswa pakukambaira:

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)

Zvose pano zvakafanana nemuenzaniso wekutanga, kunze kwezvishoma. Isu tinovaka indekisi yemuti pamusoro pemunda wechitatu uye tinoidaidza kuti exp. Iyi indekisi haifanire kuve yakasiyana, kusiyana neindex inonzi primary. Kutenderera kuchaitwa neexp index, uye kubviswa neprimary. Isu tinorangarira kuti kare zvese zvaiitwa chete uchishandisa yekutanga index.

Mushure mekugadzirira basa, tinomhanyisa basa rekutanga nenharo nyowani:

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

Ngatiisei akati wandei munzvimbo zvakare nehupenyu hwemasekonzi makumi matanhatu:

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}

Mushure memasekondi makumi matatu, nekuenzanisa, isu tichawedzera mamwe mashoma matuples:

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}

Ngatitarisei kuti kuiswa kwabudirira here:

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

Ngatidzokororei zvakasarudzwa mushure memakumi matanhatu+ masekonzi (kuverenga kubva pakutanga kwekuiswa kweyekutanga tuple) uye ona kuti iyo capped yapera module yatogadziriswa:

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

Pachine mamwe matuples asara munzvimbo iyo inenge iine mamwe masekonzi makumi matatu ekurarama. Uyezve, scan yakamira kana ichifamba kubva kune tuple ine ID ye30 uye hupenyu hwese 2 kuenda kune tuple ine ID ye1576421257 uye hupenyu hwese 3. Matuples ane hupenyu hwe1576421287 kana kupfuura haana kuongororwa nekuda makiyi e exp index. Iyi ndiyo mari yataida kuwana pakutanga.

Ngatimise basa racho:

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

Kutevedzera

Nzira yakanakisa yekutaura nezve ese maficha epurojekiti ndiko kwairi kwekutanga. code! Sechikamu chekudhindwa, isu tinongotarisa chete pane akakosha mapoinzi, anoti, space bypass algorithms.

Nharo dzatinopfuudza kune yekutanga nzira dzinochengetwa muchimiro chinonzi 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;
};

Zita ratidzo ndiro zita rebasa. Iyo space_id hunhu ndiyo identifier yenzvimbo. Iyo rm_index_id hunhu ndiyo inozivisa yakasarudzika index iyo tuples ichadzimwa. Iyo it_index_id hunhu ndiyo identifier yeindex iyo tuples ichafambiswa. Iyo it_index_type hunhu imhando yeindex iyo tuples ichafambiswa. Iyo filed_no hunhu ndiyo nhamba yenzvimbo yetuple ine hupenyu hwese. The scan_size attribute ndiyo inogumira nhamba yematuples anoongororwa mune imwe transaction. Iyo scan_time hunhu ndiyo yakazara scanner nguva mumasekonzi.

Hatisi kuzofunga kupatsanura nharo. Iri ibasa rinorwadza asi riri nyore, iro raibhurari inokubatsira iwe msgpuck. Matambudziko anogona kungomuka nema indexes anopfuudzwa kubva kuLua seyakaomesesa dhata dhizaini ine mp_map mhando, uye kusashandisa ari nyore mhando mp_bool, mp_double, mp_int, mp_uint uye mp_array. Asi hapana chikonzero chekuparura iyo index yese. Iwe unongoda kutarisa kusarudzika kwayo, kuverenga mhando uye kubvisa identifier.

Isu tinonyora ma prototypes eese mabasa ayo anoshandiswa paparsing:

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

Zvino ngatiendererei kune chinonyanya kukosha - iyo logic yekunzvenga nzvimbo uye kudzima tuples. Imwe neimwe bhuroka yematuples haina kukura kupfuura scan_size inoongororwa uye nekugadziriswa pasi pechinhu chimwe chete. Kana ikabudirira, kutengeserana uku kunoitwa; kana kukanganisa kukaitika, inodzoserwa kumashure. Nharo yekupedzisira kune expirationd_iterate function inongedzo kune iterator kubva panotanga scanning kana kuenderera mberi. Iyi iterator inokwidziridzwa mukati kusvika kukanganisa kwaitika, nzvimbo yapera, kana kuti hazvigone kumisa maitiro pamberi. The function expirationd_expired inotarisa hupenyu hwetuple, expiration_delete inobvisa tuple, expirationd_breakable inotarisa kana tichida kuenderera mberi.

Expirationd_iterate function code:

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

Kodhi yebasa 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 function 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);
}

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

Kushanda

Iwe unogona kuona iyo source code pa pano!

Source: www.habr.com

Voeg