Make sure we don't subscribe multiple times Check there is no subscription from given Pid in subscribe_for_changes
COUCHDB-3102 Project: http://git-wip-us.apache.org/repos/asf/couchdb-config/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-config/commit/f56890f3 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-config/tree/f56890f3 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-config/diff/f56890f3 Branch: refs/heads/master Commit: f56890f3ac808c4b362647fe891ff1c2e2b71686 Parents: f09a2eb Author: ILYA Khlopotov <iil...@ca.ibm.com> Authored: Fri Aug 19 15:44:55 2016 -0700 Committer: ILYA Khlopotov <iil...@ca.ibm.com> Committed: Fri Aug 19 15:44:55 2016 -0700 ---------------------------------------------------------------------- src/config_notifier.erl | 13 +++++++++++-- test/config_tests.erl | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-config/blob/f56890f3/src/config_notifier.erl ---------------------------------------------------------------------- diff --git a/src/config_notifier.erl b/src/config_notifier.erl index c1844e7..52fc4c0 100644 --- a/src/config_notifier.erl +++ b/src/config_notifier.erl @@ -33,8 +33,13 @@ subscribe(Subscription) -> subscribe(self(), Subscription). subscribe(Subscriber, Subscription) -> - gen_event:add_sup_handler( - config_event, {?MODULE, Subscriber}, {Subscriber, Subscription}). + case lists:member(Subscriber, handlers()) of + true -> + ok; + false -> + gen_event:add_sup_handler( + config_event, {?MODULE, Subscriber}, {Subscriber, Subscription}) + end. init({Subscriber, Subscription}) -> {ok, {Subscriber, Subscription}}. @@ -66,3 +71,7 @@ maybe_notify({config_change, Sec, Key, _, _} = Event, Subscriber, Subscription) should_notify(Sec, Key, Subscription) -> lists:any(fun(S) -> S =:= Sec orelse S =:= {Sec, Key} end, Subscription). + +handlers() -> + AllHandlers = gen_event:which_handlers(config_event), + [Id || {?MODULE, Id} <- AllHandlers]. http://git-wip-us.apache.org/repos/asf/couchdb-config/blob/f56890f3/test/config_tests.erl ---------------------------------------------------------------------- diff --git a/test/config_tests.erl b/test/config_tests.erl index 854e20e..d3464e1 100644 --- a/test/config_tests.erl +++ b/test/config_tests.erl @@ -271,7 +271,8 @@ config_notifier_behaviour_test_() -> {[{"section_foo", "key_bar"}], fun should_notify/2}, {["section_foo"], fun should_not_notify/2}, {[{"section_foo", "key_bar"}], fun should_not_notify/2}, - {all, fun should_unsubscribe_when_subscriber_gone/2} + {all, fun should_unsubscribe_when_subscriber_gone/2}, + {all, fun should_not_add_duplicate/2} ] } }. @@ -585,6 +586,20 @@ should_unsubscribe_when_subscriber_gone(_Subscription, Pid) -> ok end). +should_not_add_duplicate(_, _) -> + ?_test(begin + ?assertEqual(1, n_notifiers()), %% spawned from setup + + ?assertMatch(ok, config:subscribe_for_changes(all)), + + ?assertEqual(2, n_notifiers()), + + ?assertMatch(ok, config:subscribe_for_changes(all)), + + ?assertEqual(2, n_notifiers()), + ok + end). + spawn_config_listener() -> Self = self(),