Imwe nguva yapfuura takatarisana nedambudziko rekuchenesa tuples munzvimbo
Muenzaniso wakanaka kwatiri waiva tarantool module inonzi
tsananguro
Zvinyorwa zvetarantool zvine zvakanaka kwazvo
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.
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
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
Source: www.habr.com