From 504860f065a889584b0e7b52e3f06cfa486723ac Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 22 May 2017 11:29:53 +0300 Subject: [PATCH] Don't leak with UDP sockets --- src/mod_metrics.erl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mod_metrics.erl b/src/mod_metrics.erl index 450fe4141..8906ef32e 100644 --- a/src/mod_metrics.erl +++ b/src/mod_metrics.erl @@ -41,6 +41,7 @@ remove_user/2, register_user/2]). -define(SOCKET_NAME, mod_metrics_udp_socket). +-define(SOCKET_REGISTER_RETRIES, 10). %%==================================================================== %% API @@ -139,7 +140,7 @@ send_metrics(Host, Probe, Peer, Port) -> [Node|_] = binary:split(FQDN, <<".">>), BaseId = <>, TS = integer_to_binary(p1_time_compat:system_time(seconds)), - case get_socket() of + case get_socket(?SOCKET_REGISTER_RETRIES) of {ok, Socket} -> case Probe of {Key, Val} -> @@ -156,15 +157,16 @@ send_metrics(Host, Probe, Peer, Port) -> Err end. -get_socket() -> +get_socket(N) -> case whereis(?SOCKET_NAME) of undefined -> case gen_udp:open(0) of {ok, Socket} -> try register(?SOCKET_NAME, Socket) of true -> {ok, Socket} - catch _:badarg -> - {ok, Socket} + catch _:badarg when N > 1 -> + gen_udp:close(Socket), + get_socket(N-1) end; {error, Reason} = Err -> ?ERROR_MSG("can not open udp socket to grapherl: ~s",