|
@@ -258,7 +258,7 @@ subscriptions(Subscriber) ->
|
|
|
subscription(Topic, Subscriber);
|
|
subscription(Topic, Subscriber);
|
|
|
({_, Topic}) ->
|
|
({_, Topic}) ->
|
|
|
subscription(Topic, Subscriber)
|
|
subscription(Topic, Subscriber)
|
|
|
- end, ets:lookup(?SUBSCRIPTION, Subscriber)).
|
|
|
|
|
|
|
+ end, ets:lookup(?SUBSCRIPTION, Subscriber)).
|
|
|
|
|
|
|
|
subscription(Topic, Subscriber) ->
|
|
subscription(Topic, Subscriber) ->
|
|
|
{Topic, ets:lookup_element(?SUBOPTION, {Topic, Subscriber}, 2)}.
|
|
{Topic, ets:lookup_element(?SUBOPTION, {Topic, Subscriber}, 2)}.
|
|
@@ -336,15 +336,14 @@ handle_cast({From, #subscribe{topic = Topic, subpid = SubPid, subid = SubId, sub
|
|
|
Subscriber = {SubPid, SubId},
|
|
Subscriber = {SubPid, SubId},
|
|
|
case ets:member(?SUBOPTION, {Topic, Subscriber}) of
|
|
case ets:member(?SUBOPTION, {Topic, Subscriber}) of
|
|
|
false ->
|
|
false ->
|
|
|
- resubscribe(From, {Subscriber, SubOpts, Topic}, State);
|
|
|
|
|
|
|
+ Group = maps:get(share, SubOpts, undefined),
|
|
|
|
|
+ true = do_subscribe(Group, Topic, Subscriber, SubOpts),
|
|
|
|
|
+ emqx_shared_sub:subscribe(Group, Topic, SubPid),
|
|
|
|
|
+ emqx_router:add_route(From, Topic, dest(Group)),
|
|
|
|
|
+ {noreply, monitor_subscriber(Subscriber, State)};
|
|
|
true ->
|
|
true ->
|
|
|
- case ets:lookup_element(?SUBOPTION, {Topic, Subscriber}, 2) =:= SubOpts of
|
|
|
|
|
- true ->
|
|
|
|
|
- gen_server:reply(From, ok),
|
|
|
|
|
- {noreply, State};
|
|
|
|
|
- false ->
|
|
|
|
|
- resubscribe(From, {Subscriber, SubOpts, Topic}, State)
|
|
|
|
|
- end
|
|
|
|
|
|
|
+ gen_server:reply(From, ok),
|
|
|
|
|
+ {noreply, State}
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
handle_cast({From, #unsubscribe{topic = Topic, subpid = SubPid, subid = SubId}}, State) ->
|
|
handle_cast({From, #unsubscribe{topic = Topic, subpid = SubPid, subid = SubId}}, State) ->
|
|
@@ -390,26 +389,9 @@ code_change(_OldVsn, State, _Extra) ->
|
|
|
%% Internal functions
|
|
%% Internal functions
|
|
|
%%------------------------------------------------------------------------------
|
|
%%------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
-resubscribe(From, {Subscriber, SubOpts, Topic}, State) ->
|
|
|
|
|
- {SubPid, _} = Subscriber,
|
|
|
|
|
- Group = maps:get(share, SubOpts, undefined),
|
|
|
|
|
- true = do_subscribe(Group, Topic, Subscriber, SubOpts),
|
|
|
|
|
- emqx_shared_sub:subscribe(Group, Topic, SubPid),
|
|
|
|
|
- emqx_router:add_route(From, Topic, dest(Group)),
|
|
|
|
|
- {noreply, monitor_subscriber(Subscriber, State)}.
|
|
|
|
|
-
|
|
|
|
|
-insert_subscriber(Group, Topic, Subscriber) ->
|
|
|
|
|
- Subscribers = subscribers(Topic),
|
|
|
|
|
- case lists:member(Subscriber, Subscribers) of
|
|
|
|
|
- false ->
|
|
|
|
|
- ets:insert(?SUBSCRIBER, {Topic, shared(Group, Subscriber)});
|
|
|
|
|
- _ ->
|
|
|
|
|
- ok
|
|
|
|
|
- end.
|
|
|
|
|
-
|
|
|
|
|
do_subscribe(Group, Topic, Subscriber, SubOpts) ->
|
|
do_subscribe(Group, Topic, Subscriber, SubOpts) ->
|
|
|
ets:insert(?SUBSCRIPTION, {Subscriber, shared(Group, Topic)}),
|
|
ets:insert(?SUBSCRIPTION, {Subscriber, shared(Group, Topic)}),
|
|
|
- insert_subscriber(Group, Topic, Subscriber),
|
|
|
|
|
|
|
+ ets:insert(?SUBSCRIBER, {Topic, shared(Group, Subscriber)}),
|
|
|
ets:insert(?SUBOPTION, {{Topic, Subscriber}, SubOpts}).
|
|
ets:insert(?SUBOPTION, {{Topic, Subscriber}, SubOpts}).
|
|
|
|
|
|
|
|
do_unsubscribe(Group, Topic, Subscriber) ->
|
|
do_unsubscribe(Group, Topic, Subscriber) ->
|