diff --git a/VERSION b/VERSION index 852ed67c..6f182425 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.18 +1.1.21 diff --git a/lib/supavisor/client_handler.ex b/lib/supavisor/client_handler.ex index c7851b04..d2d3977d 100644 --- a/lib/supavisor/client_handler.ex +++ b/lib/supavisor/client_handler.ex @@ -35,6 +35,7 @@ defmodule Supavisor.ClientHandler do def init(ref, trans, opts) do Process.flag(:trap_exit, true) + H.set_max_heap_size(150) {:ok, sock} = :ranch.handshake(ref) :ok = trans.setopts(sock, active: true) @@ -526,12 +527,21 @@ defmodule Supavisor.ClientHandler do :ok end - def terminate(_reason, _state, %{db_pid: {_, pid}}) do - if Db.get_state(pid) == :busy, do: Db.stop(pid) + def terminate(reason, _state, %{db_pid: {_, pid}}) do + if Db.get_state(pid) == :busy do + Logger.warning("Kill DbHandler #{inspect(pid)}, reason #{inspect(reason)}") + Db.stop(pid) + else + Logger.warning("ClientHanlder termination with reason #{inspect(reason)}") + end + :ok end - def terminate(_reason, _state, _data), do: :ok + def terminate(reason, _state, _data) do + Logger.warning("ClientHanlder termination with reason #{inspect(reason)}") + :ok + end ## Internal functions diff --git a/lib/supavisor/db_handler.ex b/lib/supavisor/db_handler.ex index 7c1156eb..eee3e45b 100644 --- a/lib/supavisor/db_handler.ex +++ b/lib/supavisor/db_handler.ex @@ -35,6 +35,8 @@ defmodule Supavisor.DbHandler do @impl true def init(args) do Process.flag(:trap_exit, true) + H.set_max_heap_size(150) + {_, tenant} = args.tenant Logger.metadata(project: tenant, user: args.user, mode: args.mode) @@ -384,7 +386,7 @@ defmodule Supavisor.DbHandler do Logger.error("Client handler #{inspect(pid)} went down with reason #{inspect(reason)}") end - if state == :busy do + if state == :busy || data.mode == :session do :ok = sock_send(data.sock, <>) :ok = :gen_tcp.close(elem(data.sock, 1)) {:stop, :normal, data} diff --git a/lib/supavisor/helpers.ex b/lib/supavisor/helpers.ex index 8cc295c2..d23108ae 100644 --- a/lib/supavisor/helpers.ex +++ b/lib/supavisor/helpers.ex @@ -330,4 +330,17 @@ defmodule Supavisor.Helpers do kind, reason -> {:error, {:badrpc, {kind, reason}}} end end + + @doc """ + Sets the maximum heap size for the current process. The `max_heap_size` parameter is in megabytes. + + ## Parameters + + - `max_heap_size`: The maximum heap size in megabytes. + """ + @spec set_max_heap_size(pos_integer()) :: map() + def set_max_heap_size(max_heap_size) do + max_heap_words = div(max_heap_size * 1024 * 1024, :erlang.system_info(:wordsize)) + Process.flag(:max_heap_size, %{size: max_heap_words}) + end end