From 9d71674251e904efbe159ceb4f7049fedf12d26f Mon Sep 17 00:00:00 2001
From: Anders Svensson <anders@erlang.org>
Date: Sun, 18 May 2014 09:33:18 +0200
Subject: Comment fix

---
 lib/diameter/test/diameter_dpr_SUITE.erl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

(limited to 'lib/diameter')

diff --git a/lib/diameter/test/diameter_dpr_SUITE.erl b/lib/diameter/test/diameter_dpr_SUITE.erl
index 9252650bf7..f3f16b06e0 100644
--- a/lib/diameter/test/diameter_dpr_SUITE.erl
+++ b/lib/diameter/test/diameter_dpr_SUITE.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 2012. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2014. All Rights Reserved.
 %%
 %% The contents of this file are subject to the Erlang Public License,
 %% Version 1.1, (the "License"); you may not use this file except in
@@ -73,7 +73,7 @@
 %% Valid values for Disconnect-Cause.
 -define(CAUSES, [0, rebooting, 1, busy, 2, goaway]).
 
-%% Establish one client connection for element of this list,
+%% Establish one client connection for each element of this list,
 %% configured with disconnect/5 as disconnect_cb and returning the
 %% specified value.
 -define(RETURNS,
@@ -129,8 +129,8 @@ stop_service(Config) ->
     service == group(Config)
         andalso (ok = diameter:stop_service(?CLIENT)).
 
-%% Check for callbacks and stop the service. (Not the other way around
-%% for the timing reason explained below.)
+%% Check for callbacks before diameter:stop/0, not the other way around
+%% for the timing reason explained below.
 check(Config) ->
     Grp = group(Config),
     [Pid | Refs] = ?util:read_priv(Config, config),
-- 
cgit v1.2.3


From 089267c646e3cc8441383602573660a72735bd50 Mon Sep 17 00:00:00 2001
From: Anders Svensson <anders@erlang.org>
Date: Sun, 18 May 2014 09:45:30 +0200
Subject: Add check that request table is empty to failover suite

The way in which this suite causes transport connections to be broken -
by stopping the service - makes it prone to orphaning entries in the
request table, which is a bug we're about to fix.
---
 lib/diameter/test/diameter_failover_SUITE.erl | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

(limited to 'lib/diameter')

diff --git a/lib/diameter/test/diameter_failover_SUITE.erl b/lib/diameter/test/diameter_failover_SUITE.erl
index dfd3253827..c1494dcdb1 100644
--- a/lib/diameter/test/diameter_failover_SUITE.erl
+++ b/lib/diameter/test/diameter_failover_SUITE.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
 %%
 %% The contents of this file are subject to the Erlang Public License,
 %% Version 1.1, (the "License"); you may not use this file except in
@@ -47,6 +47,7 @@
          send_discard_1/1,
          send_discard_2/1,
          stop_services/1,
+         empty/1,
          stop/1]).
 
 %% diameter callbacks
@@ -121,6 +122,7 @@ all() ->
      send_discard_1,
      send_discard_2,
      stop_services,
+     empty,
      stop].
 
 %% ===========================================================================
@@ -147,6 +149,10 @@ stop_services(_Config) ->
                    T <- [diameter:stop_service(H)],
                    T /= ok].
 
+%% Ensure transports have been removed from request table.
+empty(_Config) ->
+    [] = ets:tab2list(diameter_request).
+
 stop(_Config) ->
     ok = diameter:stop().
 
-- 
cgit v1.2.3


From a8f56846ab342d85a6d6e72f9ba129c8a7f0c1bf Mon Sep 17 00:00:00 2001
From: Anders Svensson <anders@erlang.org>
Date: Sun, 18 May 2014 02:03:44 +0200
Subject: Fix leaking request table

A new connection writes the pid to the table diameter_request. The
normal handling is that loss of a connection leads to a watchdog state
change in the service process, which removes the entry, but this usually
won't happen in the case of diameter:stop_service/1 since the service
process is terminated without waiting for watchdog transitions.

The request table should really be service-specific, so that the table
is deleted when the service is stopped, which requires passing the table
identifier into request processes and handling that the table may not
exist. Just clear out the service-specific entries at service process
termination for now.
---
 lib/diameter/src/base/diameter_service.erl | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

(limited to 'lib/diameter')

diff --git a/lib/diameter/src/base/diameter_service.erl b/lib/diameter/src/base/diameter_service.erl
index 70e66537ed..195d4404cd 100644
--- a/lib/diameter/src/base/diameter_service.erl
+++ b/lib/diameter/src/base/diameter_service.erl
@@ -499,9 +499,21 @@ transition(Req, S) ->
 %% # terminate/2
 %% ---------------------------------------------------------------------------
 
-terminate(Reason, #state{service_name = Name} = S) ->
+terminate(Reason, #state{service_name = Name, peerT = PeerT} = S) ->
     send_event(Name, stop),
     ets:delete(?STATE_TABLE, Name),
+
+    %% Communicate pending loss of any peers that connection_down/3
+    %% won't. This is needed when stopping a service since we don't
+    %% wait for watchdog state changes to take care of if. That this
+    %% takes place after deleting the state entry ensures that the
+    %% resulting failover by request processes accomplishes nothing.
+    ets:foldl(fun(#peer{pid = TPid}, _) ->
+                      diameter_traffic:peer_down(TPid)
+              end,
+              ok,
+              PeerT),
+
     shutdown == Reason  %% application shutdown
         andalso shutdown(application, S).
 
-- 
cgit v1.2.3