aboutsummaryrefslogtreecommitdiffstats
path: root/lib/diameter
diff options
context:
space:
mode:
authorAnders Svensson <[email protected]>2013-01-24 16:16:05 +0100
committerAnders Svensson <[email protected]>2013-02-08 15:28:56 +0100
commit34b008c323591b0c02f42287c86b9a788aab51ad (patch)
tree566c448d20c5cf0216d1c445b5189019a2ab4c9a /lib/diameter
parent74755d8d18aa1769840b0914fe73e9c5c4b3219b (diff)
downloadotp-34b008c323591b0c02f42287c86b9a788aab51ad.tar.gz
otp-34b008c323591b0c02f42287c86b9a788aab51ad.tar.bz2
otp-34b008c323591b0c02f42287c86b9a788aab51ad.zip
Simplify transport shutdown
Service process informs the watchdog process which informs the peer process. (Instead of going directly to the latter in one case.)
Diffstat (limited to 'lib/diameter')
-rw-r--r--lib/diameter/src/base/diameter_peer_fsm.erl2
-rw-r--r--lib/diameter/src/base/diameter_service.erl48
-rw-r--r--lib/diameter/src/base/diameter_watchdog.erl16
3 files changed, 24 insertions, 42 deletions
diff --git a/lib/diameter/src/base/diameter_peer_fsm.erl b/lib/diameter/src/base/diameter_peer_fsm.erl
index 5dab6214b1..b515a599ed 100644
--- a/lib/diameter/src/base/diameter_peer_fsm.erl
+++ b/lib/diameter/src/base/diameter_peer_fsm.erl
@@ -393,8 +393,6 @@ transition({send, Msg}, #state{transport = TPid}) ->
%% Request for graceful shutdown at remove_transport, stop_service of
%% application shutdown.
-transition({shutdown = T, Pid}, S) ->
- transition({T, Pid, transport}, S);
transition({shutdown, Pid, Reason}, #state{parent = Pid, dpr = false} = S) ->
dpr(Reason, S);
transition({shutdown, Pid, _}, #state{parent = Pid}) ->
diff --git a/lib/diameter/src/base/diameter_service.erl b/lib/diameter/src/base/diameter_service.erl
index 4e6cb3cd79..d01a5e5ab6 100644
--- a/lib/diameter/src/base/diameter_service.erl
+++ b/lib/diameter/src/base/diameter_service.erl
@@ -716,46 +716,30 @@ mod_state(Alias, ModS) ->
%%% # shutdown/2
%%% ---------------------------------------------------------------------------
-%% remove_transport: ask watchdogs to terminate their transport.
+%% remove_transport
shutdown(Refs, #state{peerT = PeerT})
when is_list(Refs) ->
- ets:foldl(fun(P,ok) -> sp(P, Refs), ok end, ok, PeerT);
+ ets:foldl(fun(P,ok) -> st(P, Refs), ok end, ok, PeerT);
-%% application/service shutdown: ask transports to terminate themselves.
-shutdown(Reason, #state{peerT = PeerT}) ->
- %% A transport might not be alive to receive the shutdown request
- %% but give those that are a chance to shutdown gracefully.
- shutdown(conn, Reason, PeerT),
- %% Kill the watchdogs explicitly in case there was no transport.
- shutdown(peer, Reason, PeerT).
+%% application/service shutdown
+shutdown(Reason, #state{peerT = PeerT})
+ when Reason == application;
+ Reason == service ->
+ diameter_lib:wait(ets:foldl(fun(P,A) -> st(P, Reason, A) end,
+ [],
+ PeerT)).
-%% sp/2
+%% st/2
-sp(#peer{ref = Ref, pid = Pid}, Refs) ->
+st(#peer{ref = Ref, pid = Pid}, Refs) ->
lists:member(Ref, Refs)
- andalso (Pid ! {shutdown, self()}). %% 'DOWN' cleans up
-
-%% shutdown/3
-
-shutdown(Who, Reason, T) ->
- diameter_lib:wait(ets:foldl(fun(X,A) -> shutdown(Who, X, Reason, A) end,
- [],
- T)).
+ andalso (Pid ! {shutdown, self(), transport}). %% 'DOWN' cleans up
-shutdown(conn,
- #peer{pid = Pid, op_state = {?STATE_UP, _}, conn = TPid},
- Reason,
- Acc) ->
- TPid ! {shutdown, Pid, Reason},
- [TPid | Acc];
+%% st/3
-shutdown(peer, #peer{pid = Pid}, _Reason, Acc)
- when is_pid(Pid) ->
- exit(Pid, shutdown),
- [Pid | Acc];
-
-shutdown(_, #peer{}, _, Acc) ->
- Acc.
+st(#peer{pid = Pid}, Reason, Acc) ->
+ Pid ! {shutdown, self(), Reason},
+ [Pid | Acc].
%%% ---------------------------------------------------------------------------
%%% # call_service/2
diff --git a/lib/diameter/src/base/diameter_watchdog.erl b/lib/diameter/src/base/diameter_watchdog.erl
index ad4a142f76..49b6776a84 100644
--- a/lib/diameter/src/base/diameter_watchdog.erl
+++ b/lib/diameter/src/base/diameter_watchdog.erl
@@ -208,15 +208,15 @@ transition(close, #watchdog{}) ->
ok;
%% Service is asking for the peer to be taken down gracefully.
-transition({shutdown, Pid}, #watchdog{parent = Pid,
- transport = undefined,
- status = S}) ->
- down = S, %% sanity check
+transition({shutdown, Pid, _}, #watchdog{parent = Pid,
+ transport = undefined,
+ status = S}) ->
+ down = S, %% assert
stop;
-transition({shutdown = T, Pid}, #watchdog{parent = Pid,
- transport = TPid}
- = S) ->
- TPid ! {T, self()},
+transition({shutdown = T, Pid, Reason}, #watchdog{parent = Pid,
+ transport = TPid}
+ = S) ->
+ TPid ! {T, self(), Reason},
S#watchdog{shutdown = true};
%% Parent process has died,