Ke kākau ʻana i kā mākou iho hoʻopau hope ʻana no ka tarantool

Ke kākau ʻana i kā mākou iho hoʻopau hope ʻana no ka tarantool

I kekahi manawa i hala aku nei, ua pilikia mākou i ka hoʻomaʻemaʻe ʻana i nā tuple ma nā ākea tarantool. ʻAʻole i hoʻomaka ka hoʻomaʻemaʻe ʻana i ka wā i pau ai ka hoʻomanaʻo ʻana o ka tarantool, akā ma mua a i kekahi manawa. No kēia hana, loaʻa i ka tarantool kahi module i kākau ʻia ma Lua i kapa ʻia pau ʻana. Ma hope o ka hoʻohana ʻana i kēia module no ka manawa pōkole, ua ʻike mākou ʻaʻole kūpono ia no mākou: ma muli o ka hoʻomaʻemaʻe mau ʻana i ka nui o nā ʻikepili, ua kau ʻo Lua i ka GC. No laila, ua noʻonoʻo mākou i ka hoʻomohala ʻana i kā mākou iho hoʻopau pau ʻana, me ka manaʻo e hoʻoponopono ke code i kākau ʻia ma kahi ʻōlelo hoʻonohonoho ʻōiwi e hoʻoponopono i nā pilikia ma ke ala maikaʻi loa.

ʻO kahi hiʻohiʻona maikaʻi no mākou ʻo ka tarantool module i kapa ʻia memcached. ʻO ke ala i hoʻohanaʻia i loko o ia mea e pili ana i ka hanaʻana o kahi kahua kaʻawale i loko o ke ākea, e hōʻike ana i ke ola o ka tuple, ma nā'ōlelo'ē aʻe, ttl. ʻO ka module ma ke kua e nānā i ka hakahaka, hoʻohālikelike i ka TTL me ka manawa o kēia manawa a hoʻoholo inā e holoi i ka tuple a i ʻole. He maʻalahi a nani ka code modul memcached, akā maʻamau. ʻO ka mea mua, ʻaʻole ia e noʻonoʻo i ke ʻano o ka index e kolo ʻia a holoi ʻia. ʻO ka lua, ma kēlā me kēia pā e nānā ʻia nā tuple a pau, hiki ke nui ka helu. A inā ua hoʻopau ʻia ka pilikia mua i loko o ka module i pau (ua hoʻokaʻawale ʻia ka papa kuhikuhi lāʻau i kahi papa ʻokoʻa), a laila ʻaʻole i loaʻa i ka lua ka nānā ʻana. Ua koho mua kēia mau helu ʻekolu i ke koho no ka kākau ʻana i kaʻu code ponoʻī.

hōʻikeʻano

He maikaʻi loa ka palapala no ka tarantool kumu aʻo e pili ana i ke kākau ʻana i kāu mau kaʻina hana i mālama ʻia ma C. ʻO ka mea mua, manaʻo wau e hoʻomaʻamaʻa iā ʻoe iho me ia i mea e hoʻomaopopo ai i kēlā mau hoʻokomo me nā kauoha a me nā code e hōʻike ʻia ma lalo nei. Pono nō hoʻi e hoʻolohe kuhikuhi i nā mea i loaʻa i ke kākau ʻana i kāu module i hoʻopaʻa ʻia, ʻo ia hoʻi pahu, puluniu, Index и txn.

E hoʻomaka kākou mai kahi lōʻihi aku a e nānā i ke ʻano o ke ʻano o ka module i hoʻopau ʻia mai waho.

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)

No ka maʻalahi, hoʻomaka mākou i ka tarantool i ka papa kuhikuhi kahi i loaʻa ai kā mākou waihona libcapped-expirationd.so. ʻElua mau hana i lawe ʻia mai ka waihona: hoʻomaka a pepehi. ʻO ka hana mua, ʻo ia ka hoʻolako ʻana i kēia mau hana mai Lua mai me ka box.schema.func.create a me box.schema.user.grant. A laila, e hana i kahi e loaʻa ai i ʻekolu wale nō kīhāpai: ʻo ka mua he mea hōʻike kūʻokoʻa, ʻo ka lua ka leka uila, a ʻo ke kolu ke ola o ka tuple. Kūkulu mākou i kahi kuhikuhi lāʻau ma luna o ke kahua mua a kapa ʻia ʻo ia ka mea mua. A laila loaʻa iā mākou ka mea pili i kā mākou waihona ʻōiwi.

Ma hope o ka hana hoʻomākaukau, e holo i ka hana hoʻomaka:

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})

E hana ana kēia laʻana ma ka nānā ʻana e like me ka module i pau, i kākau ʻia ma Lua. ʻO ka hoʻopaʻapaʻa mua i ka hana hoʻomaka ka inoa kūʻokoʻa o ka hana. ʻO ka lua, ʻo ia ka ʻike kikoʻī. ʻO ke kolu he papa kuhikuhi kū hoʻokahi kahi e holoi ʻia ai nā tuples. ʻO ka hā, ʻo ia ka kuhikuhi e hele ai nā tuple. ʻO ka ʻelima ka helu o ke kahua tuple me ke ola (hoʻomaka ka helu mai ka 1, ʻaʻole 0!). ʻO ke ono a me ka ʻehiku nā hoʻonohonoho scanning. ʻO 1024 ka helu kiʻekiʻe loa o nā tuple i hiki ke nānā ʻia i hoʻokahi kālepa. 3600 — ka manawa scan piha i kekona.

E hoʻomaopopo i ka hoʻohana ʻana o ka laʻana i ka papa kuhikuhi like no ka kolo a me ka holoi ʻana. Inā he kumu lāʻau kēia, a laila, lawe ʻia ke kaʻahele mai ke kī liʻiliʻi a i ke kī nui. Inā loaʻa kekahi mea ʻē aʻe, no ka laʻana, hash index, a laila lawe ʻia ka traversal, ma ke ʻano he lula, ma ke ʻano maʻamau. Hoʻopili ʻia nā tuple āpau āpau i hoʻokahi scan.

E hoʻokomo i kekahi mau tuple i loko o ke ākea me ke ola o 60 kekona:

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}

E nānā i ka holomua o ka hoʻokomo ʻana:

tarantool> box.space.tester.index.primary:select()
---
- - [0, '[email protected]', 1576418976]
  - [1, '[email protected]', 1576418976]
  - [2, '[email protected]', 1576418976]
...

E hana hou i ke koho ma hope o 60+ mau kekona (helu mai ka hoʻomaka ʻana o ka hoʻokomo ʻana i ka tuple mua) a ʻike i ka hana ʻana o ka module i hoʻopau ʻia:

tarantool> box.space.tester.index.primary:select()
---
  - []
...

E ho'ōki kāua i ka hana:

capped_connection:call('libcapped-expirationd.kill', {'non-indexed'})

E nānā kākou i ka lua o ka laʻana kahi i hoʻohana ʻia ai kahi helu ʻokoʻa no ka kolo:

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)

Ua like nā mea a pau ma ʻaneʻi e like me ka laʻana mua, me kekahi mau ʻokoʻa. Kūkulu mākou i kahi kuhikuhi lāʻau ma luna o ke kolu o ke kahua a kapa ʻia ʻo exp. ʻAʻole pono e kū hoʻokahi kēia papa kuhikuhi, ʻaʻole like me ka papa kuhikuhi i kapa ʻia ʻo primary. E hoʻokō ʻia ka huakaʻi e ka exp index, a holoi ʻia e ka mea mua. Hoʻomanaʻo mākou ua hana ʻia nā mea ʻelua me ka hoʻohana ʻana i ka papa kuhikuhi mua.

Ma hope o ka hana hoʻomākaukau, holo mākou i ka hana hoʻomaka me nā manaʻo hou:

capped_connection:call('libcapped-expirationd.start', {'indexed', box.space.tester.id, box.space.tester.index.primary, box.space.tester.index.exp, 3, 1024, 3600})

E hoʻokomo hou i kekahi mau tuple i loko o ka hakahaka me ke ola o 60 kekona:

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}

Ma hope o 30 kekona, ma ka hoʻohālikelike, e hoʻohui mākou i kekahi mau 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}

E nānā i ka holomua o ka hoʻokomo ʻana:

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]
...

E hana hou i ke koho ma hope o 60+ mau kekona (helu mai ka hoʻomaka ʻana o ka hoʻokomo ʻana i ka tuple mua) a ʻike i ka hana ʻana o ka module i hoʻopau ʻia:

tarantool> box.space.tester.index.primary:select()
---
- - [3, '[email protected]', 1576421287]
  - [4, '[email protected]', 1576421287]
  - [5, '[email protected]', 1576421287]
...

Aia kekahi mau tuple i koe i loko o ke ākea a he 30 mau kekona hou aʻe e ola ai. Eia kekahi, ua oki ka scan i ka neʻe ʻana mai kahi tuple me ka ID o 2 a me ke ola o 1576421257 i kahi tuple me ka ID o 3 a me ke ola o 1576421287. ʻAʻole i nānā ʻia nā tuple me ke ola o 1576421287 a ʻoi aku ma muli o ke kauoha ʻana o nā kī kuhikuhi exp. ʻO kēia ka mālama kālā a mākou i makemake ai e hoʻokō i ka hoʻomaka.

E ho'ōki kāua i ka hana:

capped_connection:call('libcapped-expirationd.kill', {'indexed'})

Ka hoʻokō

ʻO ke ala maikaʻi loa e haʻi e pili ana i nā hiʻohiʻona āpau o kahi papahana ʻo ia ke kumu kumu. wae helu! Ma ke ʻano o ka paʻi ʻana, e kālele mākou i nā mea nui loa, ʻo ia hoʻi, nā algorithm bypass space.

Mālama ʻia nā ʻōlelo hoʻopaʻapaʻa a mākou e hele ai i ke ʻano hoʻomaka i kahi hale i kapa ʻia 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;
};

ʻO ka inoa inoa ka inoa o ka hana. ʻO ka ʻano space_id ka mea hōʻike kikowaena. ʻO ka hiʻohiʻona rm_index_id ka mea e ʻike ai i ka kuhikuhi kikoʻī kahi e holoi ʻia ai nā tuples. ʻO ka hiʻohiʻona it_index_id ka mea e ʻike ai i ka index e hele ai nā tuples. ʻO ka hiʻohiʻona it_index_type ke ʻano o ka kuhikuhi e hele ai nā tuple. ʻO ka filed_no attribute ka helu o ke kahua tuple me ke ola. ʻO ka hiʻohiʻona scan_size ka helu kiʻekiʻe o nā tuple i nānā ʻia i hoʻokahi kālepa. ʻO ka hiʻohiʻona scan_time ka manawa scan piha i kekona.

ʻAʻole mākou e noʻonoʻo i nā hoʻopaʻapaʻa parsing. He hana koʻikoʻi akā maʻalahi kēia, kahi e kōkua ai ka waihona iā ʻoe msgpuck. Hiki ke ala mai nā pilikia me nā papa kuhikuhi i hāʻawi ʻia mai Lua ma ke ʻano he ʻano ʻikepili paʻakikī me ke ʻano mp_map, a ʻaʻole hoʻohana i nā ʻano maʻalahi mp_bool, mp_double, mp_int, mp_uint a me mp_array. Akā ʻaʻole pono e hoʻokaʻawale i ka papa kuhikuhi holoʻokoʻa. Pono ʻoe e nānā i kona ʻokoʻa, e helu i ke ʻano a wehe i ka mea ʻike.

Hoʻopaʻa inoa mākou i nā prototypes o nā hana āpau i hoʻohana ʻia no ka parsing:

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);

I kēia manawa, e neʻe kākou i ka mea nui loa - ʻo ke kumu o ke kāʻei ʻana i kahi ākea a me ka holoi ʻana i nā tuples. ʻO kēlā me kēia poloka o nā tuple ʻaʻole i ʻoi aku ka nui ma mua o ka scan_size e nānā ʻia a hoʻololi ʻia ma lalo o kahi kālepa hoʻokahi. Inā kūleʻa, hana ʻia kēia hana; inā he hewa, hoʻihoʻi ʻia. ʻO ka hoʻopaʻapaʻa hope loa i ka expirationd_iterate hana he mea kuhikuhi i ka mea hoʻololi kahi e hoʻomaka ai a hoʻomau paha ka nānā ʻana. Hoʻonui ʻia kēia mea hana i loko a hiki i ka loaʻa ʻana o kahi hewa, pau ka hakahaka, a ʻaʻole hiki ke hoʻōki i ke kaʻina hana ma mua. ʻO ka hana expirationd_expired e nānā i ke ola o kahi tuple, expirationd_delete e holoi i kahi tuple, expirationd_breakable nānā inā pono mākou e neʻe.

Expirationd_iterate code hana:

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;
}

code hana 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 hana:

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);
}

Ka helu hana 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;
}

Ka hoʻohana

Hiki iā ʻoe ke nānā i ke code kumu ma maanei!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka