Ignore code server error logs when checking for modules (#1971)

This commit is contained in:
Jonatan Kłosko 2023-06-09 01:04:51 +02:00 committed by GitHub
parent 57bd761b74
commit c383c7aaff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 1 deletions

View file

@ -15,4 +15,18 @@ defmodule Livebook.Runtime.ErlDist.LoggerGLHandler do
def async_io(device, output) when is_pid(device) do
send(device, {:io_request, self(), make_ref(), {:put_chars, :unicode, output}})
end
@doc false
def filter_code_server_logs(%{meta: meta} = event, _) do
# When checking if a miscapitalized module, such as Io, is loaded,
# :code_server logs an error message on a case insensitive file
# system "Error loading module 'Elixir.Io'". We want to ignore
# such logs
if Process.whereis(:code_server) == meta.pid do
:stop
else
event
end
end
end

View file

@ -99,7 +99,11 @@ defmodule Livebook.Runtime.ErlDist.NodeManager do
# TODO: remove logger backend once we require Elixir v1.15
if Code.ensure_loaded?(Logger) and function_exported?(Logger, :add_handlers, 1) do
:logger.add_handler(:livebook_gl_handler, Livebook.Runtime.ErlDist.LoggerGLHandler, %{
formatter: Logger.Formatter.new()
formatter: Logger.Formatter.new(),
filters: [
code_server_logs:
{&Livebook.Runtime.ErlDist.LoggerGLHandler.filter_code_server_logs/2, nil}
]
})
else
Logger.add_backend(Livebook.Runtime.ErlDist.LoggerGLBackend)

View file

@ -166,6 +166,21 @@ defmodule Livebook.Runtime.ErlDist.RuntimeServerTest do
assert_receive {:runtime_intellisense_response, ^ref, ^request,
%{items: [%{label: "bright/0"}]}}
end
@tag capture_log: true
test "ignores code server error logs when loading mistyped module", %{pid: pid} do
RuntimeServer.evaluate_code(pid, :elixir, "", {:c1, :e1}, [])
assert_receive {:runtime_evaluation_response, :e1, _, %{evaluation_time_ms: _time_ms}}
request = {:completion, "Io."}
ref = RuntimeServer.handle_intellisense(pid, self(), request, [])
assert_receive {:runtime_intellisense_response, ^ref, ^request, %{items: []}}
# Checking if the module is loaded results in "Error loading module 'Elixir.Io'"
# error log, which should be ignored
refute_receive {:runtime_evaluation_output, :e1, {:stdout, _log_message}}
end
end
describe "handle_intellisense/5 given details request" do