Unregister a timer for deleted meters
diff --git a/src/folsom_ets.erl b/src/folsom_ets.erl
index ac0365e..65f1678 100644
--- a/src/folsom_ets.erl
+++ b/src/folsom_ets.erl
@@ -251,10 +251,12 @@
true = ets:delete(?FOLSOM_TABLE, Name),
ok;
delete_metric(Name, meter) ->
+ ok = folsom_meter_timer_server:unregister(Name),
true = ets:delete(?METER_TABLE, Name),
true = ets:delete(?FOLSOM_TABLE, Name),
ok;
delete_metric(Name, meter_reader) ->
+ ok = folsom_meter_timer_server:unregister(Name),
true = ets:delete(?METER_READER_TABLE, Name),
true = ets:delete(?FOLSOM_TABLE, Name),
ok;
diff --git a/src/folsom_meter_timer_server.erl b/src/folsom_meter_timer_server.erl
index 5a38c07..c6043a1 100644
--- a/src/folsom_meter_timer_server.erl
+++ b/src/folsom_meter_timer_server.erl
@@ -28,7 +28,7 @@
-behaviour(gen_server).
%% API
--export([start_link/0, register/2, dump/0]).
+-export([start_link/0, register/2, unregister/1, dump/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -98,6 +98,15 @@
#state{registered_timers = NewList}
end,
{reply, ok, NewState};
+handle_call({unregister, Name}, _From, State) ->
+ NewState = case proplists:is_defined(Name, State#state.registered_timers) of
+ true ->
+ Ref = proplists:get_value(Name, State#state.registered_timers),
+ {ok, cancel} = timer:cancel(Ref),
+ #state{registered_timers = proplists:delete(Name, State#state.registered_timers)};
+ false -> State
+ end,
+ {reply, ok, NewState};
handle_call(dump, _From, State) ->
{reply, State, State}.
@@ -160,5 +169,8 @@
register(Name, Module) ->
gen_server:call(?SERVER, {register, Name, Module}).
+unregister(Name) ->
+ gen_server:call(?SERVER, {unregister, Name}).
+
dump() ->
gen_server:call(?SERVER, dump).
diff --git a/test/folsom_erlang_checks.erl b/test/folsom_erlang_checks.erl
index 87462a1..80271d1 100644
--- a/test/folsom_erlang_checks.erl
+++ b/test/folsom_erlang_checks.erl
@@ -67,7 +67,7 @@
ok = folsom_metrics:new_spiral(spiral),
?debugFmt("ensuring meter tick is registered with gen_server~n", []),
- ok = ensure_meter_tick_exists(),
+ ok = ensure_meter_tick_exists(2),
?debugFmt("ensuring multiple timer registrations dont cause issues", []),
ok = folsom_meter_timer_server:register(meter, folsom_metrics_meter),
@@ -220,6 +220,8 @@
ok = folsom_metrics:delete_metric(timed),
ok = folsom_metrics:delete_metric(testcounter),
+ ok = ensure_meter_tick_exists(2),
+
1 = length(ets:tab2list(?METER_TABLE)),
ok = folsom_metrics:delete_metric(meter),
0 = length(ets:tab2list(?METER_TABLE)),
@@ -228,6 +230,8 @@
ok = folsom_metrics:delete_metric(meter_reader),
0 = length(ets:tab2list(?METER_READER_TABLE)),
+ ok = ensure_meter_tick_exists(0),
+
ok = folsom_metrics:delete_metric(duration),
ok = folsom_metrics:delete_metric(spiral),
@@ -259,9 +263,9 @@
0 = Result.
-ensure_meter_tick_exists() ->
+ensure_meter_tick_exists(MeterCnt) ->
{state, State} = folsom_meter_timer_server:dump(),
- 2 = length(State),
+ MeterCnt = length(State),
ok.
%% internal function