rate limit irc_amqp_listener restarts
authorMatt Mullins <mmullins@mmlx.us>
Mon, 4 Jan 2016 07:44:41 +0000 (23:44 -0800)
committerMatt Mullins <mmullins@mmlx.us>
Mon, 4 Jan 2016 07:44:41 +0000 (23:44 -0800)
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
irc/irc_object_sup.erl

index 35e6f5f..8801087 100644 (file)
@@ -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,
 -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}}.
 
index f76694d..1c633e6 100644 (file)
@@ -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,