From 1f238f4c2641d5dbe9fce983e045f0e567d2cee0 Mon Sep 17 00:00:00 2001 From: z8674558 Date: Tue, 2 Mar 2021 16:43:04 +0900 Subject: [PATCH] chore(emqx_retainer): avoid race condition --- apps/emqx_retainer/src/emqx_retainer.erl | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/emqx_retainer/src/emqx_retainer.erl b/apps/emqx_retainer/src/emqx_retainer.erl index 70f49a16c..28812ebfa 100644 --- a/apps/emqx_retainer/src/emqx_retainer.erl +++ b/apps/emqx_retainer/src/emqx_retainer.erl @@ -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} ->