diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 68ca21a3b..4678aca89 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -3,6 +3,7 @@ {VSN, [{"4.4.1", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_session,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {add_module,emqx_relup}, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, @@ -40,6 +41,7 @@ {<<".*">>,[]}], [{"4.4.1", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_session,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {delete_module,emqx_relup}, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, diff --git a/src/emqx_cm.erl b/src/emqx_cm.erl index 4aa953caa..4b06f35a8 100644 --- a/src/emqx_cm.erl +++ b/src/emqx_cm.erl @@ -242,7 +242,8 @@ open_session(false, ClientInfo = #{clientid := ClientId}, ConnInfo) -> {ok, #{session => Session, present => false}} end, case takeover_session(ClientId) of - {ok, ConnMod, ChanPid, Session} -> + {ok, ConnMod, ChanPid, Session0} -> + Session = emqx_session:upgrade(ClientInfo, Session0), ok = emqx_session:resume(ClientInfo, Session), case request_stepdown({takeover, 'end'}, ConnMod, ChanPid) of {ok, Pendings} -> @@ -289,7 +290,7 @@ takeover_session(ClientId, ChanPid) when node(ChanPid) == node() -> ConnMod when is_atom(ConnMod) -> case request_stepdown({takeover, 'begin'}, ConnMod, ChanPid) of {ok, Session} -> - {ok, ConnMod, ChanPid, Session}; + {ok, ConnMod, ChanPid, emqx_session:downgrade(Session)}; {error, Reason} -> {error, Reason} end diff --git a/src/emqx_session.erl b/src/emqx_session.erl index bb5e84ac4..8612d9f16 100644 --- a/src/emqx_session.erl +++ b/src/emqx_session.erl @@ -83,6 +83,8 @@ -export([ takeover/1 , resume/2 , replay/2 + , upgrade/2 + , downgrade/1 ]). -export([expire/2]). @@ -196,6 +198,16 @@ init_mqueue(Zone) -> default_priority => get_env(Zone, mqueue_default_priority, lowest) }). +%% @doc uprade from 4.3 +upgrade(CInfo, S) -> + [session | Fields] = tuple_to_list(S), + #session{} = list_to_tuple([session, ?GET_CLIENT_ID(CInfo) | Fields] ++ [#{}]). + +%% @doc Downgrade to 4.3 +downgrade(#session{} = S) -> + [session, _ClientID | Fields] = tuple_to_list(S), + list_to_tuple([session | lists:reverse(tl(lists:reverse(Fields)))]). + %%-------------------------------------------------------------------- %% Info, Stats %%--------------------------------------------------------------------