Fix bridge bug (#2160)
* Fix bridge bug * Fix ack bug * Limit bridge QoS less than 1
This commit is contained in:
parent
067d28dcb6
commit
55ec358cd6
|
@ -228,16 +228,19 @@ handle_info(replay, State = #state{client_pid = ClientPid, readq = ReadQ}) ->
|
||||||
%%----------------------------------------------------------------
|
%%----------------------------------------------------------------
|
||||||
%% received local node message
|
%% received local node message
|
||||||
%%----------------------------------------------------------------
|
%%----------------------------------------------------------------
|
||||||
handle_info({dispatch, _, #message{topic = Topic, payload = Payload, flags = #{retain := Retain}}},
|
handle_info({dispatch, _, #message{topic = Topic, qos = QoS, payload = Payload, flags = #{retain := Retain}}},
|
||||||
State = #state{client_pid = undefined,
|
State = #state{client_pid = undefined,
|
||||||
mountpoint = Mountpoint}) ->
|
mountpoint = Mountpoint})
|
||||||
|
when QoS =< 1 ->
|
||||||
Msg = #mqtt_msg{qos = 1,
|
Msg = #mqtt_msg{qos = 1,
|
||||||
retain = Retain,
|
retain = Retain,
|
||||||
topic = mountpoint(Mountpoint, Topic),
|
topic = mountpoint(Mountpoint, Topic),
|
||||||
payload = Payload},
|
payload = Payload},
|
||||||
{noreply, en_writeq({undefined, Msg}, State)};
|
{noreply, en_writeq({undefined, Msg}, State)};
|
||||||
handle_info({dispatch, _, #message{topic = Topic, payload = Payload, flags = #{retain := Retain}}},
|
handle_info({dispatch, _, #message{topic = Topic, qos = QoS ,payload = Payload, flags = #{retain := Retain}}},
|
||||||
State = #state{client_pid = Pid, mountpoint = Mountpoint}) ->
|
State = #state{client_pid = Pid,
|
||||||
|
mountpoint = Mountpoint})
|
||||||
|
when QoS =< 1 ->
|
||||||
Msg = #mqtt_msg{qos = 1,
|
Msg = #mqtt_msg{qos = 1,
|
||||||
retain = Retain,
|
retain = Retain,
|
||||||
topic = mountpoint(Mountpoint, Topic),
|
topic = mountpoint(Mountpoint, Topic),
|
||||||
|
@ -347,7 +350,6 @@ format_mountpoint(undefined) ->
|
||||||
format_mountpoint(Prefix) ->
|
format_mountpoint(Prefix) ->
|
||||||
binary:replace(bin(Prefix), <<"${node}">>, atom_to_binary(node(), utf8)).
|
binary:replace(bin(Prefix), <<"${node}">>, atom_to_binary(node(), utf8)).
|
||||||
|
|
||||||
|
|
||||||
en_writeq(Msg, State = #state{replayq = ReplayQ,
|
en_writeq(Msg, State = #state{replayq = ReplayQ,
|
||||||
queue_option = #{mem_cache := false}}) ->
|
queue_option = #{mem_cache := false}}) ->
|
||||||
NewReplayQ = replayq:append(ReplayQ, [Msg]),
|
NewReplayQ = replayq:append(ReplayQ, [Msg]),
|
||||||
|
@ -369,16 +371,21 @@ publish_readq_msg(ClientPid, [{_PktId, Msg} | ReadQ], NewReadQ) ->
|
||||||
publish_readq_msg(ClientPid, ReadQ, [{PktId, Msg} | NewReadQ]).
|
publish_readq_msg(ClientPid, ReadQ, [{PktId, Msg} | NewReadQ]).
|
||||||
|
|
||||||
delete(PktId, State = #state{ replayq = ReplayQ,
|
delete(PktId, State = #state{ replayq = ReplayQ,
|
||||||
|
readq = [],
|
||||||
queue_option = #{ mem_cache := false}}) ->
|
queue_option = #{ mem_cache := false}}) ->
|
||||||
{NewReplayQ, NewAckRef, Msgs} = replayq:pop(ReplayQ, #{count_limit => 1}),
|
{NewReplayQ, NewAckRef, Msgs} = replayq:pop(ReplayQ, #{count_limit => 1}),
|
||||||
|
logger:debug("[Msg] PacketId ~p, Msg: ~p", [PktId, Msgs]),
|
||||||
|
ok = replayq:ack(NewReplayQ, NewAckRef),
|
||||||
case Msgs of
|
case Msgs of
|
||||||
[{PktId, Msg}] ->
|
[{PktId, _Msg}] ->
|
||||||
logger:debug("[Msg] PacketId ~p, Msg: ~p", [PktId, Msg]),
|
|
||||||
replayq:ack(ReplayQ, NewAckRef),
|
|
||||||
State#state{ replayq = NewReplayQ, ackref = NewAckRef};
|
|
||||||
_ ->
|
|
||||||
self() ! pop,
|
self() ! pop,
|
||||||
State
|
State#state{ replayq = NewReplayQ, ackref = NewAckRef };
|
||||||
|
[{_PktId, _Msg}] ->
|
||||||
|
NewReplayQ1 = replayq:append(NewReplayQ, Msgs),
|
||||||
|
self() ! pop,
|
||||||
|
State#state{ replayq = NewReplayQ1, ackref = NewAckRef };
|
||||||
|
_Empty ->
|
||||||
|
State#state{ replayq = NewReplayQ, ackref = NewAckRef}
|
||||||
end;
|
end;
|
||||||
delete(_PktId, State = #state{readq = [], writeq = [], replayq = ReplayQ, ackref = AckRef}) ->
|
delete(_PktId, State = #state{readq = [], writeq = [], replayq = ReplayQ, ackref = AckRef}) ->
|
||||||
ok = replayq:ack(ReplayQ, AckRef),
|
ok = replayq:ack(ReplayQ, AckRef),
|
||||||
|
@ -388,8 +395,16 @@ delete(_PktId, State = #state{readq = [], writeq = [], replayq = ReplayQ, ackref
|
||||||
delete(PktId, State = #state{readq = [], writeq = WriteQ}) ->
|
delete(PktId, State = #state{readq = [], writeq = WriteQ}) ->
|
||||||
State#state{writeq = lists:keydelete(PktId, 1, WriteQ)};
|
State#state{writeq = lists:keydelete(PktId, 1, WriteQ)};
|
||||||
|
|
||||||
delete(PktId, State = #state{readq = ReadQ}) ->
|
delete(PktId, State = #state{readq = ReadQ, replayq = ReplayQ, ackref = AckRef}) ->
|
||||||
State#state{readq = lists:keydelete(PktId, 1, ReadQ)}.
|
NewReadQ = lists:keydelete(PktId, 1, ReadQ),
|
||||||
|
case NewReadQ of
|
||||||
|
[] ->
|
||||||
|
ok = replayq:ack(ReplayQ, AckRef),
|
||||||
|
self() ! pop;
|
||||||
|
_NewReadQ ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
|
State#state{ readq = NewReadQ }.
|
||||||
|
|
||||||
bridge(Action, State = #state{options = Options,
|
bridge(Action, State = #state{options = Options,
|
||||||
replayq = ReplayQ,
|
replayq = ReplayQ,
|
||||||
|
|
Loading…
Reference in New Issue