|
|
@@ -22,12 +22,6 @@
|
|
|
]).
|
|
|
|
|
|
-export([
|
|
|
- format_stream_progresses/1,
|
|
|
- format_stream_progress/1,
|
|
|
- format_stream_key/1,
|
|
|
- format_stream_keys/1,
|
|
|
- format_lease_event/1,
|
|
|
- format_lease_events/1,
|
|
|
agent/2
|
|
|
]).
|
|
|
|
|
|
@@ -57,6 +51,20 @@
|
|
|
agent_metadata/0
|
|
|
]).
|
|
|
|
|
|
+-define(log_agent_msg(ToLeader, Msg),
|
|
|
+ ?tp(debug, shared_sub_proto_msg, #{
|
|
|
+ to_leader => ToLeader,
|
|
|
+ msg => emqx_ds_shared_sub_proto_format:format_agent_msg(Msg)
|
|
|
+ })
|
|
|
+).
|
|
|
+
|
|
|
+-define(log_leader_msg(ToAgent, Msg),
|
|
|
+ ?tp(debug, shared_sub_proto_msg, #{
|
|
|
+ to_agent => ToAgent,
|
|
|
+ msg => emqx_ds_shared_sub_proto_format:format_leader_msg(Msg)
|
|
|
+ })
|
|
|
+).
|
|
|
+
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% API
|
|
|
%%--------------------------------------------------------------------
|
|
|
@@ -67,15 +75,7 @@
|
|
|
agent_connect_leader(ToLeader, FromAgent, AgentMetadata, ShareTopicFilter) when
|
|
|
?is_local_leader(ToLeader)
|
|
|
->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => agent_connect_leader,
|
|
|
- to_leader => ToLeader,
|
|
|
- from_agent => FromAgent,
|
|
|
- agent_metadata => AgentMetadata,
|
|
|
- share_topic_filter => ShareTopicFilter
|
|
|
- }),
|
|
|
- _ = erlang:send(ToLeader, ?agent_connect_leader(FromAgent, AgentMetadata, ShareTopicFilter)),
|
|
|
- ok;
|
|
|
+ send_agent_msg(ToLeader, ?agent_connect_leader(FromAgent, AgentMetadata, ShareTopicFilter));
|
|
|
agent_connect_leader(ToLeader, FromAgent, AgentMetadata, ShareTopicFilter) ->
|
|
|
emqx_ds_shared_sub_proto_v1:agent_connect_leader(
|
|
|
?leader_node(ToLeader), ToLeader, FromAgent, AgentMetadata, ShareTopicFilter
|
|
|
@@ -85,15 +85,7 @@ agent_connect_leader(ToLeader, FromAgent, AgentMetadata, ShareTopicFilter) ->
|
|
|
agent_update_stream_states(ToLeader, FromAgent, StreamProgresses, Version) when
|
|
|
?is_local_leader(ToLeader)
|
|
|
->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => agent_update_stream_states,
|
|
|
- to_leader => ToLeader,
|
|
|
- from_agent => FromAgent,
|
|
|
- stream_progresses => format_stream_progresses(StreamProgresses),
|
|
|
- version => Version
|
|
|
- }),
|
|
|
- _ = erlang:send(ToLeader, ?agent_update_stream_states(FromAgent, StreamProgresses, Version)),
|
|
|
- ok;
|
|
|
+ send_agent_msg(ToLeader, ?agent_update_stream_states(FromAgent, StreamProgresses, Version));
|
|
|
agent_update_stream_states(ToLeader, FromAgent, StreamProgresses, Version) ->
|
|
|
emqx_ds_shared_sub_proto_v1:agent_update_stream_states(
|
|
|
?leader_node(ToLeader), ToLeader, FromAgent, StreamProgresses, Version
|
|
|
@@ -105,18 +97,9 @@ agent_update_stream_states(ToLeader, FromAgent, StreamProgresses, Version) ->
|
|
|
agent_update_stream_states(ToLeader, FromAgent, StreamProgresses, VersionOld, VersionNew) when
|
|
|
?is_local_leader(ToLeader)
|
|
|
->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => agent_update_stream_states,
|
|
|
- to_leader => ToLeader,
|
|
|
- from_agent => FromAgent,
|
|
|
- stream_progresses => format_stream_progresses(StreamProgresses),
|
|
|
- version_old => VersionOld,
|
|
|
- version_new => VersionNew
|
|
|
- }),
|
|
|
- _ = erlang:send(
|
|
|
+ send_agent_msg(
|
|
|
ToLeader, ?agent_update_stream_states(FromAgent, StreamProgresses, VersionOld, VersionNew)
|
|
|
- ),
|
|
|
- ok;
|
|
|
+ );
|
|
|
agent_update_stream_states(ToLeader, FromAgent, StreamProgresses, VersionOld, VersionNew) ->
|
|
|
emqx_ds_shared_sub_proto_v1:agent_update_stream_states(
|
|
|
?leader_node(ToLeader), ToLeader, FromAgent, StreamProgresses, VersionOld, VersionNew
|
|
|
@@ -125,15 +108,7 @@ agent_update_stream_states(ToLeader, FromAgent, StreamProgresses, VersionOld, Ve
|
|
|
agent_disconnect(ToLeader, FromAgent, StreamProgresses, Version) when
|
|
|
?is_local_leader(ToLeader)
|
|
|
->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => agent_disconnect,
|
|
|
- to_leader => ToLeader,
|
|
|
- from_agent => FromAgent,
|
|
|
- stream_progresses => format_stream_progresses(StreamProgresses),
|
|
|
- version => Version
|
|
|
- }),
|
|
|
- _ = erlang:send(ToLeader, ?agent_disconnect(FromAgent, StreamProgresses, Version)),
|
|
|
- ok;
|
|
|
+ send_agent_msg(ToLeader, ?agent_disconnect(FromAgent, StreamProgresses, Version));
|
|
|
agent_disconnect(ToLeader, FromAgent, StreamProgresses, Version) ->
|
|
|
emqx_ds_shared_sub_proto_v1:agent_disconnect(
|
|
|
?leader_node(ToLeader), ToLeader, FromAgent, StreamProgresses, Version
|
|
|
@@ -144,19 +119,7 @@ agent_disconnect(ToLeader, FromAgent, StreamProgresses, Version) ->
|
|
|
-spec leader_lease_streams(agent(), group(), leader(), list(leader_stream_progress()), version()) ->
|
|
|
ok.
|
|
|
leader_lease_streams(ToAgent, OfGroup, Leader, Streams, Version) when ?is_local_agent(ToAgent) ->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => leader_lease_streams,
|
|
|
- to_agent => ToAgent,
|
|
|
- of_group => OfGroup,
|
|
|
- leader => Leader,
|
|
|
- streams => format_stream_progresses(Streams),
|
|
|
- version => Version
|
|
|
- }),
|
|
|
- _ = emqx_persistent_session_ds_shared_subs_agent:send(
|
|
|
- ?agent_pid(ToAgent),
|
|
|
- ?leader_lease_streams(OfGroup, Leader, Streams, Version)
|
|
|
- ),
|
|
|
- ok;
|
|
|
+ send_leader_msg(ToAgent, ?leader_lease_streams(OfGroup, Leader, Streams, Version));
|
|
|
leader_lease_streams(ToAgent, OfGroup, Leader, Streams, Version) ->
|
|
|
emqx_ds_shared_sub_proto_v1:leader_lease_streams(
|
|
|
?agent_node(ToAgent), ToAgent, OfGroup, Leader, Streams, Version
|
|
|
@@ -164,17 +127,7 @@ leader_lease_streams(ToAgent, OfGroup, Leader, Streams, Version) ->
|
|
|
|
|
|
-spec leader_renew_stream_lease(agent(), group(), version()) -> ok.
|
|
|
leader_renew_stream_lease(ToAgent, OfGroup, Version) when ?is_local_agent(ToAgent) ->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => leader_renew_stream_lease,
|
|
|
- to_agent => ToAgent,
|
|
|
- of_group => OfGroup,
|
|
|
- version => Version
|
|
|
- }),
|
|
|
- _ = emqx_persistent_session_ds_shared_subs_agent:send(
|
|
|
- ?agent_pid(ToAgent),
|
|
|
- ?leader_renew_stream_lease(OfGroup, Version)
|
|
|
- ),
|
|
|
- ok;
|
|
|
+ send_leader_msg(ToAgent, ?leader_renew_stream_lease(OfGroup, Version));
|
|
|
leader_renew_stream_lease(ToAgent, OfGroup, Version) ->
|
|
|
emqx_ds_shared_sub_proto_v1:leader_renew_stream_lease(
|
|
|
?agent_node(ToAgent), ToAgent, OfGroup, Version
|
|
|
@@ -182,18 +135,7 @@ leader_renew_stream_lease(ToAgent, OfGroup, Version) ->
|
|
|
|
|
|
-spec leader_renew_stream_lease(agent(), group(), version(), version()) -> ok.
|
|
|
leader_renew_stream_lease(ToAgent, OfGroup, VersionOld, VersionNew) when ?is_local_agent(ToAgent) ->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => leader_renew_stream_lease,
|
|
|
- to_agent => ToAgent,
|
|
|
- of_group => OfGroup,
|
|
|
- version_old => VersionOld,
|
|
|
- version_new => VersionNew
|
|
|
- }),
|
|
|
- _ = emqx_persistent_session_ds_shared_subs_agent:send(
|
|
|
- ?agent_pid(ToAgent),
|
|
|
- ?leader_renew_stream_lease(OfGroup, VersionOld, VersionNew)
|
|
|
- ),
|
|
|
- ok;
|
|
|
+ send_leader_msg(ToAgent, ?leader_renew_stream_lease(OfGroup, VersionOld, VersionNew));
|
|
|
leader_renew_stream_lease(ToAgent, OfGroup, VersionOld, VersionNew) ->
|
|
|
emqx_ds_shared_sub_proto_v1:leader_renew_stream_lease(
|
|
|
?agent_node(ToAgent), ToAgent, OfGroup, VersionOld, VersionNew
|
|
|
@@ -204,19 +146,7 @@ leader_renew_stream_lease(ToAgent, OfGroup, VersionOld, VersionNew) ->
|
|
|
leader_update_streams(ToAgent, OfGroup, VersionOld, VersionNew, StreamsNew) when
|
|
|
?is_local_agent(ToAgent)
|
|
|
->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => leader_update_streams,
|
|
|
- to_agent => ToAgent,
|
|
|
- of_group => OfGroup,
|
|
|
- version_old => VersionOld,
|
|
|
- version_new => VersionNew,
|
|
|
- streams_new => format_stream_progresses(StreamsNew)
|
|
|
- }),
|
|
|
- _ = emqx_persistent_session_ds_shared_subs_agent:send(
|
|
|
- ?agent_pid(ToAgent),
|
|
|
- ?leader_update_streams(OfGroup, VersionOld, VersionNew, StreamsNew)
|
|
|
- ),
|
|
|
- ok;
|
|
|
+ send_leader_msg(ToAgent, ?leader_update_streams(OfGroup, VersionOld, VersionNew, StreamsNew));
|
|
|
leader_update_streams(ToAgent, OfGroup, VersionOld, VersionNew, StreamsNew) ->
|
|
|
emqx_ds_shared_sub_proto_v1:leader_update_streams(
|
|
|
?agent_node(ToAgent), ToAgent, OfGroup, VersionOld, VersionNew, StreamsNew
|
|
|
@@ -224,16 +154,7 @@ leader_update_streams(ToAgent, OfGroup, VersionOld, VersionNew, StreamsNew) ->
|
|
|
|
|
|
-spec leader_invalidate(agent(), group()) -> ok.
|
|
|
leader_invalidate(ToAgent, OfGroup) when ?is_local_agent(ToAgent) ->
|
|
|
- ?tp(warning, shared_sub_proto_msg, #{
|
|
|
- type => leader_invalidate,
|
|
|
- to_agent => ToAgent,
|
|
|
- of_group => OfGroup
|
|
|
- }),
|
|
|
- _ = emqx_persistent_session_ds_shared_subs_agent:send(
|
|
|
- ?agent_pid(ToAgent),
|
|
|
- ?leader_invalidate(OfGroup)
|
|
|
- ),
|
|
|
- ok;
|
|
|
+ send_leader_msg(ToAgent, ?leader_invalidate(OfGroup));
|
|
|
leader_invalidate(ToAgent, OfGroup) ->
|
|
|
emqx_ds_shared_sub_proto_v1:leader_invalidate(
|
|
|
?agent_node(ToAgent), ToAgent, OfGroup
|
|
|
@@ -247,41 +168,12 @@ agent(Id, Pid) ->
|
|
|
_ = Id,
|
|
|
?agent(Id, Pid).
|
|
|
|
|
|
-format_stream_progresses(Streams) ->
|
|
|
- lists:map(
|
|
|
- fun format_stream_progress/1,
|
|
|
- Streams
|
|
|
- ).
|
|
|
-
|
|
|
-format_stream_progress(#{stream := Stream, progress := Progress} = Value) ->
|
|
|
- Value#{stream => format_opaque(Stream), progress => format_progress(Progress)}.
|
|
|
-
|
|
|
-format_progress(#{iterator := Iterator} = Progress) ->
|
|
|
- Progress#{iterator => format_opaque(Iterator)}.
|
|
|
-
|
|
|
-format_stream_key({SubId, Stream}) ->
|
|
|
- {SubId, format_opaque(Stream)}.
|
|
|
-
|
|
|
-format_stream_keys(StreamKeys) ->
|
|
|
- lists:map(
|
|
|
- fun format_stream_key/1,
|
|
|
- StreamKeys
|
|
|
- ).
|
|
|
-
|
|
|
-format_lease_events(Events) ->
|
|
|
- lists:map(
|
|
|
- fun format_lease_event/1,
|
|
|
- Events
|
|
|
- ).
|
|
|
-
|
|
|
-format_lease_event(#{stream := Stream, progress := Progress} = Event) ->
|
|
|
- Event#{stream => format_opaque(Stream), progress => format_progress(Progress)};
|
|
|
-format_lease_event(#{stream := Stream} = Event) ->
|
|
|
- Event#{stream => format_opaque(Stream)}.
|
|
|
-
|
|
|
-%%--------------------------------------------------------------------
|
|
|
-%% Helpers
|
|
|
-%%--------------------------------------------------------------------
|
|
|
+send_agent_msg(ToLeader, Msg) ->
|
|
|
+ ?log_agent_msg(ToLeader, Msg),
|
|
|
+ _ = erlang:send(ToLeader, Msg),
|
|
|
+ ok.
|
|
|
|
|
|
-format_opaque(Opaque) ->
|
|
|
- erlang:phash2(Opaque).
|
|
|
+send_leader_msg(ToAgent, Msg) ->
|
|
|
+ ?log_leader_msg(ToAgent, Msg),
|
|
|
+ _ = emqx_persistent_session_ds_shared_subs_agent:send(?agent_pid(ToAgent), Msg),
|
|
|
+ ok.
|