summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-08-17 12:59:52 +0100
committerMatthew Sackman <matthew@lshift.net>2009-08-17 12:59:52 +0100
commit7665d669957721b0e1046116834928af696800fd (patch)
tree67d10559da16a4bbdfe07278704b35310c5f76ec
parent75dbcf5a4d97f568d1e2db4fb8ffaf88f876c1d2 (diff)
downloadrabbitmq-server-git-7665d669957721b0e1046116834928af696800fd.tar.gz
if memsup isn't runnig, we get back {0,0,undefined} from memsup:get_memory_data/0. Thus adjust maths to cope with this. In the absence of memsup, we don't hand out tokens at all, so everything stays in mixed mode all the time, and we can cheerfully run out of memory (another good reason for the manual pin_to_disk stuff).
-rw-r--r--src/rabbit_queue_mode_manager.erl9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/rabbit_queue_mode_manager.erl b/src/rabbit_queue_mode_manager.erl
index 22d858673a..fa3b27e93f 100644
--- a/src/rabbit_queue_mode_manager.erl
+++ b/src/rabbit_queue_mode_manager.erl
@@ -183,10 +183,13 @@ init([]) ->
%% todo, fix up this call as os_mon may not be running
{MemTotal, MemUsed, _BigProc} = memsup:get_memory_data(),
MemAvail = MemTotal - MemUsed,
+ TPB = if MemAvail == 0 -> 0;
+ true -> ?TOTAL_TOKENS / MemAvail
+ end,
{ok, #state { available_tokens = ?TOTAL_TOKENS,
mixed_queues = dict:new(),
callbacks = dict:new(),
- tokens_per_byte = ?TOTAL_TOKENS / MemAvail,
+ tokens_per_byte = TPB,
lowrate = priority_queue:new(),
hibernate = queue:new(),
disk_mode_pins = sets:new(),
@@ -350,7 +353,9 @@ code_change(_OldVsn, State, _Extra) ->
{ok, State}.
add_to_lowrate(Pid, Alloc, Lazy) ->
- Bucket = trunc(math:log(Alloc)), %% log base e
+ Bucket = if Alloc == 0 -> 0; %% can't take log(0)
+ true -> trunc(math:log(Alloc)) %% log base e
+ end,
priority_queue:in({Pid, Bucket, Alloc}, Bucket, Lazy).
find_queue(Pid, Mixed) ->