αα½αααααα»αααΎαααααααα»αααΉααααα αΆααααΆααααα’αΆα tuples αα
αααα»αααα
α§ααΆα αααααααα’αα½ααααααΆαααα½αααΎαααΊαααΌαα»α 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 α αααααΆαααααααααΎαα αααααααα tuples ααΉαααΆαααΆαααααΈααα»αααααα ααΈαα½αααΊααΆα§ααααααααααα’ααααααααΆααααα½αααα ααΈααΈαααΊα’ααΈααα α αΎαααΈααΈααΊααΆα’αΆαα»ααΆααααα 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 α α’αΆαα»αααααααΈαα½αα αααααα»αααΆαα αΆααααααΎαααΊααΆααααααααα½αααααααα·α αα ααΆαα ααΈααΈαααΊα§ααααααααααΆααααα α ααΈααΈααΊααΆααααααααααααα½ααααααα tuples ααΉαααααΌαααΆααα»αα ααΈαα½αααΊααΆαααααααααααα tuples ααΉαααααΌαααΆαααααααΆααα ααΈααααΆαααΊααΆαααααααΆα tuple ααΆαα½αααΉαα’αΆαα»ααΆα (αααα αΆααααααΎαααΈααα 1 αα·αααα 0!)α ααΈααααΆααα½α αα·αααΈααααΆαααΈα ααΊααΆααΆαααααααααααα 1024 ααΊααΆα ααα½αα’αα·ααααΆαα tuples αααα’αΆα ααΎαααΆααααα»αααααα·ααααα·ααΆααααα½αα 3600 - αααααααΆαααααααααααα»ααα½ααα·ααΆααΈα
α αααΆαααΆα§ααΆα αααααααΎαα·αα·ααααααΌα ααααΆαααααΆααααΆααα»ααα αα·ααα»αα ααααα·αααΎαααααΆααααααααααααααΆα αααααΆαααααααΆααααααΌαααΆαα’αα»ααααααΈαααααΉαααΌα ααΆααα ααααΆαα ααααα·αααΎααΆααα½αα ααα½ααααααααα α§ααΆα ααα ααααααααα hash ααα ααΆαααααααΆααααααΌαααΆαα’αα»αααα ααΆαααα½αααΆαααααΆααα αααααα αα»αααααα αααΆααα’ααααααΌαααΆαααααααααα»αααααααααα½αα
α αΌαααΎααααα αΌα 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 ααααΌα) α αΎαααΎαααΆαααΌαα»αααααα»αααααααααααΆααααααααΆαααααΎαααΆααα½α α αΎαα
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})
α αΌαααΎααααα αΌα 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}
αααααΆααααΈ 30 αα·ααΆααΈαααααΆαααααααααααΎαααΉααααααα tuples ααΈαααΈααααααααα:
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 ααααΌα) α αΎαααΎαααΆαααΌαα»αααααα»αααααααααααΆααααααααΆαααααΎαααΆααα½α α αΎαα
tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
- [4, '[email protected]', 1576421287]
- [5, '[email protected]', 1576421287]
...
αα ααΆα tuples αα½αα ααα½αααααα ααααααα»αααα αααααΉαααΆαααααααα αα 30 αα·ααΆααΈαααααΎααααΈααααα α ααΎαααΈααααα ααα ααΆααααααααΆαααααα αααααααΆααααααΌαααΈ tuple αααααΆαααααααααΆαα 2 αα·αα’αΆαα»ααΆα 1576421257 αα tuple αααααΆαααααααααΆαα 3 αα·αααααα½αααΈαα·ααα 1576421287 α Tuples αααααΆαα’αΆαα»ααΆα 1576421287 α¬α αααΎαααΆαααααα·αααααΌαααΆαααααααα αααααΆαααΆααααααΆαα·ααααα ααααΆααα α»α ααααααααα exp α αααααΆααΆαααααααααααΎαα αααααααα ααΆααααΈααααΌαα
ααααααααααα·α αα ααΆαα
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 ααΊααΆααααα·α αα α’αααααααΎα‘αΎααα·ααααααΆααααααα αΆααααααΎα α¬ααααα iterator αααβααααΌαβααΆαβαααααΎαβαα βααΆαβαααα»αβαα αΌαβαααβααΆαβααα α»αβααΎαβα‘αΎα α αααααβα’αα α¬βααΆβαα·αβα’αΆα βααααααβααααΎαααΆαβααΆβαα»αβααΆαβααα αα»αααΆα expirationd_expired αα·αα·αααα’αΆαα»ααΆααααα tuple, expirationd_delete αα»α tuple, expirationd_breakable checks ααΆααΎααΎαααααΌαααΆαααααα¬α’ααα
ααΌαβαα»αααΆαβαα»αααααα_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;
}
αααααΌααα»αααΆααα»αααααα_αα»ααααααα
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;
}
ααΌααα»αααΆααα»αααααα _αα»αα
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);
}
ααΌααα»αααΆααα»αααααα_αααααααΆαα
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