fix: reinstate transactions
This commit is contained in:
parent
65085d012b
commit
dbfacae283
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue