haproxy: properly close socket after query

This commit is contained in:
Timothée Floure 2022-02-23 17:44:56 +01:00
parent 0ec71ea8bb
commit e62aafd172
Signed by: tfloure
GPG Key ID: 4502C902C00A1E12
2 changed files with 12 additions and 5 deletions

View File

@ -70,7 +70,7 @@ defmodule HAHandler.Control do
{:secondary, "MAINT"} ->
:noop
unknown ->
Logger.warning("Unhandled PGSQL/HAProxy state: #{unknown}")
Logger.warning("Unhandled PGSQL/HAProxy state: #{inspect(unknown)}")
end
end

View File

@ -26,9 +26,13 @@ defmodule HAHandler.HAProxy do
"""
def execute(command) when is_binary(command) do
case open_socket(haproxy_socket()) do
{:ok, socket} ->
send(socket, {self(), {:command, command <> "\n"}})
read_from_socket(socket)
{:ok, fd, port} ->
send(port, {self(), {:command, command <> "\n"}})
data = read_from_socket(port)
# We need to be careful and always close file descriptors, as they can
# run out - which will block all operations.
close_socket(fd)
data
{:error, err} ->
{:error, err}
end
@ -158,13 +162,16 @@ defmodule HAHandler.HAProxy do
{fdin, fdout} = {socket, socket}
port = Port.open({:fd, fdin, fdout}, [{:line, 10_000}, :binary])
{:ok, port}
{:ok, socket, port}
{:error, err} ->
{:error, err}
end
end
# Close UNIX fd opened with `open_socket/1`.
defp close_socket(fd), do: Socket.close(fd)
# Messages may be split due to the `{:line, L}` option specific in
# `open_socket/1`.
defp read_from_socket(socket, acc \\ "") do