Skip to content

Commit df6af9d

Browse files
committed
be more strict when DETS init fails
1 parent 9542837 commit df6af9d

File tree

2 files changed

+93
-7
lines changed

2 files changed

+93
-7
lines changed

apps/language_server/lib/language_server/server.ex

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,11 @@ defmodule ElixirLS.LanguageServer.Server do
155155
%{}
156156
)
157157

158-
Logger.info("Terminating #{__MODULE__}: #{message}")
158+
Logger.error("Terminating #{__MODULE__}: #{message}")
159159

160160
unless Application.get_env(:language_server, :test_mode) do
161-
System.stop(1)
161+
Process.sleep(2000)
162+
System.halt(1)
162163
end
163164
end
164165

@@ -1462,12 +1463,34 @@ defmodule ElixirLS.LanguageServer.Server do
14621463
# in case we missed something or restarted and don't have old_diagnostics
14631464
# we also push for all open files
14641465
uris_from_old_diagnostics =
1465-
Enum.map(old_diagnostics, &(&1.file |> SourceFile.Path.to_uri(project_dir)))
1466+
old_diagnostics
1467+
|> Enum.reject(&is_nil(&1.file))
1468+
|> Enum.map(&(&1.file |> SourceFile.Path.to_uri(project_dir)))
14661469

14671470
new_diagnostics_by_uri =
14681471
new_diagnostics
1472+
|> Enum.reject(&is_nil(&1.file))
14691473
|> Enum.group_by(&(&1.file |> SourceFile.Path.to_uri(project_dir)))
14701474

1475+
invalid_diagnostics =
1476+
new_diagnostics
1477+
|> Enum.filter(&is_nil(&1.file))
1478+
1479+
# TODO remove when we are sure diagnostic code is correct
1480+
if invalid_diagnostics != [] do
1481+
Logger.error("Invalid diagnostic with nil file: #{inspect(hd(invalid_diagnostics))}")
1482+
1483+
JsonRpc.telemetry(
1484+
"lsp_server_error",
1485+
%{
1486+
"elixir_ls.lsp_process" => inspect(__MODULE__),
1487+
"elixir_ls.lsp_server_error" =>
1488+
"Invalid diagnostic: #{inspect(hd(invalid_diagnostics))}"
1489+
},
1490+
%{}
1491+
)
1492+
end
1493+
14711494
uris_from_new_diagnostics = Map.keys(new_diagnostics_by_uri)
14721495

14731496
uris_from_open_files = Map.keys(source_files)
@@ -1881,7 +1904,24 @@ defmodule ElixirLS.LanguageServer.Server do
18811904
File.dir?(Path.join([project_dir, ".elixir_ls"])) and
18821905
not Tracer.manifest_version_current?(project_dir) do
18831906
Logger.info("DETS databases will be rebuilt")
1884-
Tracer.clean_dets(project_dir)
1907+
1908+
try do
1909+
Tracer.clean_dets(project_dir)
1910+
rescue
1911+
e ->
1912+
message =
1913+
"Unable to clean DETS databases in #{project_dir}: #{Exception.message(e)}"
1914+
1915+
Logger.error(message)
1916+
1917+
JsonRpc.show_message(
1918+
:error,
1919+
message
1920+
)
1921+
1922+
Process.sleep(2000)
1923+
System.halt(1)
1924+
end
18851925

18861926
case File.cwd() do
18871927
{:ok, cwd} ->
@@ -1908,6 +1948,9 @@ defmodule ElixirLS.LanguageServer.Server do
19081948
:error,
19091949
message
19101950
)
1951+
1952+
Process.sleep(2000)
1953+
System.halt(1)
19111954
end
19121955
else
19131956
message =
@@ -1919,6 +1962,9 @@ defmodule ElixirLS.LanguageServer.Server do
19191962
:error,
19201963
message
19211964
)
1965+
1966+
Process.sleep(2000)
1967+
System.halt(1)
19221968
end
19231969

19241970
{:error, reason} ->
@@ -1929,6 +1975,9 @@ defmodule ElixirLS.LanguageServer.Server do
19291975
:error,
19301976
message
19311977
)
1978+
1979+
Process.sleep(2000)
1980+
System.halt(1)
19321981
end
19331982
end
19341983
end

apps/language_server/lib/language_server/tracer.ex

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,28 @@ defmodule ElixirLS.LanguageServer.Tracer do
191191
Process.sleep(200)
192192
^table_name = :dets.to_ets(table_name, table_name)
193193
end
194+
catch
195+
kind, payload ->
196+
{payload, stacktrace} = Exception.blame(kind, payload, __STACKTRACE__)
197+
error_msg = Exception.format(kind, payload, stacktrace)
198+
199+
Logger.error(
200+
"Unable to init tracer table #{table} in directory #{project_dir}: #{error_msg}"
201+
)
202+
203+
JsonRpc.telemetry(
204+
"lsp_server_error",
205+
%{
206+
"elixir_ls.lsp_process" => inspect(__MODULE__),
207+
"elixir_ls.lsp_server_error" => error_msg
208+
},
209+
%{}
210+
)
211+
212+
unless Application.get_env(:language_server, :test_mode) do
213+
Process.sleep(2000)
214+
System.halt(1)
215+
end
194216
end
195217

196218
def close_table(table, project_dir) do
@@ -204,6 +226,15 @@ defmodule ElixirLS.LanguageServer.Tracer do
204226

205227
{:error, reason} ->
206228
Logger.error("Unable to close DETS #{path}, #{inspect(reason)}")
229+
230+
JsonRpc.telemetry(
231+
"lsp_server_error",
232+
%{
233+
"elixir_ls.lsp_process" => inspect(__MODULE__),
234+
"elixir_ls.lsp_server_error" => "Unable to close DETS #{path}, #{inspect(reason)}"
235+
},
236+
%{}
237+
)
207238
end
208239
end
209240

@@ -352,11 +383,17 @@ defmodule ElixirLS.LanguageServer.Tracer do
352383
:ok <- :dets.sync(table_name) do
353384
:ok
354385
else
355-
{:error, reason} ->
356-
Logger.error("Unable to sync DETS #{table_name}, #{inspect(reason)}")
357-
358386
other ->
359387
Logger.error("Unable to sync DETS #{table_name}, #{inspect(other)}")
388+
389+
JsonRpc.telemetry(
390+
"lsp_server_error",
391+
%{
392+
"elixir_ls.lsp_process" => inspect(__MODULE__),
393+
"elixir_ls.lsp_server_error" => "Unable to sync DETS #{table_name}, #{inspect(other)}"
394+
},
395+
%{}
396+
)
360397
end
361398
end
362399

0 commit comments

Comments
 (0)