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, msg = Msg,
expiry_time = get_expiry_time(Msg, Env)}); expiry_time = get_expiry_time(Msg, Env)});
{true, false} -> {true, false} ->
case mnesia:dirty_read(?TAB, Topic) of {atomic, _} = mnesia:transaction(
fun() ->
case mnesia:read(?TAB, Topic) of
[_] -> [_] ->
mnesia:dirty_write(?TAB, #retained{topic = topic2tokens(Topic), mnesia:write(?TAB, #retained{topic = topic2tokens(Topic),
msg = Msg, msg = Msg,
expiry_time = get_expiry_time(Msg, Env)}); expiry_time = get_expiry_time(Msg, Env)}, write);
[] -> [] ->
?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic]) ?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic])
end; end
end),
ok;
{true, _} -> {true, _} ->
?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic]); ?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic]);
{_, true} -> {_, true} ->