chore(emqx_retainer): avoid race condition

This commit is contained in:
z8674558 2021-03-02 16:43:04 +09:00 committed by Yudai Kiyofuji
parent 70625b1942
commit 1f238f4c26
1 changed files with 12 additions and 8 deletions

View File

@ -205,14 +205,18 @@ store_retained(Msg = #message{topic = Topic, payload = Payload}, Env) ->
msg = Msg,
expiry_time = get_expiry_time(Msg, Env)});
{true, false} ->
case mnesia:dirty_read(?TAB, Topic) of
[_] ->
mnesia:dirty_write(?TAB, #retained{topic = topic2tokens(Topic),
msg = Msg,
expiry_time = get_expiry_time(Msg, Env)});
[] ->
?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic])
end;
{atomic, _} = mnesia:transaction(
fun() ->
case mnesia:read(?TAB, Topic) of
[_] ->
mnesia:write(?TAB, #retained{topic = topic2tokens(Topic),
msg = Msg,
expiry_time = get_expiry_time(Msg, Env)}, write);
[] ->
?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic])
end
end),
ok;
{true, _} ->
?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic]);
{_, true} ->