summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-08-03 17:04:04 +0100
committerMatthew Sackman <matthew@lshift.net>2009-08-03 17:04:04 +0100
commitefdc4896f7b14cb6a637ea8c42c813db6edbf182 (patch)
treee8a535b78c53d3dd2d146c888ce342844007e096
parentbe327931a5ef997ff18c4651072a238de303d41d (diff)
downloadrabbitmq-server-efdc4896f7b14cb6a637ea8c42c813db6edbf182.tar.gz
The bug was not as advertised (it actually popped up when merging into 20980). However, we should definitely make sure we receive at least 1 msg when coming out of hibernate, and in loop we don't care too much. Also, use now() to seed the rng as erlang doesn't do it for you (rng state is implicitly per process).
-rw-r--r--src/gen_server2.erl15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/gen_server2.erl b/src/gen_server2.erl
index 63b1d908..fc528b4d 100644
--- a/src/gen_server2.erl
+++ b/src/gen_server2.erl
@@ -436,6 +436,7 @@ unregister_name(Pid) when is_pid(Pid) ->
extend_backoff(Mod, {backoff, CurrentTO, MinimumTimeout, DesiredHibPeriod}) ->
Pre = erlang:function_exported(Mod, handle_pre_hibernate, 1),
Post = erlang:function_exported(Mod, handle_post_hibernate, 1),
+ random:seed(now()), %% call before we get into the loop
{backoff, CurrentTO, MinimumTimeout, DesiredHibPeriod, Pre, Post}.
%%%========================================================================
@@ -449,11 +450,15 @@ loop(Parent, Name, State, Mod, hibernate, undefined, Queue, Debug) ->
[Parent, Name, State, Mod, undefined, Queue, Debug]);
loop(Parent, Name, State, Mod, Time, TimeoutState, Queue, Debug) ->
process_next_msg(Parent, Name, State, Mod, Time, TimeoutState,
- drain(Queue), Debug).
+ drain(Queue, false), Debug).
-drain(Queue) ->
+drain(Queue, true) ->
receive
- Input -> drain(in(Input,Queue))
+ Input -> drain(in(Input, Queue), false)
+ end;
+drain(Queue, false) ->
+ receive
+ Input -> drain(in(Input, Queue), false)
after 0 -> Queue
end.
@@ -490,11 +495,11 @@ process_next_msg(Parent, Name, State, Mod, Time, TimeoutState, Queue, Debug) ->
wake_hib(Parent, Name, State, Mod, TimeoutState, Queue, Debug) ->
process_next_msg(Parent, Name, State, Mod, hibernate, TimeoutState,
- drain(Queue), Debug).
+ drain(Queue, true), Debug).
wake_hib(Parent, Name, State, Mod, SleptAt, TimeoutState, Queue, Debug) ->
backoff_post_hibernate(Parent, Name, State, Mod, SleptAt, now(),
- TimeoutState, drain(Queue), Debug).
+ TimeoutState, drain(Queue, true), Debug).
backoff_pre_hibernate(Parent, Name, State, Mod, TimeoutState =
{backoff, _Current, _Minimum, _Desired, Pre, _Post},