From 664aa31349b60a55aee0fa950e8879e7c35e262c Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 20:59:24 +0800 Subject: [PATCH 01/14] websockt --- doc/rfc6455 | Bin 0 -> 240831 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/rfc6455 diff --git a/doc/rfc6455 b/doc/rfc6455 new file mode 100644 index 0000000000000000000000000000000000000000..74625160ea470df1687d10219f991214e6afabb6 GIT binary patch literal 240831 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

1hb7 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

rX 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 ozFhyd=$n+a literal 0 HcmV?d00001 From 683459ea40c1d0f12af43bf74015f4c147ca778e Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 21:01:11 +0800 Subject: [PATCH 02/14] websocket --- doc/{rfc6455 => rfc6455.pdf} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{rfc6455 => rfc6455.pdf} (100%) diff --git a/doc/rfc6455 b/doc/rfc6455.pdf similarity index 100% rename from doc/rfc6455 rename to doc/rfc6455.pdf From fcecd1e0db63c99441bb7f167e729f81f0e87d6f Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 23:14:15 +0800 Subject: [PATCH 03/14] gproc 0.4 --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 2b3406b51..b14e0688b 100644 --- a/rebar.config +++ b/rebar.config @@ -23,7 +23,7 @@ "apps/emqttd"]}. {deps, [ - {gproc, "0.3.*", {git, "git://github.com/uwiger/gproc.git", {branch, "master"}}}, + {gproc, "0.4.*", {git, "git://github.com/uwiger/gproc.git", {branch, "master"}}}, {lager, ".*", {git, "git://github.com/basho/lager.git", {branch, "master"}}}, {esockd, "2.*", {git, "git://github.com/emqtt/esockd.git", {branch, "master"}}}, {mochiweb, ".*", {git, "git://github.com/slimpp/mochiweb.git", {branch, "master"}}} From f1632ef2dfc1f4f9eef1e0a66263a3315ae7eb49 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 23:20:19 +0800 Subject: [PATCH 04/14] fix issues #54 --- apps/emqttd/src/emqttd_app.erl | 2 +- apps/emqttd/src/emqttd_cm.erl | 116 +++++++++---------------- apps/emqttd/src/emqttd_cm_sup.erl | 62 +++++++++++++ apps/emqttd/src/emqttd_session.erl | 50 +++++++++-- apps/emqttd/src/emqttd_session_sup.erl | 2 +- apps/emqttd/src/emqttd_utils.erl | 8 +- 6 files changed, 155 insertions(+), 85 deletions(-) create mode 100644 apps/emqttd/src/emqttd_cm_sup.erl diff --git a/apps/emqttd/src/emqttd_app.erl b/apps/emqttd/src/emqttd_app.erl index e7e116dd6..aaf12246a 100644 --- a/apps/emqttd/src/emqttd_app.erl +++ b/apps/emqttd/src/emqttd_app.erl @@ -75,7 +75,7 @@ start_servers(Sup) -> {"emqttd config", emqttd_config}, {"emqttd event", emqttd_event}, {"emqttd pooler", {supervisor, emqttd_pooler_sup}}, - {"emqttd client manager", emqttd_cm}, + {"emqttd client manager", {supervisor, emqttd_cm_sup}}, {"emqttd session manager", emqttd_sm}, {"emqttd session supervisor", {supervisor, emqttd_session_sup}, SessOpts}, {"emqttd pubsub", {supervisor, emqttd_pubsub_sup}, PubSubOpts}, diff --git a/apps/emqttd/src/emqttd_cm.erl b/apps/emqttd/src/emqttd_cm.erl index 6b9d34848..87396ea55 100644 --- a/apps/emqttd/src/emqttd_cm.erl +++ b/apps/emqttd/src/emqttd_cm.erl @@ -33,24 +33,17 @@ -define(SERVER, ?MODULE). %% API Exports --export([start_link/0]). +-export([start_link/2]). -export([lookup/1, register/1, unregister/1]). -%% Stats --export([getstats/0]). - %% gen_server Function Exports --export([init/1, - handle_call/3, - handle_cast/2, - handle_info/2, - terminate/2, - code_change/3]). +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, + terminate/2, code_change/3]). -record(state, {tab}). --define(CLIENT_TAB, mqtt_client). +-define(POOL, cm). %%%============================================================================= %%% API @@ -62,9 +55,11 @@ %% %% @end %%------------------------------------------------------------------------------ --spec start_link() -> {ok, pid()} | ignore | {error, any()}. -start_link() -> - gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). +-spec start_link(Id, TabId) -> {ok, pid()} | ignore | {error, any()} when + Id :: pos_integer(), + TabId :: ets:tid(). +start_link(Id, TabId) -> + gen_server:start_link(?MODULE, [Id, TabId], []). %%------------------------------------------------------------------------------ %% @doc @@ -74,7 +69,7 @@ start_link() -> %%------------------------------------------------------------------------------ -spec lookup(ClientId :: binary()) -> pid() | undefined. lookup(ClientId) when is_binary(ClientId) -> - case ets:lookup(?CLIENT_TAB, ClientId) of + case ets:lookup(emqttd_cm_sup:table(), ClientId) of [{_, Pid, _}] -> Pid; [] -> undefined end. @@ -85,12 +80,8 @@ lookup(ClientId) when is_binary(ClientId) -> %%------------------------------------------------------------------------------ -spec register(ClientId :: binary()) -> ok. register(ClientId) when is_binary(ClientId) -> - Pid = self(), - %% this is atomic - case ets:insert_new(?CLIENT_TAB, {ClientId, Pid, undefined}) of - true -> gen_server:cast(?SERVER, {monitor, ClientId, Pid}); - false -> gen_server:cast(?SERVER, {register, ClientId, Pid}) - end. + CmPid = gproc_pool:pick_worker(?POOL, ClientId), + gen_server:call(CmPid, {register, ClientId, self()}, infinity). %%------------------------------------------------------------------------------ %% @doc @@ -100,54 +91,46 @@ register(ClientId) when is_binary(ClientId) -> %%------------------------------------------------------------------------------ -spec unregister(ClientId :: binary()) -> ok. unregister(ClientId) when is_binary(ClientId) -> - gen_server:cast(?SERVER, {unregister, ClientId, self()}). - -%%------------------------------------------------------------------------------ -%% @doc -%% Get statistics of client manager. -%% -%% @end -%%------------------------------------------------------------------------------ -getstats() -> - [{Name, emqttd_broker:getstat(Name)} || - Name <- ['clients/count', 'clients/max']]. + CmPid = gproc_pool:pick_worker(?POOL, ClientId), + gen_server:cast(CmPid, {unregister, ClientId, self()}). %%%============================================================================= %%% gen_server callbacks %%%============================================================================= -init([]) -> - TabId = ets:new(?CLIENT_TAB, [set, - named_table, - public, - {write_concurrency, true}]), +init([Id, TabId]) -> + gproc_pool:connect_worker(?POOL, {?MODULE, Id}), {ok, #state{tab = TabId}}. +handle_call({register, ClientId, Pid}, _From, State = #state{tab = Tab}) -> + case ets:lookup(Tab, ClientId) of + [{_, Pid, _}] -> + lager:error("clientId '~s' has been registered with ~p", [ClientId, Pid]), + ignore; + [{_, OldPid, MRef}] -> + lager:error("clientId '~s' is duplicated: pid=~p, oldpid=~p", [ClientId, Pid, OldPid]), + %%TODO: tell session old client is down here? + case emqttd_session:lookup(ClientId) of + undefined -> ok; + SessPid -> emqttd_session:client_down(SessPid, {OldPid, duplicate_id}) + end, + OldPid ! {stop, duplicate_id, Pid}, + erlang:demonitor(MRef), + ets:insert(Tab, {ClientId, Pid, erlang:monitor(process, Pid)}); + [] -> + ets:insert(Tab, {ClientId, Pid, erlang:monitor(process, Pid)}) + end, + {reply, ok, State}; + handle_call(Req, _From, State) -> lager:error("unexpected request: ~p", [Req]), {reply, {error, badreq}, State}. -handle_cast({register, ClientId, Pid}, State=#state{tab = Tab}) -> - case registerd(Tab, {ClientId, Pid}) of - true -> - ignore; - false -> - ets:insert(Tab, {ClientId, Pid, erlang:monitor(process, Pid)}) - end, - {noreply, setstats(State)}; - -handle_cast({monitor, ClientId, Pid}, State = #state{tab = Tab}) -> - case ets:update_element(Tab, ClientId, {3, erlang:monitor(process, Pid)}) of - true -> ok; - false -> lager:error("failed to monitor clientId '~s' with pid ~p", [ClientId, Pid]) - end, - {noreply, setstats(State)}; - -handle_cast({unregister, ClientId, Pid}, State) -> - case ets:lookup(?CLIENT_TAB, ClientId) of +handle_cast({unregister, ClientId, Pid}, State = #state{tab = TabId}) -> + case ets:lookup(TabId, ClientId) of [{_, Pid, MRef}] -> erlang:demonitor(MRef, [flush]), - ets:delete(?CLIENT_TAB, ClientId); + ets:delete(TabId, ClientId); [_] -> ignore; [] -> @@ -158,8 +141,8 @@ handle_cast({unregister, ClientId, Pid}, State) -> handle_cast(_Msg, State) -> {noreply, State}. -handle_info({'DOWN', MRef, process, DownPid, _Reason}, State) -> - ets:match_delete(?CLIENT_TAB, {'_', DownPid, MRef}), +handle_info({'DOWN', MRef, process, DownPid, _Reason}, State = #state{tab = TabId}) -> + ets:match_delete(TabId, {'_', DownPid, MRef}), {noreply, setstats(State)}; handle_info(_Info, State) -> @@ -174,23 +157,10 @@ code_change(_OldVsn, State, _Extra) -> %%%============================================================================= %%% Internal functions %%%============================================================================= -registerd(Tab, {ClientId, Pid}) -> - case ets:lookup(Tab, ClientId) of - [{_, Pid, _}] -> - lager:error("clientId '~s' has been registered with ~p", [ClientId, Pid]), - true; - [{_, OldPid, MRef}] -> - lager:error("clientId '~s' is duplicated: pid=~p, oldpid=~p", [ClientId, Pid, OldPid]), - OldPid ! {stop, duplicate_id, Pid}, - erlang:demonitor(MRef), - false; - [] -> - false - end. -setstats(State) -> +setstats(State = #state{tab = TabId}) -> emqttd_broker:setstats('clients/count', 'clients/max', - ets:info(?CLIENT_TAB, size)), State. + ets:info(TabId, size)), State. diff --git a/apps/emqttd/src/emqttd_cm_sup.erl b/apps/emqttd/src/emqttd_cm_sup.erl new file mode 100644 index 000000000..853349b55 --- /dev/null +++ b/apps/emqttd/src/emqttd_cm_sup.erl @@ -0,0 +1,62 @@ +%%%----------------------------------------------------------------------------- +%%% @Copyright (C) 2012-2015, Feng Lee +%%% +%%% Permission is hereby granted, free of charge, to any person obtaining a copy +%%% of this software and associated documentation files (the "Software"), to deal +%%% in the Software without restriction, including without limitation the rights +%%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%%% copies of the Software, and to permit persons to whom the Software is +%%% furnished to do so, subject to the following conditions: +%%% +%%% The above copyright notice and this permission notice shall be included in all +%%% copies or substantial portions of the Software. +%%% +%%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +%%% SOFTWARE. +%%%----------------------------------------------------------------------------- +%%% @doc +%%% emqttd client manager supervisor. +%%% +%%% @end +%%%----------------------------------------------------------------------------- +-module(emqttd_cm_sup). + +-author('feng@emqtt.io'). + +-include("emqttd.hrl"). + +-behaviour(supervisor). + +%% API +-export([start_link/0, table/0]). + +%% Supervisor callbacks +-export([init/1]). + +-define(CLIENT_TAB, mqtt_client). + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + +table() -> ?CLIENT_TAB. + +init([]) -> + TabId = ets:new(?CLIENT_TAB, [set, named_table, public, + {write_concurrency, true}]), + Schedulers = erlang:system_info(schedulers), + gproc_pool:new(cm, hash, [{size, Schedulers}]), + Children = lists:map( + fun(I) -> + Name = {emqttd_cm, I}, + gproc_pool:add_worker(cm, Name, I), + {Name, {emqttd_cm, start_link, [I, TabId]}, + permanent, 10000, worker, [emqttd_cm]} + end, lists:seq(1, Schedulers)), + {ok, {{one_for_all, 10, 100}, Children}}. + + diff --git a/apps/emqttd/src/emqttd_session.erl b/apps/emqttd/src/emqttd_session.erl index a2a9a3ecd..77c0ae7a3 100644 --- a/apps/emqttd/src/emqttd_session.erl +++ b/apps/emqttd/src/emqttd_session.erl @@ -42,7 +42,7 @@ -export([store/2]). %% Start gen_server --export([start_link/3]). +-export([start_link/3, client_down/2]). %% gen_server Function Exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -252,9 +252,20 @@ initial_state(ClientId, ClientPid) -> State = initial_state(ClientId), State#session_state{client_pid = ClientPid}. +%%------------------------------------------------------------------------------ +%% @doc Start a session process. +%% @end +%%------------------------------------------------------------------------------ start_link(SessOpts, ClientId, ClientPid) -> gen_server:start_link(?MODULE, [SessOpts, ClientId, ClientPid], []). +%%------------------------------------------------------------------------------ +%% @doc Notify the session process that client will be DOWN. +%% @end +%%------------------------------------------------------------------------------ +client_down(SessPid, {ClientPid, Reason}) -> + gen_server:cast(SessPid, {'DOWN', ClientPid, Reason}). + %%%============================================================================= %%% gen_server callbacks %%%============================================================================= @@ -279,7 +290,8 @@ handle_call({unsubscribe, Topics}, _From, State) -> {reply, ok, NewState}; handle_call(Req, _From, State) -> - {stop, {badreq, Req}, State}. + lager:error("Unexpected request: ~p", [Req]), + {reply, error, State}. handle_cast({resume, ClientId, ClientPid}, State = #session_state{ clientid = ClientId, @@ -336,8 +348,20 @@ handle_cast({destroy, ClientId}, State = #session_state{clientid = ClientId}) -> lager:warning("Session ~s destroyed", [ClientId]), {stop, normal, State}; +handle_cast({resume, ClientId, ClientPid}, State) -> + lager:error("Cannot resume session ~p with pid ~p: ~p", + [ClientId, ClientPid, State]), + {noreply, State}; + +handle_cast({'DOWN', ClientPid, Reason}, State = #session_state{clientid = ClientId, + client_pid = ClientPid}) -> + lager:error("Session: client ~s@~p is down for ~p", [ClientId, ClientPid, Reason]), + unlink(ClientPid), + {noreply, start_expire_timer(State#session_state{client_pid = undefined})}; + handle_cast(Msg, State) -> - {stop, {badmsg, Msg}, State}. + lager:critical("Unexpected Msg: ~p, State: ~p", [Msg, State]), + {noreply, State}. handle_info({dispatch, {_From, Messages}}, State) when is_list(Messages) -> F = fun(Message, S) -> dispatch(Message, S) end, @@ -347,18 +371,21 @@ handle_info({dispatch, {_From, Message}}, State) -> {noreply, dispatch(Message, State)}; handle_info({'EXIT', ClientPid, Reason}, State = #session_state{clientid = ClientId, - client_pid = ClientPid, - expires = Expires}) -> - lager:warning("Session: client ~s@~p exited, caused by ~p", [ClientId, ClientPid, Reason]), - Timer = erlang:send_after(Expires * 1000, self(), session_expired), - {noreply, State#session_state{client_pid = undefined, expire_timer = Timer}}; + client_pid = ClientPid}) -> + lager:error("Session: client ~s@~p exited, caused by ~p", [ClientId, ClientPid, Reason]), + {noreply, start_expire_timer(State#session_state{client_pid = undefined})}; + +handle_info({'EXIT', ClientPid, _Reason}, State = #session_state{client_pid = OtherClientPid}) -> + lager:error("Unexpected Client EXIT: pid=~p, pid(state): ~p", [ClientPid, OtherClientPid]), + {noreply, State}; handle_info(session_expired, State = #session_state{clientid = ClientId}) -> lager:warning("Session ~s expired!", [ClientId]), {stop, {shutdown, expired}, State}; handle_info(Info, State) -> - {stop, {badinfo, Info}, State}. + lager:critical("Unexpected Info: ~p, State: ~p", [Info, State]), + {noreply, State}. terminate(_Reason, _State) -> ok. @@ -393,4 +420,9 @@ next_msg_id(State = #session_state{message_id = 16#ffff}) -> next_msg_id(State = #session_state{message_id = MsgId}) -> State#session_state{message_id = MsgId + 1}. +start_expire_timer(State = #session_state{expires = Expires, + expire_timer = OldTimer}) -> + emqttd_utils:cancel_timer(OldTimer), + Timer = erlang:send_after(Expires * 1000, self(), session_expired), + State#session_state{expire_timer = Timer}. diff --git a/apps/emqttd/src/emqttd_session_sup.erl b/apps/emqttd/src/emqttd_session_sup.erl index 723efc532..f891d389f 100644 --- a/apps/emqttd/src/emqttd_session_sup.erl +++ b/apps/emqttd/src/emqttd_session_sup.erl @@ -48,7 +48,7 @@ start_session(ClientId, ClientPid) -> %%% Supervisor callbacks %%%============================================================================= init([SessOpts]) -> - {ok, {{simple_one_for_one, 0, 1}, + {ok, {{simple_one_for_one, 10, 10}, [{session, {emqttd_session, start_link, [SessOpts]}, transient, 10000, worker, [emqttd_session]}]}}. diff --git a/apps/emqttd/src/emqttd_utils.erl b/apps/emqttd/src/emqttd_utils.erl index c5ceecef9..316f1854b 100644 --- a/apps/emqttd/src/emqttd_utils.erl +++ b/apps/emqttd/src/emqttd_utils.erl @@ -27,7 +27,8 @@ -module(emqttd_utils). -export([apply_module_attributes/1, - all_module_attributes/1]). + all_module_attributes/1, + cancel_timer/1]). %% only {F, Args}... apply_module_attributes(Name) -> @@ -76,3 +77,8 @@ ignore_lib_apps(Apps) -> hipe, esockd, mochiweb], [App || App = {Name, _, _} <- Apps, not lists:member(Name, LibApps)]. + +cancel_timer(undefined) -> + undefined; +cancel_timer(Ref) -> + catch erlang:cancel_timer(Ref). From 70a20591bfde27f063b2f1dfb535e567a59c2257 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 23:23:08 +0800 Subject: [PATCH 05/14] 0.6.2 --- apps/emqtt/src/emqtt.app.src | 2 +- apps/emqttd/src/emqttd.app.src | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqtt/src/emqtt.app.src b/apps/emqtt/src/emqtt.app.src index ff295a8a3..ffe1029f3 100644 --- a/apps/emqtt/src/emqtt.app.src +++ b/apps/emqtt/src/emqtt.app.src @@ -1,7 +1,7 @@ {application, emqtt, [ {description, "Erlang MQTT Common Library"}, - {vsn, "0.6.0"}, + {vsn, "0.6.2"}, {modules, []}, {registered, []}, {applications, [ diff --git a/apps/emqttd/src/emqttd.app.src b/apps/emqttd/src/emqttd.app.src index 5841321f9..73f18f498 100644 --- a/apps/emqttd/src/emqttd.app.src +++ b/apps/emqttd/src/emqttd.app.src @@ -1,7 +1,7 @@ {application, emqttd, [ {description, "Erlang MQTT Broker"}, - {vsn, "0.6.1"}, + {vsn, "0.6.2"}, {modules, []}, {registered, []}, {applications, [kernel, From 21138eb487b32d375de74dd6441a5f19a30ad35f Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 23:26:05 +0800 Subject: [PATCH 06/14] 0.6.2 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe7ceee41..1500c4896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ emqttd ChangeLog ================== +0.6.2-alpha (2015-04-23) +------------------------- + +Bugfix: critical issue #54, #104, #106 - error when resume session + +Improve: add emqttd_cm_sup module, and use 'hash' gproc_pool to register/unregister client ids + + 0.6.1-alpha (2015-04-20) ------------------------- From 77a26ded12f8bed868f8d1b0e23c6fbea3bfb64c Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 23 Apr 2015 23:36:31 +0800 Subject: [PATCH 07/14] lookup_session --- apps/emqttd/src/emqttd_cm.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqttd/src/emqttd_cm.erl b/apps/emqttd/src/emqttd_cm.erl index 87396ea55..3dd0fcdf2 100644 --- a/apps/emqttd/src/emqttd_cm.erl +++ b/apps/emqttd/src/emqttd_cm.erl @@ -110,7 +110,7 @@ handle_call({register, ClientId, Pid}, _From, State = #state{tab = Tab}) -> [{_, OldPid, MRef}] -> lager:error("clientId '~s' is duplicated: pid=~p, oldpid=~p", [ClientId, Pid, OldPid]), %%TODO: tell session old client is down here? - case emqttd_session:lookup(ClientId) of + case emqttd_sm:lookup_session(ClientId) of undefined -> ok; SessPid -> emqttd_session:client_down(SessPid, {OldPid, duplicate_id}) end, From e86f9ac6aaeeb3b2ffecccb0c3985e3d4350ee4f Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 00:55:56 +0800 Subject: [PATCH 08/14] fix duplicated session --- apps/emqttd/src/emqttd_cm.erl | 5 ---- apps/emqttd/src/emqttd_session.erl | 43 +++++++++++++----------------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/apps/emqttd/src/emqttd_cm.erl b/apps/emqttd/src/emqttd_cm.erl index 3dd0fcdf2..48f9bb79a 100644 --- a/apps/emqttd/src/emqttd_cm.erl +++ b/apps/emqttd/src/emqttd_cm.erl @@ -109,11 +109,6 @@ handle_call({register, ClientId, Pid}, _From, State = #state{tab = Tab}) -> ignore; [{_, OldPid, MRef}] -> lager:error("clientId '~s' is duplicated: pid=~p, oldpid=~p", [ClientId, Pid, OldPid]), - %%TODO: tell session old client is down here? - case emqttd_sm:lookup_session(ClientId) of - undefined -> ok; - SessPid -> emqttd_session:client_down(SessPid, {OldPid, duplicate_id}) - end, OldPid ! {stop, duplicate_id, Pid}, erlang:demonitor(MRef), ets:insert(Tab, {ClientId, Pid, erlang:monitor(process, Pid)}); diff --git a/apps/emqttd/src/emqttd_session.erl b/apps/emqttd/src/emqttd_session.erl index 77c0ae7a3..45681dcd9 100644 --- a/apps/emqttd/src/emqttd_session.erl +++ b/apps/emqttd/src/emqttd_session.erl @@ -42,7 +42,7 @@ -export([store/2]). %% Start gen_server --export([start_link/3, client_down/2]). +-export([start_link/3]). %% gen_server Function Exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -259,13 +259,6 @@ initial_state(ClientId, ClientPid) -> start_link(SessOpts, ClientId, ClientPid) -> gen_server:start_link(?MODULE, [SessOpts, ClientId, ClientPid], []). -%%------------------------------------------------------------------------------ -%% @doc Notify the session process that client will be DOWN. -%% @end -%%------------------------------------------------------------------------------ -client_down(SessPid, {ClientPid, Reason}) -> - gen_server:cast(SessPid, {'DOWN', ClientPid, Reason}). - %%%============================================================================= %%% gen_server callbacks %%%============================================================================= @@ -295,14 +288,27 @@ handle_call(Req, _From, State) -> handle_cast({resume, ClientId, ClientPid}, State = #session_state{ clientid = ClientId, - client_pid = undefined, + client_pid = OldClientPid, msg_queue = Queue, awaiting_ack = AwaitingAck, awaiting_comp = AwaitingComp, expire_timer = ETimer}) -> lager:info("Session ~s resumed by ~p", [ClientId, ClientPid]), - %cancel timeout timer - erlang:cancel_timer(ETimer), + + %% kick old client... + if + OldClientPid =:= undefined -> + ok; + OldClientPid =:= ClientPid -> + ok; + true -> + lager:error("Session '~s' is duplicated: pid=~p, oldpid=~p", [ClientId, ClientPid, OldClientPid]), + unlink(OldClientPid), + OldClientPid ! {stop, duplicate_id, ClientPid} + end, + + %% cancel timeout timer + emqttd_utils:cancel_timer(ETimer), %% redelivery PUBREL lists:foreach(fun(PacketId) -> @@ -348,17 +354,6 @@ handle_cast({destroy, ClientId}, State = #session_state{clientid = ClientId}) -> lager:warning("Session ~s destroyed", [ClientId]), {stop, normal, State}; -handle_cast({resume, ClientId, ClientPid}, State) -> - lager:error("Cannot resume session ~p with pid ~p: ~p", - [ClientId, ClientPid, State]), - {noreply, State}; - -handle_cast({'DOWN', ClientPid, Reason}, State = #session_state{clientid = ClientId, - client_pid = ClientPid}) -> - lager:error("Session: client ~s@~p is down for ~p", [ClientId, ClientPid, Reason]), - unlink(ClientPid), - {noreply, start_expire_timer(State#session_state{client_pid = undefined})}; - handle_cast(Msg, State) -> lager:critical("Unexpected Msg: ~p, State: ~p", [Msg, State]), {noreply, State}. @@ -375,8 +370,8 @@ handle_info({'EXIT', ClientPid, Reason}, State = #session_state{clientid = Clien lager:error("Session: client ~s@~p exited, caused by ~p", [ClientId, ClientPid, Reason]), {noreply, start_expire_timer(State#session_state{client_pid = undefined})}; -handle_info({'EXIT', ClientPid, _Reason}, State = #session_state{client_pid = OtherClientPid}) -> - lager:error("Unexpected Client EXIT: pid=~p, pid(state): ~p", [ClientPid, OtherClientPid]), +handle_info({'EXIT', ClientPid0, _Reason}, State = #session_state{client_pid = ClientPid}) -> + lager:error("Unexpected Client EXIT: pid=~p, pid(state): ~p", [ClientPid0, ClientPid]), {noreply, State}; handle_info(session_expired, State = #session_state{clientid = ClientId}) -> From 2f1ceca579d8c7ec4ce8bfcd9a48189de18331c3 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 11:15:48 +0800 Subject: [PATCH 09/14] 0.6.2 --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1500c4896..3332a4ac1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,15 @@ emqttd ChangeLog ================== -0.6.2-alpha (2015-04-23) +0.6.2-alpha (2015-04-24) ------------------------- Bugfix: critical issue #54, #104, #106 - error when resume session Improve: add emqttd_cm_sup module, and use 'hash' gproc_pool to register/unregister client ids +Improve: kick old client out when session is duplicated. + 0.6.1-alpha (2015-04-20) ------------------------- From 17b537b8c1289dc69267ddcc3b6d936d5d028310 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 11:52:17 +0800 Subject: [PATCH 10/14] fix mnesia dir --- rel/files/app.config | 3 --- rel/files/vm.args | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/rel/files/app.config b/rel/files/app.config index 86ef3a181..3fe141724 100644 --- a/rel/files/app.config +++ b/rel/files/app.config @@ -7,9 +7,6 @@ {sasl, [ {sasl_error_logger, {file, "log/emqttd_sasl.log"}} ]}, - {mnesia, [ - {dir, "data/mnesia"} - ]}, {ssl, [ %{versions, ['tlsv1.2', 'tlsv1.1']} ]}, diff --git a/rel/files/vm.args b/rel/files/vm.args index 4ff3744f2..19a9dbfa0 100644 --- a/rel/files/vm.args +++ b/rel/files/vm.args @@ -1,9 +1,20 @@ +##------------------------------------------------------------------------- ## Name of the node +##------------------------------------------------------------------------- -name emqttd@127.0.0.1 ## Cookie for distributed erlang -setcookie emqttdsecretcookie +##------------------------------------------------------------------------- +## Mnesia db +##------------------------------------------------------------------------- +-mnesia dir "data/mnesia/test" + +##------------------------------------------------------------------------- +## Flags +##------------------------------------------------------------------------- + ## Heartbeat management; auto-restarts VM if it dies or becomes unresponsive ## (Disabled by default..use with caution!) ##-heart @@ -16,6 +27,10 @@ ## max process numbers +P 1000000 +##------------------------------------------------------------------------- +## Env +##------------------------------------------------------------------------- + ## Increase number of concurrent ports/sockets -env ERL_MAX_PORTS 4096 From 0c2ef0533970d029634b331320ec3903686a29df Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 12:24:35 +0800 Subject: [PATCH 11/14] pid --- rel/files/app.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rel/files/app.config b/rel/files/app.config index 86ef3a181..a0650e360 100644 --- a/rel/files/app.config +++ b/rel/files/app.config @@ -19,7 +19,7 @@ {handlers, [ {lager_console_backend, info}, {lager_file_backend, [ - {formatter_config, [time, " [",severity,"] ", message, "\n"]}, + {formatter_config, [time, " ", pid, " [",severity,"] ", message, "\n"]}, {file, "log/emqttd_info.log"}, {level, info}, {size, 104857600}, @@ -27,7 +27,7 @@ {count, 10} ]}, {lager_file_backend, [ - {formatter_config, [time, " [",severity,"] ", message, "\n"]}, + {formatter_config, [time, " ", pid, " [",severity,"] ", message, "\n"]}, {file, "log/emqttd_error.log"}, {level, error}, {size, 10485760}, From 2f1c5c3948f0cba8540ce1d1cc976bff5ddc526d Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 12:46:22 +0800 Subject: [PATCH 12/14] -mnesia dir --- rel/files/vm.args | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rel/files/vm.args b/rel/files/vm.args index 19a9dbfa0..3e9784935 100644 --- a/rel/files/vm.args +++ b/rel/files/vm.args @@ -7,9 +7,9 @@ -setcookie emqttdsecretcookie ##------------------------------------------------------------------------- -## Mnesia db +## Mnesia dir. NOTICE: quote the dir with '" "' ##------------------------------------------------------------------------- --mnesia dir "data/mnesia/test" +-mnesia dir '"data/mnesia"' ##------------------------------------------------------------------------- ## Flags From 721d48857dd66b57a3cf8710e610446daa86f829 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 15:44:27 +0800 Subject: [PATCH 13/14] scripts --- scripts/mosquitto_test | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100755 scripts/mosquitto_test diff --git a/scripts/mosquitto_test b/scripts/mosquitto_test deleted file mode 100755 index d5a504134..000000000 --- a/scripts/mosquitto_test +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# -*- tab-width:4;indent-tabs-mode:nil -*- -# ex: ts=4 sw=4 et - -# slimple publish -mosquitto_pub -t xxx/yyy -m hello -if [ "$?" == 0 ]; then - echo "[Success]: slimple publish" -else - echo "[Failure]: slimple publish" -fi - -# publish will willmsg -mosquitto_pub -q 1 -t a/b/c -m hahah -u test -P public --will-topic /will --will-payload willmsg --will-qos 1 -if [ "$?" == 0 ]; then - echo "[Success]: publish with willmsg" -else - echo "[Failure]: publish with willmsg" -fi From b3bcfa90bc77d7045a4fc39fc02e11fb51b2b4a1 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 24 Apr 2015 15:56:10 +0800 Subject: [PATCH 14/14] 0.6.2 --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3332a4ac1..34bf9ca32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Improve: add emqttd_cm_sup module, and use 'hash' gproc_pool to register/unregis Improve: kick old client out when session is duplicated. +Improve: move mnesia dir config from etc/app.config to etc/vm.args + 0.6.1-alpha (2015-04-20) -------------------------