แ แแแแแแแแ แฎแแแก แฌแแ แกแแแ แชแแแแจแ แขแฃแแแแแแก แแแฌแแแแแแก แแ แแแแแแ แแแแแฎแแแ
แฉแแแแแแแก แแแ แแ แแแแแแแแ แแงแ แขแแ แแแขแฃแแแก แแแแฃแแ แ.แฌ
แแฆแฌแแ แ
แแแแฃแแแแขแแชแแ tarantool แแฅแแก แซแแแแแ แแแ แแ
แแแแแฌแงแแ แจแแ แแแแ แแ แแแแฎแแ, แ แแแแ แแแแแแงแฃแ แแแ แแแ แแแแ แแแฎแฃแ แฃแแ แแแแแแแกแฃแแ แแแแฃแแ:
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)
แกแแแแ แขแแแแกแแแแก, แฉแแแ แแแแฃแจแแแ tarantool แแแ แแฅแขแแ แแแจแ, แกแแแแช แแแแแแ แแแแก แฉแแแแ libcapped-expirationd.so แแแแแแแแแแ. แแแแแแแแแแแแแ แแฅแกแแแ แขแแ แแแฃแแแ แแ แ แคแฃแแฅแชแแ: แแแฌแงแแแ แแ แแแแแแ. แแแ แแแแ แแแแแฏแ แแ แแก แแ แคแฃแแฅแชแแแแแก แฎแแแแแกแแฌแแแแแแแ แแฃแแกแแแ box.schema.func.create แแ box.schema.user.grant แแแแแงแแแแแแ. แจแแแแแ แจแแฅแแแแแ แกแแแ แชแ, แ แแแแแก tuples แจแแแชแแแก แแฎแแแแ แกแแ แแแแก: แแแ แแแแ แแ แแก แฃแแแแแแฃแ แ แแแแแขแแคแแแแขแแ แ, แแแแ แ แแ แแก แแแคแแกแขแ แแ แแแกแแแ แแ แแก แขแฃแแแแก แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแ. แฉแแแ แแแจแแแแแ แฎแแก แแแแแฅแกแก แแแ แแแแ แแแแแก แแแแแ แแ แแฃแฌแแแแแ แแแ แแแแแ. แจแแแแแ แฉแแแ แแแฆแแแ แแแแจแแ แแก แแแแแฅแขแก แฉแแแแก แแจแแแแแฃแ แแแแแแแแแแแกแแแ.
แแแกแแแแแแแแแแ แกแแแฃแจแแแแแแก แจแแแแแ แแแฃแจแแแ แแแฌแงแแแแก แคแฃแแฅแชแแ:
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})
แกแแแแแ แแแแก แแ แแก แแก แแแแแแแแ แแฃแกแขแแ แแกแแแ แแแฃแจแแแแแก, แ แแแแ แช แแแแแแแกแฃแแ แแแแฃแแ, แ แแแแแแช แแฃแ-แแแ แแแฌแแ แแแ. แแแฌแงแแแแก แคแฃแแฅแชแแแก แแแ แแแแ แแ แแฃแแแแขแ แแ แแก แแแแชแแแแก แฃแแแแแแฃแ แ แกแแฎแแแ. แแแแ แ แแ แแก แกแแแ แชแแก แแแแแขแแคแแแแขแแ แ. แแแกแแแ แแ แแก แฃแแแแแแฃแ แ แแแแแฅแกแ, แ แแแแแแแช แขแฃแแแแแ แฌแแแจแแแแ. แแแแแฎแ แแ แแก แแแฉแแแแแแแแ, แ แแแแแแแช แแแแแแแแ แขแแแแแก. แแแฎแฃแแ แแ แแก แแฃแแแแก แแแแแก แ แแชแฎแแ แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแแกแแแ แแ แแแ (แแฃแแแ แแชแแ แแฌแงแแแ 1-แแแ แแ แแ แ 0-แแแ!). แแแแฅแแกแ แแ แแแจแแแแ แแ แแก แกแแแแแ แแแแก แแแ แแแแขแ แแแ. 1024 แแ แแก แขแแแแแแก แแแฅแกแแแแแฃแ แ แ แแแแแแแแ, แ แแแแแแ แแแฎแแ แจแแกแแซแแแแแแแ แแ แ แขแ แแแแแฅแชแแแจแ. 3600 โ แกแ แฃแแ แกแแแแแ แแแแก แแ แ แฌแแแแแจแ.
แแแแแแแแแกแฌแแแแ, แ แแ แแแแแแแแ แแงแแแแแก แแแแแ แแแแแฅแกแก แชแแชแแแกแ แแ แฌแแจแแแกแแแแก. แแฃ แแก แแ แแก แฎแแก แแแแแฅแกแ, แแแจแแ แแแแแแแแแ แฎแแ แชแแแแแแแ แแแขแแ แ แแแกแแฆแแแแแแ แฃแคแ แ แแแแแ. แแฃ แแ แกแแแแแก แกแฎแแ, แแแแแแแแแ, แฐแแจแแก แแแแแฅแกแ, แแแจแแ แแแแแแแแแ แฎแแแแ, แ แแแแ แช แฌแแกแ, แจแแแแฎแแแแแแ แแแแแแแแแแ แแแแ. แงแแแแ แแแกแแแกแฃแ แ แขแแแ แแแกแแแแแ แแแฃแแแ แแ แ แกแแแแแ แแแแจแ.
แแแแแ แฉแแแกแแแ แ แแแแแแแแ แขแแแ แกแแแ แชแแจแ 60 แฌแแแแก แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแแ:
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}
แแแแแ แจแแแแแแฌแแแ, แ แแ แฉแแกแแ แฌแแ แแแขแแแแ แแแกแ แฃแแแ:
tarantool> box.space.tester.index.primary:select()
---
- - [0, '[email protected]', 1576418976]
- [1, '[email protected]', 1576418976]
- [2, '[email protected]', 1576418976]
...
แแแแแแแแ แแ แแ แฉแแแ 60+ แฌแแแแก แจแแแแแ (แแแแแแ แแแ แแแแ แขแแแแก แฉแแกแแแก แแแกแแฌแงแแกแแแแ) แแ แแแแฎแแ, แ แแ แแแฎแฃแ แฃแแ แแแแแแแกแฃแแ แแแแฃแแ แฃแแแ แแแแฃแจแแแแแฃแแแ:
tarantool> box.space.tester.index.primary:select()
---
- []
...
แจแแแแฉแแ แแ แแแแแแแแ:
capped_connection:call('libcapped-expirationd.kill', {'non-indexed'})
แแแแแ แจแแแฎแแแแ แแแแ แ แแแแแแแแก, แกแแแแช แชแแแแ แแแแแฅแกแ แแแแแแงแแแแแ crawl-แแกแแแแก:
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)
แแฅ แงแแแแแคแแ แ แแแแแแ, แ แแช แแแ แแแ แแแแแแแแจแ, แ แแแแแแแแ แแแแแแแแแแกแแก แแแ แแ. แฉแแแ แแแจแแแแแ แฎแแก แแแแแฅแกแก แแแกแแแ แแแแแก แแแแแ แแ แแฃแฌแแแแแ แแแก exp. แแก แแแแแฅแกแ แแ แฃแแแ แแงแแก แฃแแแแแแฃแ แ, แแแแกแฎแแแแแแแ แแแแแฅแกแแกแแแ, แ แแแแแกแแช แแแ แแแแแแ แแฌแแแแแ. แแแแแแแแแ แแแแฎแแ แชแแแแแแแ แแฅแกแแแฃแแขแแชแแแก แแแแแฅแกแแ, แฎแแแ แฌแแจแแ แแแ แแแแแแ. แฉแแแ แแแแฎแกแแแก, แ แแ แแแ แ แแ แแแ แแแแแแแแแ แแฎแแแแ แแแ แแแแแแ แแแแแฅแกแแก แแแแแงแแแแแแ.
แแแกแแแแแแแแแแ แกแแแฃแจแแแแแแก แจแแแแแ แฉแแแ แแแขแแ แแแ แแแฌแงแแแแก แคแฃแแฅแชแแแก แแฎแแแ แแ แแฃแแแแขแแแแ:
capped_connection:call('libcapped-expirationd.start', {'indexed', box.space.tester.id, box.space.tester.index.primary, box.space.tester.index.exp, 3, 1024, 3600})
แแแแแ แแแแแ แฉแแแกแแแ แ แแแแแแแแ แขแแแ แกแแแ แชแแจแ 60 แฌแแแแก แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแแ:
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}
30 แฌแแแแก แจแแแแแ, แแแแแแแแแ, แฉแแแ แแแแแแแขแแแ แแแแแ แ แแแแแแแแ แขแแแก:
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}
แแแแแ แจแแแแแแฌแแแ, แ แแ แฉแแกแแ แฌแแ แแแขแแแแ แแแกแ แฃแแแ:
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]
...
แแแแแแแแ แแ แแ แฉแแแ 60+ แฌแแแแก แจแแแแแ (แแแแแแ แแแ แแแแ แขแแแแก แฉแแกแแแก แแแกแแฌแงแแกแแแแ) แแ แแแแฎแแ, แ แแ แแแฎแฃแ แฃแแ แแแแแแแกแฃแแ แแแแฃแแ แฃแแแ แแแแฃแจแแแแแฃแแแ:
tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
- [4, '[email protected]', 1576421287]
- [5, '[email protected]', 1576421287]
...
แกแแแ แชแแจแ แฏแแ แแแแแ แแแ แฉแ แ แแแแแแแแ แขแแแ, แ แแแแแแกแแช แแแแแ 30 แฌแแแ แแฅแแแแแ แกแแชแแชแฎแแ. แฃแคแ แ แแแขแแช, แกแแแแแ แแแ แจแแฌแงแแ, แ แแแแกแแช แแแแแแแแชแแแแแแ แขแแแแแแ ID 2-แแ แแ แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแ 1576421257 แขแฃแแแแ ID 3-แแ แแ 1576421287 แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแแแ. แแฅแกแแแฃแแขแแชแแแก แแแแแฅแกแแก แแแกแแฆแแแแแ. แแก แแ แแก แแแแแแแแ, แ แแแแแก แแแฆแฌแแแแช แแแแแแแแแ แแแแแแแแ.
แจแแแแฉแแ แแ แแแแแแแแ:
capped_connection:call('libcapped-expirationd.kill', {'indexed'})
ะ ะตะฐะปะธะทะฐัะธั
แแ แแแฅแขแแก แงแแแแ แแแฎแแกแแแแแแแแก แกแแแฅแแแแแ แกแแฃแแแแแกแ แแแ แแแกแ แแ แแแแแแแฃแ แ แฌแงแแ แแ.
แแ แแฃแแแแขแแแ, แ แแแแแแกแแช แฉแแแ แแแแแแชแแแ แแแฌแงแแแแก แแแแแแก, แแแแฎแแแ แกแขแ แฃแฅแขแฃแ แแจแ, แ แแแแแกแแช แแฌแแแแแ 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;
};
แกแแฎแแแแก แแขแ แแแฃแขแ แแ แแก แแแแชแแแแก แกแแฎแแแ. space_id แแขแ แแแฃแขแ แแ แแก แกแแแ แชแแก แแแแแขแแคแแแแขแแ แ. rm_index_id แแขแ แแแฃแขแ แแ แแก แฃแแแแแแฃแ แ แแแแแฅแกแแก แแแแแขแแคแแแแขแแ แ, แ แแแแแแแช แฌแงแแแแ แฌแแแจแแแแ. it_index_id แแขแ แแแฃแขแ แแ แแก แแแแแฅแกแแก แแแแแขแแคแแแแขแแ แ, แ แแแแแแแช แแแฎแแแแ แขแแแแแแก แแแแแ. it_index_type แแขแ แแแฃแขแ แแ แแก แแแแแฅแกแแก แขแแแ, แ แแแแแแแช แแแฎแแแแ แขแแขแแแแก แแแแแ. filed_no แแขแ แแแฃแขแ แแ แแก tuple แแแแแก แแแแแ แ แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแแกแแแ แแ แแแ. scan_size แแขแ แแแฃแขแ แแ แแก แขแแแแแแก แแแฅแกแแแแแฃแ แ แ แแแแแแแแ, แ แแแแแแแช แแแกแแแแแ แแแฃแแแ แแ แ แขแ แแแแแฅแชแแแจแ. scan_time แแขแ แแแฃแขแ แแ แแก แกแแแแแ แแแแก แกแ แฃแแ แแ แ แฌแแแแแจแ.
แฉแแแ แแ แแแแแแฎแแแแแ แแ แแฃแแแแขแแแแก แแแแแแแก. แแก แแ แแก แจแ แแแแขแแแแแ, แแแแ แแ แแแ แขแแแ แกแแแฃแจแแ, แ แแแแแจแแช แแแแแแแแแแ แแแแแฎแแแ แแแแ
แฉแแแ แฉแแแแแแแแแ แงแแแแ แคแฃแแฅแชแแแก แแ แแขแแขแแแแแก, แ แแแแแแแช แแแแแแงแแแแแ แแแแแแแแกแแแแก:
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);
แแฎแแ แแแแแแแแแ แงแแแแแแ แแแแจแแแแแแแแแแ - แกแแแ แชแแก แแแแ แแแก แแแแแ แแ แขแฃแแแแแแก แฌแแจแแแก แแแแแแแแ. แขแแแแแแก แแแแแแฃแแ แแแแแ, แ แแแแแแช แแ แแฆแแแแขแแแ scan_size-แก, แแแกแแแแแ แแแฃแแแ แแ แแชแแแแแ แแ แแ แขแ แแแแแฅแชแแแก แคแแ แแแแแจแ. แฌแแ แแแขแแแแก แจแแแแฎแแแแแจแ, แแก แขแ แแแแแฅแชแแ แฉแแแแแแแแ; แแฃ แจแแชแแแแ แแแฎแแ, แแก แฃแแแ แแฎแแแ. expirationd_iterate แคแฃแแฅแชแแแก แแแแ แแ แแฃแแแแขแ แแ แแก แแแแแแแขแแ แ แแขแแ แแขแแ แแกแแแ, แกแแแแแแแช แแฌแงแแแ แแ แแ แซแแแแแแ แกแแแแแ แแแ. แแก แแแแแแ แแแ แแแ แแแแ แจแแแแแ, แกแแแแ แจแแชแแแแ แแ แแแฎแแแแ, แกแแแ แชแ แแแแแฌแฃแ แแแ แแ แแ แแชแแกแแก แฌแแแแกแฌแแ แจแแฉแแ แแแ แจแแฃแซแแแแแแแ. แคแฃแแฅแชแแ expirationd_expired แแแแฌแแแแก tuple-แแก แกแแชแแชแฎแแแก, expirationd_delete แฌแแจแแแก แขแแแก, expirationd_breakable แแแแฌแแแแก, แแแญแแ แแแแ แแฃ แแ แ แแแแ แซแแแแแ.
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;
}
แคแฃแแฅแชแแแก แแแแ 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 แคแฃแแฅแชแแแก แแแแ:
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 แคแฃแแฅแชแแแก แแแแ:
static bool
expirationd_breakable(struct expirationd_task *task)
{
return task->it_index_id != task->rm_index_id && task->it_index_type == ITER_GT;
}
แแแแแชแฎแแแแก
แฌแงแแ แแก แแแแแก แแแฎแแ แจแแแแซแแแแ แแฅ
แฌแงแแ แ: www.habr.com