mnesia: читать возврат пустым при использовании фрагментации таблицы в mnesia, но иметь запись - PullRequest
0 голосов
/ 09 января 2019

mnesia:read возвращает пустой список при использовании фрагментации таблицы в mnesia, но у меня есть запись:

Мой код такой:

F = fun() ->
     mnesia:dirty_read({offline_msg, <<0,0,0,0,0,0,0,11>>}) 
end.
Result = mnesia:activity(transaction, F, [],mnesia_frag).
Result is : 
[#offline_msg{userid = <<0,0,0,0,0,0,0,11>>,timestamp =1547039796317984,from = 123}]

но

F = fun() -> 
    mnesia:read({offline_msg, <<0,0,0,0,0,0,0,11>>}) 
end.
Result = mnesia:activity(transaction, F, [],mnesia_frag).

Result is  []

информация о таблице:

PrimProps = [{n_fragments, 64}, {n_disc_only_copies, 1}, {node_pool, [node()]}],
mnesia:create_table(offline_msg,
 [{disc_only_copies, [node()]},{type, bag},{attributes, record_info(fields, offline_msg)}, {frag_properties, PrimProps}])

1 Ответ

0 голосов
/ 09 января 2019

Вы записали запись в таблицу, используя mnesia:dirty_write?

«Грязные» функции (dirty_read, dirty_write и т. Д.) Обходят фрагментацию таблицы Mnesia, даже если используются внутри mnesia:activity, как в первом примере: они всегда получают доступ к первому фрагменту Таблица. Итак, я подозреваю, что произошло следующее:

  • запись была записана в первый фрагмент с использованием mnesia:dirty_write
  • в вашем первом примере mnesia:dirty_read искал запись во фрагменте first и нашел ее
  • в вашем примере с secord mnesia:read внутри mnesia:activity использовал хэш ключа записи, чтобы выяснить, в каком фрагменте должна быть запись , и посмотрел этот фрагмент - но запись не настоящее время, поскольку было записано не тот фрагмент.

Если вы хотите использовать грязные операции с фрагментированными таблицами, вызовите mnesia:activity с sync_dirty или async_dirty:

mnesia:activity(sync_dirty, F, [],mnesia_frag).

Например, чтобы записать запись в таблицу:

OfflineMsg = #offline_msg{...},
F = fun() -> mnesia:write(OfflineMsg) end,
mnesia:activity(sync_dirty, F, [],mnesia_frag).

Это позволит mnesia_frag гарантировать, что запись будет записана в правильный фрагмент таблицы.

...