fix: reinstate transactions

This commit is contained in:
Thales Macedo Garitezi 2023-08-16 16:05:08 -03:00
parent 65085d012b
commit dbfacae283
1 changed files with 45 additions and 32 deletions

View File

@ -136,20 +136,29 @@ message_stats() ->
%% the broker. %% the broker.
-spec session_open(emqx_types:clientid()) -> {_New :: boolean(), session_id()}. -spec session_open(emqx_types:clientid()) -> {_New :: boolean(), session_id()}.
session_open(ClientID) -> session_open(ClientID) ->
case mnesia:dirty_read(?SESSION_TAB, ClientID) of {atomic, Res} =
[#session{}] -> mria:transaction(?DS_SHARD, fun() ->
{false, ClientID}; case mnesia:read(?SESSION_TAB, ClientID, write) of
[] -> [#session{}] ->
Session = #session{id = ClientID}, {false, ClientID};
mria:dirty_write(?SESSION_TAB, Session), [] ->
{true, ClientID} Session = #session{id = ClientID},
end. mnesia:write(?SESSION_TAB, Session, write),
{true, ClientID}
end
end),
Res.
%% @doc Called when a client reconnects with `clean session=true' or %% @doc Called when a client reconnects with `clean session=true' or
%% during session GC %% during session GC
-spec session_drop(emqx_types:clientid()) -> ok. -spec session_drop(emqx_types:clientid()) -> ok.
session_drop(ClientID) -> session_drop(ClientID) ->
ok = mria:dirty_delete({?SESSION_TAB, ClientID}), {atomic, ok} = mria:transaction(
?DS_SHARD,
fun() ->
mnesia:delete({?SESSION_TAB, ClientID})
end
),
ok. ok.
%% @doc Called when a client disconnects. This function terminates all %% @doc Called when a client disconnects. This function terminates all
@ -164,29 +173,33 @@ session_suspend(_SessionId) ->
{ok, iterator_id(), time(), _IsNew :: boolean()}. {ok, iterator_id(), time(), _IsNew :: boolean()}.
session_add_iterator(DSSessionId, TopicFilter) -> session_add_iterator(DSSessionId, TopicFilter) ->
IteratorRefId = {DSSessionId, TopicFilter}, IteratorRefId = {DSSessionId, TopicFilter},
case mnesia:dirty_read(?ITERATOR_REF_TAB, IteratorRefId) of {atomic, Res} =
[] -> mria:transaction(?DS_SHARD, fun() ->
{IteratorId, StartMS} = new_iterator_id(DSSessionId), case mnesia:read(?ITERATOR_REF_TAB, IteratorRefId, write) of
IteratorRef = #iterator_ref{ [] ->
ref_id = IteratorRefId, {IteratorId, StartMS} = new_iterator_id(DSSessionId),
it_id = IteratorId, IteratorRef = #iterator_ref{
start_time = StartMS ref_id = IteratorRefId,
}, it_id = IteratorId,
ok = mria:dirty_write(?ITERATOR_REF_TAB, IteratorRef), start_time = StartMS
?tp( },
ds_session_subscription_added, ok = mnesia:write(?ITERATOR_REF_TAB, IteratorRef, write),
#{iterator_id => IteratorId, session_id => DSSessionId} ?tp(
), ds_session_subscription_added,
IsNew = true, #{iterator_id => IteratorId, session_id => DSSessionId}
{ok, IteratorId, StartMS, IsNew}; ),
[#iterator_ref{it_id = IteratorId, start_time = StartMS}] -> IsNew = true,
?tp( {ok, IteratorId, StartMS, IsNew};
ds_session_subscription_present, [#iterator_ref{it_id = IteratorId, start_time = StartMS}] ->
#{iterator_id => IteratorId, session_id => DSSessionId} ?tp(
), ds_session_subscription_present,
IsNew = false, #{iterator_id => IteratorId, session_id => DSSessionId}
{ok, IteratorId, StartMS, IsNew} ),
end. IsNew = false,
{ok, IteratorId, StartMS, IsNew}
end
end),
Res.
%% @doc Called when a client unsubscribes from a topic. Returns `true' %% @doc Called when a client unsubscribes from a topic. Returns `true'
%% if the session contained the subscription or `false' if it wasn't %% if the session contained the subscription or `false' if it wasn't