From 22619ffa8e0a388b7f770353e7b590615159f16f Mon Sep 17 00:00:00 2001 From: Matt Mullins Date: Sun, 3 Jan 2016 23:44:41 -0800 Subject: [PATCH] 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. --- irc/irc_amqp_listener.erl | 10 ++++++---- irc/irc_object_sup.erl | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) 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, -- 2.11.0