chore(emqx_retainer): avoid race condition
This commit is contained in:
parent
70625b1942
commit
1f238f4c26
|
@ -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
|
||||
{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,
|
||||
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])
|
||||
end;
|
||||
end
|
||||
end),
|
||||
ok;
|
||||
{true, _} ->
|
||||
?LOG(error, "Cannot retain message(topic=~s) for table is full!", [Topic]);
|
||||
{_, true} ->
|
||||
|
|
Loading…
Reference in New Issue