I se taimi ua mavae sa matou feagai ai ma le faʻafitauli o le faʻamamaina o tuples i avanoa
O se faʻataʻitaʻiga lelei mo i matou o le tarantool module ua taʻua
faʻamatalaga
O faʻamaumauga mo le tarantool e lelei tele
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.
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
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
puna: www.habr.com