ืืคื ื ืืื ืื ืืชืืืืื ื ืขื ืืืขืื ืฉื ื ืืงืื ืืคืืื ืืืืืื
ืืืืื ืืืื ืขืืืจื ื ืืืืชื ืืืืื tarantool ืฉื ืงืจื
ืชืืืืจ
ืืชืืขืื ืขืืืจ 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 ืฉืื ื. ืฉืชื ืคืื ืงืฆืืืช ืืืืฆืืืช ืืืกืคืจืืื: ืืชืื ืืืจืื. ืืฆืขื ืืจืืฉืื ืืื ืืืคืื ืืช ืืคืื ืงืฆืืืช ืืืื ืืืืื ืืช ื- Lua ืืืืฆืขืืช box.schema.func.create ื-box.schema.user.grant. ืืืืจ ืืื ืฆืืจ ืืจืื ืฉืืืืคืืื ืฉืื ืืืืื ืจืง ืฉืืืฉื ืฉืืืช: ืืจืืฉืื ืืื ืืืื ืืืืืื, ืืฉื ื ืืื ืืืืจ ืืืงืืจืื ื, ืืืฉืืืฉื ืืื ืืฉื ืืืืื ืฉื ื-tuple. ืื ื ืืื ืื ืืื ืืงืก ืขืฅ ืขื ืืื ืืฉืื ืืจืืฉืื ืืงืืจืืื ืื ืจืืฉืื ื. ืืืืจ ืืื ื ืงืื ืืช ืืืืืืงื ืืืืืืจ ืืกืคืจืืื ืืืงืืจืืช ืฉืื ื.
ืืืืจ ืขืืืืช ืืืื ื, ืืคืขื ืืช ืคืื ืงืฆืืืช ืืืชืืื:
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})
ืืืืื ืื ืชืขืืื ืืืืื ืืกืจืืงื ืืืืืง ืืื ืืืืืื ืฉืคื ืชืคืืื, ืฉื ืืชื ื-Lua. ืืืจืืืื ื ืืจืืฉืื ืืคืื ืงืฆืืืช start ืืื ืืฉื ืืืืืืื ืฉื ืืืฉืืื. ืืฉื ื ืืื ืืืื ืืืื. ืืฉืืืฉื ืืื ืืื ืืงืก ืืืืืื ืฉืืืืฆืขืืชื ืืืืืงื tuples. ืืจืืืขื ืืื ืืืื ืืคืื ืืขืืจื ืืืคืืืื. ืืืืืฉื ืืื ืืืกืคืจ ืฉื ืฉืื ืืืคืื ืขื ืืฉื ืืืืื (ืืืกืคืืจ ืืชืืื ื-1, ืื ื-0!). ืืฉืืฉื ืืืฉืืืขื ืื ืืืืจืืช ืกืจืืงื. 1024 ืืื ืืืกืคืจ ืืืจืื ืฉื tuples ืฉื ืืชื ืืจืืืช ืืขืกืงื ืืืช. 3600 - ืืื ืกืจืืงื ืืื ืืฉื ืืืช.
ืฉืืื ืื ืฉืืืืืื ืืฉืชืืฉืช ืืืืชื ืืื ืืงืก ืืกืจืืงื ืืืืืงื. ืื ืืื ืืื ืืงืก ืขืฅ, ืื ืืืขืืจ ืืชืืฆืข ืืืืคืชื ืืงืื ืืืชืจ ืืืืื ืืืชืจ. ืื ืืฉ ืืื ืืืืื ืืืจ, ืืืฉื, ืื ืืืขืืจ ืืชืืฆืข, ืืืื, ืืกืืจ ืืงืจืื. ืื ืืคืืื ืืืื ื ืกืจืงืื ืืกืจืืงื ืืืช.
ืืื ื ืื ืืก ืืืื ืืกืคืจ tuples ืขื ืืืจื ืืืื ืฉื 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+ ืฉื ืืืช (ืืกืคืืจ ืืชืืืืช ืืืื ืกื ืฉื ื-tuple ืืจืืฉืื) ืื ืจืื ืฉืืืืื ื-capped expirationed ืืืจ ืขืืื:
tarantool> box.space.tester.index.primary:select()
---
- []
...
ืืืื ื ืขืฆืืจ ืืช ืืืฉืืื:
capped_connection:call('libcapped-expirationd.kill', {'non-indexed'})
ืืื ื ืกืชืื ืขื ืืืืื ืฉื ืืื ืฉืื ื ืขืฉื ืฉืืืืฉ ืืืื ืืงืก ื ืคืจื ืขืืืจ ืืกืจืืงื:
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. ืืื ืืงืก ืื ืื ืืืื ืืืืืช ืืืืืื, ืื ืืืื ืืืื ืืงืก ืฉื ืงืจื ืจืืฉืื ื. ืืืขืืจ ืืืืฆืข ืืคื ืืื ืืงืก 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+ ืฉื ืืืช (ืืกืคืืจ ืืชืืืืช ืืืื ืกื ืฉื ื-tuple ืืจืืฉืื) ืื ืจืื ืฉืืืืื ื-capped expirationed ืืืจ ืขืืื:
tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
- [4, '[email protected]', 1576421287]
- [5, '[email protected]', 1576421287]
...
ืขืืืื ื ืืชืจื ืืื ืืืคืืกืื ืืืื ืฉืืืื ืืื ืขืื ื-30 ืฉื ืืืช ืืืืืช. ืืชืจื ืืื, ืืกืจืืงื ืืืคืกืงื ืืขืช ืืขืืจ ืืืืคื ืขื ืืืื 2 ืืืืจื ืืืื ืฉื 1576421257 ืืืืคื ืขื ืืืื 3 ืืืืจื ืืืื ืฉื 1576421287. Tuples ืขื ืืืจื ืืืื ืฉื 1576421287 ืืืขืื ืื ื ืกืจืงื ืขืงื ืืืื ื ืฉื ืืคืชืืืช ื-exp index. ืื ืืืืกืืื ืฉืจืฆืื ื ืืืฉืื ืืืจ ืืืชืืื.
ืืืื ื ืขืฆืืจ ืืช ืืืฉืืื:
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 ืืื ืืืืื ืฉื ืืืื ืืงืก ืืืืืืื ืฉืืืืฆืขืืชื tuples ืืืืืงื. ืืชืืื ื it_index_id ืืื ืืืืื ืฉื ืืืื ืืงืก ืฉืืืืฆืขืืชื ืืขืืจื tuples. ืืชืืื ื it_index_type ืืื ืกืื ืืืื ืืงืก ืฉืืืืฆืขืืชื ืืขืืจื tuples. ืืชืืื ื filed_no ืืื ืืืกืคืจ ืฉื ืฉืื ื-tuple ืขื ืืฉื ืืืืื. ืืชืืื ื scan_size ืืื ืืืกืคืจ ืืืจืื ืฉื tuples ืฉื ืกืจืงืื ืืขืกืงื ืืืช. ืืชืืื ื 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);
ืขืืฉืื ื ืขืืืจ ืืืืจ ืืืฉืื ืืืืชืจ - ืืืืืืื ืฉื ืขืงืืคืช ืืงืื ืืืืืงืช tuples. ืื ืืืืง ืฉื tuples ืื ืืืื ื-scan_size ื ืกืจืง ืืืฉืชื ื ืชืืช ืขืกืงื ืืืช. ืื ืืื ืืฆืืืื, ืขืกืงื ืื ืืชืืฆืขืช; ืื ืืชืจืืฉืช ืฉืืืื, ืืื ืืืืืืช. ืืืจืืืื ื ืืืืจืื ืืคืื ืงืฆืื expirationd_iterate ืืื ืืฆืืืข ืืืืืจืืืจ ืฉืืื ื ืืชืืืื ืื ื ืืฉืืช ืืกืจืืงื. ืืืืจืืืจ ืื ืืืืื ืืืืคื ืคื ืืื ืขื ืฉืืชืจืืฉืช ืฉืืืื, ืืฉืื ืืืื ืื ืฉืื ื ืืชื ืืขืฆืืจ ืืช ืืชืืืื ืืจืืฉ. ืืคืื ืงืฆืื expirationd_expired ืืืืงืช ืืช ืืฉื ืืืืื ืฉื tuple, expirationd_delete ืืืืงืช tuple, 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);
}
ืงืื ืคืื ืงืฆืื 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;
}
ืืืฉืื
ืืชื ืืืื ืืฆืคืืช ืืงืื ืืืงืืจ ืืืชืืืช
ืืงืืจ: www.habr.com