From: Matt Mullins Date: Mon, 4 Jan 2016 07:44:41 +0000 (-0800) Subject: rate limit irc_amqp_listener restarts X-Git-Tag: v15~3 X-Git-Url: http://git.mmlx.us/?a=commitdiff_plain;h=22619ffa8e0a388b7f770353e7b590615159f16f;p=erlbot.git rate limit irc_amqp_listener restarts This protects the irc_net_sup (and thus irc_conn) from restarting if the amqp application processes are currently unavailable - i.e. while they're waiting on their own rate limits. --- diff --git a/irc/irc_amqp_listener.erl b/irc/irc_amqp_listener.erl index 35e6f5f..8801087 100644 --- a/irc/irc_amqp_listener.erl +++ b/irc/irc_amqp_listener.erl @@ -5,9 +5,10 @@ -vsn(3). -define(EXCHANGE, <<"irc">>). +-define(TIMEOUT, timer:seconds(30)). -export([ - start_link/2, + start_link/3, stop/1, encode_routing_key/1, decode_routing_key/1, @@ -25,11 +26,12 @@ -include("irc_util.hrl"). -include_lib("amqp_client/include/amqp_client.hrl"). -start_link(ConnectionPid, RoutingKey) -> - gen_server:start_link(?MODULE, {ConnectionPid, RoutingKey}, []). +start_link(ConnectionPid, RoutingKey, TableId) -> + gen_server:start_link(?MODULE, {ConnectionPid, RoutingKey, TableId}, []). -init({ConnectionPid, RoutingKey}) -> +init({ConnectionPid, RoutingKey, TableId}) -> process_flag(trap_exit, true), + rate_limit:wait_and_reset(TableId, irc_amqp_listener, ?TIMEOUT), {ok, _, ListeningChannel} = amqp_bot_listener:listen_for_events(RoutingKey), {ok, {ConnectionPid, ListeningChannel}}. diff --git a/irc/irc_object_sup.erl b/irc/irc_object_sup.erl index f76694d..1c633e6 100644 --- a/irc/irc_object_sup.erl +++ b/irc/irc_object_sup.erl @@ -21,8 +21,9 @@ init({_Instance, _Supervisor, _TableId}) -> {ok, {RestartStrategy, Children}}. add_amqp_listener(ObjectSup, ConnectionPid, RoutingKey) -> + TableId = rate_limit:create(), Child = {"amqp_" ++ RoutingKey, - {irc_amqp_listener, start_link, [ConnectionPid, RoutingKey]}, + {irc_amqp_listener, start_link, [ConnectionPid, RoutingKey, TableId]}, transient, 200, worker,