fix(shared_sub): failed to clean the emqx_shared_subscription tab

A trick that fixes the issue that we demonitored the shared subscriber
too early if it not unsubscribed all of the topics.
This commit is contained in:
Shawn 2021-06-25 19:00:57 +08:00 committed by zhanghongtong
parent 05150ce58b
commit 8f15a41f54
1 changed files with 7 additions and 3 deletions

View File

@ -336,9 +336,13 @@ handle_info({mnesia_table_event, {write, NewRecord, _}}, State = #state{pmon = P
#emqx_shared_subscription{subpid = SubPid} = NewRecord, #emqx_shared_subscription{subpid = SubPid} = NewRecord,
{noreply, update_stats(State#state{pmon = emqx_pmon:monitor(SubPid, PMon)})}; {noreply, update_stats(State#state{pmon = emqx_pmon:monitor(SubPid, PMon)})};
handle_info({mnesia_table_event, {delete_object, OldRecord, _}}, State = #state{pmon = PMon}) -> %% The subscriber may have subscribed multiple topics, so we need to keep monitoring the PID until
#emqx_shared_subscription{subpid = SubPid} = OldRecord, %% it `unsubscribed` the last topic.
{noreply, update_stats(State#state{pmon = emqx_pmon:demonitor(SubPid, PMon)})}; %% The trick is we don't demonitor the subscriber here, and (after a long time) it will eventually
%% be disconnected.
% handle_info({mnesia_table_event, {delete_object, OldRecord, _}}, State = #state{pmon = PMon}) ->
% #emqx_shared_subscription{subpid = SubPid} = OldRecord,
% {noreply, update_stats(State#state{pmon = emqx_pmon:demonitor(SubPid, PMon)})};
handle_info({mnesia_table_event, _Event}, State) -> handle_info({mnesia_table_event, _Event}, State) ->
{noreply, State}; {noreply, State};