summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Klishin <michael@novemberain.com>2017-04-12 14:13:25 +0300
committerGitHub <noreply@github.com>2017-04-12 14:13:25 +0300
commitbafb80126c539e8d3c745622fbc5bebe8197439c (patch)
tree08fa32d92229c3d774826bd81e4142343bf4a4e9 /src
parentf0da42683f491b527cd3358c91c9370d8be3d5fd (diff)
parentc340c0d92aeba9f4b89f0e0e81e774393d3677c0 (diff)
downloadrabbitmq-server-git-bafb80126c539e8d3c745622fbc5bebe8197439c.tar.gz
Merge pull request #1179 from rabbitmq/rabbitmq-server-1178
Re-enable disk_monitor in case of parser failures
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_disk_monitor.erl45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/rabbit_disk_monitor.erl b/src/rabbit_disk_monitor.erl
index b2548cb61a..629228a1be 100644
--- a/src/rabbit_disk_monitor.erl
+++ b/src/rabbit_disk_monitor.erl
@@ -65,7 +65,12 @@
alarmed,
%% is monitoring enabled? false on unsupported
%% platforms
- enabled
+ enabled,
+ %% number of retries to enable monitoring if it fails
+ %% on start-up
+ retries,
+ %% Interval between retries
+ interval
}).
%%----------------------------------------------------------------------------
@@ -114,20 +119,17 @@ start_link(Args) ->
init([Limit]) ->
Dir = dir(),
+ {ok, Retries} = application:get_env(rabbit, disk_monitor_failure_retries),
+ {ok, Interval} = application:get_env(rabbit, disk_monitor_failure_retry_interval),
State = #state{dir = Dir,
min_interval = ?DEFAULT_MIN_DISK_CHECK_INTERVAL,
max_interval = ?DEFAULT_MAX_DISK_CHECK_INTERVAL,
alarmed = false,
- enabled = true},
- case {catch get_disk_free(Dir),
- vm_memory_monitor:get_total_memory()} of
- {N1, N2} when is_integer(N1), is_integer(N2) ->
- {ok, start_timer(set_disk_limits(State, Limit))};
- Err ->
- rabbit_log:info("Disabling disk free space monitoring "
- "on unsupported platform:~n~p~n", [Err]),
- {ok, State#state{enabled = false}}
- end.
+ enabled = true,
+ limit = Limit,
+ retries = Retries,
+ interval = Interval},
+ {ok, enable(State)}.
handle_call(get_disk_free_limit, _From, State = #state{limit = Limit}) ->
{reply, Limit, State};
@@ -161,6 +163,8 @@ handle_call(_Request, _From, State) ->
handle_cast(_Request, State) ->
{noreply, State}.
+handle_info(try_enable, #state{retries = Retries} = State) ->
+ {noreply, enable(State#state{retries = Retries - 1})};
handle_info(update, State) ->
{noreply, start_timer(internal_update(State))};
@@ -246,7 +250,7 @@ interpret_limit(Absolute) ->
emit_update_info(StateStr, CurrentFree, Limit) ->
rabbit_log:info(
- "Disk free space ~s. Free bytes:~p Limit:~p~n",
+ "Free disk space is ~s. Free bytes: ~p. Limit: ~p~n",
[StateStr, CurrentFree, Limit]).
start_timer(State) ->
@@ -261,3 +265,20 @@ interval(#state{limit = Limit,
max_interval = MaxInterval}) ->
IdealInterval = 2 * (Actual - Limit) / ?FAST_RATE,
trunc(erlang:max(MinInterval, erlang:min(MaxInterval, IdealInterval))).
+
+enable(#state{retries = 0} = State) ->
+ State;
+enable(#state{dir = Dir, interval = Interval, limit = Limit, retries = Retries}
+ = State) ->
+ case {catch get_disk_free(Dir),
+ vm_memory_monitor:get_total_memory()} of
+ {N1, N2} when is_integer(N1), is_integer(N2) ->
+ rabbit_log:info("Enabling free disk space monitoring~n", []),
+ start_timer(set_disk_limits(State, Limit));
+ Err ->
+ rabbit_log:info("Free disk space monitor encountered an error "
+ "(e.g. failed to parse output from OS tools): ~p, retries left: ~s~n",
+ [Err, Retries]),
+ timer:send_after(Interval, self(), try_enable),
+ State#state{enabled = false}
+ end.