Managed problem of infinite consecutive errors
This commit is contained in:
parent
84592a6987
commit
70ab6cdd98
1
TODO.md
1
TODO.md
|
@ -1,4 +1,3 @@
|
||||||
TODO
|
TODO
|
||||||
=====
|
=====
|
||||||
- Fix problem of infinite consecutive errors.
|
|
||||||
- Limit number of emails that can be sent in a period of time.
|
- Limit number of emails that can be sent in a period of time.
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
-record(log, {file, error_regex}).
|
-record(log, {file, error_regex}).
|
||||||
-record(state_off, {log}).
|
-record(state_off, {log}).
|
||||||
-record(state_on, {log, error, until}).
|
-record(state_on, {log, error, until, max_until}).
|
||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% API
|
%%% API
|
||||||
|
@ -81,9 +81,14 @@ state_off({log_line, Text}, State = #state_off{log = Log}) ->
|
||||||
case isError(Text, Log#log.error_regex) of
|
case isError(Text, Log#log.error_regex) of
|
||||||
true ->
|
true ->
|
||||||
Timeout = timer_time(),
|
Timeout = timer_time(),
|
||||||
|
MaxTimeout = safe_timer_time(),
|
||||||
Now = to_milliseconds(os:timestamp()),
|
Now = to_milliseconds(os:timestamp()),
|
||||||
Until = Now + Timeout,
|
Until = Now + Timeout,
|
||||||
{next_state, state_on, #state_on{log = Log, error = Text, until = Until}, Timeout};
|
MaxUntil = Now + MaxTimeout,
|
||||||
|
{next_state,
|
||||||
|
state_on,
|
||||||
|
#state_on{log = Log, error = Text, until = Until, max_until = MaxUntil},
|
||||||
|
Timeout};
|
||||||
false -> {next_state, state_off, State}
|
false -> {next_state, state_off, State}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -102,17 +107,23 @@ state_off({log_line, Text}, State = #state_off{log = Log}) ->
|
||||||
%% {stop, Reason, NewState}
|
%% {stop, Reason, NewState}
|
||||||
%% @end
|
%% @end
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
state_on({log_line, Text}, #state_on{log = Log, error = Error, until = Until}) ->
|
state_on({log_line, Text}, #state_on{log = Log, error = Error, until = Until, max_until = MaxUntil}) ->
|
||||||
case isError(Text, Log#log.error_regex) of
|
case isError(Text, Log#log.error_regex) of
|
||||||
true ->
|
true ->
|
||||||
Timeout = timer_time(),
|
Timeout = timer_time(),
|
||||||
Now = to_milliseconds(os:timestamp()),
|
Now = to_milliseconds(os:timestamp()),
|
||||||
Until = Now + Timeout,
|
NewUntil = min(Now + Timeout, MaxUntil),
|
||||||
{next_state, state_on, #state_on{log = Log, error = Error ++ Text, until = Until}, Timeout};
|
{next_state,
|
||||||
|
state_on,
|
||||||
|
#state_on{log = Log, error = Error ++ Text, until = NewUntil, max_until = MaxUntil},
|
||||||
|
if MaxUntil > Now -> Timeout; true -> 0 end};
|
||||||
false ->
|
false ->
|
||||||
Now = to_milliseconds(os:timestamp()),
|
Now = to_milliseconds(os:timestamp()),
|
||||||
Timeout = Until - Now,
|
Timeout = Until - Now,
|
||||||
{next_state, state_on, #state_on{log = Log, error = Error ++ Text, until = Until}, Timeout}
|
{next_state,
|
||||||
|
state_on,
|
||||||
|
#state_on{log = Log, error = Error ++ Text, until = Until, max_until = MaxUntil},
|
||||||
|
Timeout}
|
||||||
end;
|
end;
|
||||||
state_on(timeout, #state_on{log = Log, error = Error, until = _}) ->
|
state_on(timeout, #state_on{log = Log, error = Error, until = _}) ->
|
||||||
mailer ! {error, Log#log.file, Error},
|
mailer ! {error, Log#log.file, Error},
|
||||||
|
|
Loading…
Reference in New Issue
Block a user