From b38c2c8f67772f8260bfaa99ea110212b3a3df57 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Tue, 6 May 2014 17:30:38 +0200
Subject: inets: Correct distirbing mode for httpd:reload_config/2

config_reload tests are not enough to test httpd "block/unblock"
used by config_reload, so renable some test cases in the old_httpd_SUITE
after making them work with the new code. Should be cleaned up and moved
to httpd_SUITE.
---
 lib/inets/src/http_server/httpd.erl         | 12 ++++++----
 lib/inets/src/http_server/httpd_manager.erl | 36 ++++++++++++++---------------
 lib/inets/test/httpd_block.erl              |  6 ++---
 lib/inets/test/old_httpd_SUITE.erl          | 34 ++++++++++++++-------------
 4 files changed, 45 insertions(+), 43 deletions(-)

(limited to 'lib')

diff --git a/lib/inets/src/http_server/httpd.erl b/lib/inets/src/http_server/httpd.erl
index 6052ae9022..e8148ea362 100644
--- a/lib/inets/src/http_server/httpd.erl
+++ b/lib/inets/src/http_server/httpd.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
+%% Copyright Ericsson AB 1997-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
@@ -294,9 +294,13 @@ do_reload_config(ConfigList, Mode) ->
 	{ok, Config} ->
 	    Address = proplists:get_value(bind_address, Config, any), 
 	    Port    = proplists:get_value(port, Config, 80),
-	    block(Address, Port, Mode),
-	    reload(Config, Address, Port),
-	    unblock(Address, Port);
+	    case block(Address, Port, Mode) of
+		ok ->
+		    reload(Config, Address, Port),
+		    unblock(Address, Port);
+		Error ->
+		    Error
+	    end;
 	Error ->
 	    Error
     end.
diff --git a/lib/inets/src/http_server/httpd_manager.erl b/lib/inets/src/http_server/httpd_manager.erl
index e155498bb8..3da0343401 100644
--- a/lib/inets/src/http_server/httpd_manager.erl
+++ b/lib/inets/src/http_server/httpd_manager.erl
@@ -210,9 +210,10 @@ handle_call({block , Blocker, Mode, Timeout}, From,
 handle_call({block , _, _, _}, _, State) ->
     {reply, {error, blocked}, State};
 
-handle_call({unblock, Blocker}, _, #state{blocker_ref = {Blocker,_},
+handle_call({unblock, Blocker}, _, #state{blocker_ref = {Blocker, Monitor},
 					  admin_state = blocked} = State) ->
-    
+   
+    erlang:demonitor(Monitor),
     {reply, ok, 
      State#state{admin_state = unblocked, blocker_ref = undefined}};
 
@@ -247,37 +248,36 @@ handle_cast(Message, State) ->
 handle_info(connections_terminated, #state{admin_state = shutting_down,
 					   blocking_from = From} = State) ->
     gen_server:reply(From, ok),
-    {noreply, State#state{admin_state = blocked, blocking_from = undefined,
-			  blocker_ref = undefined}};
+    {noreply, State#state{admin_state = blocked, blocking_from = undefined}};
 handle_info(connections_terminated, State) ->
     {noreply, State};
 
-handle_info({block_timeout, non_disturbing}, 
+handle_info({block_timeout, non_disturbing, Blocker}, 
 	    #state{admin_state = shutting_down,
 		   blocking_from = From,
-		   blocker_ref = {_, Monitor}} = State) ->
+		   blocker_ref = {_, Monitor} = Blocker} = State) ->
     erlang:demonitor(Monitor),		  
     gen_server:reply(From, {error, timeout}),
     {noreply, State#state{admin_state = unblocked, blocking_from = undefined,
 			  blocker_ref = undefined}};
-handle_info({block_timeout, disturbing}, 
+handle_info({block_timeout, disturbing, Blocker}, 
 	    #state{admin_state = shutting_down,
 		   blocking_from = From,
-		   blocker_ref = {_, Monitor},
+		   blocker_ref = Blocker,
 		   connection_sup = Sup} = State) ->
     SupPid = whereis(Sup),
     shutdown_connections(SupPid),
-    erlang:demonitor(Monitor),		  
     gen_server:reply(From, ok),
-    {noreply, State#state{admin_state = blocked, blocker_ref = undefined,
+    {noreply, State#state{admin_state = blocked,
 			  blocking_from = undefined}};
 handle_info({block_timeout, _, _}, State) ->
     {noreply, State};	   
 
 handle_info({'DOWN', _, process, Pid, _Info}, 
 	    #state{admin_state = Admin,
-		   blocker_ref = {Pid, _}} = State) when 
+		   blocker_ref = {Pid, Monitor}} = State) when 
       Admin =/= unblocked ->
+    erlang:demonitor(Monitor),	
     {noreply, State#state{admin_state = unblocked,
 			  blocking_from = undefined,
 			  blocker_ref = undefined}};
@@ -333,18 +333,16 @@ handle_new_connection(_UsageState, _AdminState, State, _Handler) ->
 
 handle_block(disturbing, infinity, 
 	     #state{connection_sup = CSup,
-		    blocking_from = From,
-		    blocker_ref = {_, Monitor}} = State) ->
+		    blocking_from = From} = State) ->
     SupPid = whereis(CSup),
     shutdown_connections(SupPid),
-    erlang:demonitor(Monitor),		  
     gen_server:reply(From, ok),
-    {noreply, State#state{admin_state = blocked, blocker_ref = undefined,
+    {noreply, State#state{admin_state = blocked,
 			  blocking_from = undefined}};
-handle_block(disturbing, Timeout, #state{connection_sup = CSup} = State) ->
+handle_block(disturbing, Timeout, #state{connection_sup = CSup, blocker_ref = Blocker} = State) ->
     Manager = self(),
     spawn_link(fun() -> wait_for_shutdown(CSup, Manager) end),
-    erlang:send_after(Timeout, self(), {block_timeout, disturbing}),
+    erlang:send_after(Timeout, self(), {block_timeout, disturbing, Blocker}),
     {noreply, State#state{admin_state = shutting_down}};
 
 handle_block(non_disturbing, infinity, 
@@ -354,10 +352,10 @@ handle_block(non_disturbing, infinity,
     {noreply, State#state{admin_state = shutting_down}};
 
 handle_block(non_disturbing, Timeout,  
-	     #state{connection_sup = CSup} = State) ->
+	     #state{connection_sup = CSup, blocker_ref = Blocker} = State) ->
     Manager = self(),
     spawn_link(fun() -> wait_for_shutdown(CSup, Manager) end),
-    erlang:send_after(Timeout, self(), {block_timeout, non_disturbing}),
+    erlang:send_after(Timeout, self(), {block_timeout, non_disturbing, Blocker}),
     {noreply, State#state{admin_state = shutting_down}}.
     
 handle_reload(undefined, #state{config_file = undefined} = State) ->
diff --git a/lib/inets/test/httpd_block.erl b/lib/inets/test/httpd_block.erl
index 706d014bda..9790623b6f 100644
--- a/lib/inets/test/httpd_block.erl
+++ b/lib/inets/test/httpd_block.erl
@@ -111,8 +111,7 @@ block_disturbing_active_timeout_not_released(Type, Port, Host, Node) ->
     process_flag(trap_exit, true),
     Poller = long_poll(Type, Host, Port, Node, 200, 60000),
     ct:sleep(15000),
-    Blocker = blocker(Node, Host, Port, 50000),
-    await_normal_process_exit(Blocker, "blocker", 50000),
+    ok = httpd_block(undefined,  Port, disturbing, 50000),
     await_normal_process_exit(Poller, "poller", 30000),
     blocked = get_admin_state(Node, Host, Port),
     process_flag(trap_exit, false),
@@ -123,8 +122,7 @@ block_disturbing_active_timeout_released(Type, Port, Host, Node) ->
     process_flag(trap_exit, true),
     Poller = long_poll(Type, Host, Port, Node, 200, 40000),
     ct:sleep(5000),
-    Blocker = blocker(Node, Host, Port, 10000),
-    await_normal_process_exit(Blocker, "blocker", 15000),
+    ok = httpd_block(undefined,  Port, disturbing, 10000),
     await_suite_failed_process_exit(Poller, "poller", 40000, 
 					  connection_closed),
     blocked = get_admin_state(Node, Host, Port),
diff --git a/lib/inets/test/old_httpd_SUITE.erl b/lib/inets/test/old_httpd_SUITE.erl
index 3e1a1a3845..19c2bc129e 100644
--- a/lib/inets/test/old_httpd_SUITE.erl
+++ b/lib/inets/test/old_httpd_SUITE.erl
@@ -182,22 +182,24 @@ groups() ->
        %% ip_load_medium,
        %% ip_load_heavy, 
        %%ip_dos_hostname, 
-       ip_time_test
-       %% Replaced by load_config
-       %% ip_restart_no_block, 
-       %% ip_restart_disturbing_block,
-       %% ip_restart_non_disturbing_block,
-       %% ip_block_disturbing_idle, 
-       %% ip_block_non_disturbing_idle,
-       %% ip_block_503, 
-       %% ip_block_disturbing_active,
-       %% ip_block_non_disturbing_active,
-       %% ip_block_disturbing_active_timeout_not_released,
-       %% ip_block_disturbing_active_timeout_released,
-       %% ip_block_non_disturbing_active_timeout_not_released,
-       %% ip_block_non_disturbing_active_timeout_released,
-       %% ip_block_disturbing_blocker_dies,
-       %% ip_block_non_disturbing_blocker_dies
+       ip_time_test,
+       %% Only used through load_config
+       %% but we still need these tests
+       %% should be cleaned up and moved to new test suite 
+       ip_restart_no_block, 
+       ip_restart_disturbing_block,
+       ip_restart_non_disturbing_block,
+       ip_block_disturbing_idle, 
+       ip_block_non_disturbing_idle,
+       ip_block_503, 
+       ip_block_disturbing_active,
+       ip_block_non_disturbing_active,
+       ip_block_disturbing_active_timeout_not_released,
+       ip_block_disturbing_active_timeout_released,
+       ip_block_non_disturbing_active_timeout_not_released,
+       ip_block_non_disturbing_active_timeout_released,
+       ip_block_disturbing_blocker_dies,
+       ip_block_non_disturbing_blocker_dies
       ]},
      {ssl, [], [{group, essl}]},
      {essl, [],
-- 
cgit v1.2.3