Skip to content

Commit 9714dd7

Browse files
authored
Merge pull request #1144 from elixir-lsp/no_dets
Remove DETS
2 parents 5b43ee2 + 1370c92 commit 9714dd7

File tree

6 files changed

+13
-242
lines changed

6 files changed

+13
-242
lines changed

apps/language_server/lib/language_server/build.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ defmodule ElixirLS.LanguageServer.Build do
140140
end)
141141

142142
if Keyword.get(opts, :compile?) do
143-
Tracer.save()
144143
Logger.info("Compile took #{div(us, 1000)} milliseconds")
145144
else
146145
Logger.info("Mix project load took #{div(us, 1000)} milliseconds")

apps/language_server/lib/language_server/providers/workspace_symbols.ex

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do
6767
GenServer.start_link(__MODULE__, :ok, opts |> Keyword.put_new(:name, __MODULE__))
6868
end
6969

70-
def notify_settings_stored() do
71-
GenServer.cast(__MODULE__, :notify_settings_stored)
70+
def notify_settings_stored(project_dir) do
71+
GenServer.cast(__MODULE__, {:notify_settings_stored, project_dir})
7272
end
7373

7474
def notify_build_complete(server \\ __MODULE__) do
@@ -150,9 +150,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do
150150
end
151151

152152
@impl GenServer
153-
def handle_cast(:notify_settings_stored, state) do
154-
project_dir = :persistent_term.get(:language_server_project_dir)
155-
153+
def handle_cast({:notify_settings_stored, project_dir}, state) do
156154
# as of LSP 3.17 only one tag is defined and clients are required to silently ignore unknown tags
157155
# so there's no need to pass the list
158156
tag_support =

apps/language_server/lib/language_server/server.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1865,9 +1865,8 @@ defmodule ElixirLS.LanguageServer.Server do
18651865
state = create_gitignore(state)
18661866

18671867
if state.mix_project? do
1868-
:persistent_term.put(:language_server_project_dir, state.project_dir)
1869-
WorkspaceSymbols.notify_settings_stored()
1870-
Tracer.notify_settings_stored()
1868+
WorkspaceSymbols.notify_settings_stored(state.project_dir)
1869+
Tracer.notify_settings_stored(state.project_dir)
18711870
end
18721871

18731872
JsonRpc.telemetry(

apps/language_server/lib/language_server/tracer.ex

Lines changed: 4 additions & 192 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,8 @@ defmodule ElixirLS.LanguageServer.Tracer do
2020
GenServer.start_link(__MODULE__, args, name: __MODULE__)
2121
end
2222

23-
def notify_settings_stored() do
24-
GenServer.cast(__MODULE__, :notify_settings_stored)
25-
end
26-
27-
def save() do
28-
GenServer.cast(__MODULE__, :save)
23+
def notify_settings_stored(project_dir) do
24+
GenServer.cast(__MODULE__, {:notify_settings_stored, project_dir})
2925
end
3026

3127
defp get_project_dir() do
@@ -57,19 +53,7 @@ defmodule ElixirLS.LanguageServer.Tracer do
5753
])
5854
end
5955

60-
project_dir = :persistent_term.get(:language_server_project_dir, nil)
61-
state = %{project_dir: project_dir}
62-
63-
if project_dir != nil do
64-
{us, _} =
65-
:timer.tc(fn ->
66-
for table <- @tables do
67-
init_table(table, project_dir)
68-
end
69-
end)
70-
71-
Logger.info("Loaded DETS databases in #{div(us, 1000)}ms")
72-
end
56+
state = %{project_dir: nil}
7357

7458
{:ok, state}
7559
end
@@ -80,26 +64,12 @@ defmodule ElixirLS.LanguageServer.Tracer do
8064
end
8165

8266
@impl true
83-
def handle_cast(:notify_settings_stored, state) do
84-
project_dir = :persistent_term.get(:language_server_project_dir)
85-
maybe_close_tables(state)
86-
67+
def handle_cast({:notify_settings_stored, project_dir}, state) do
8768
for table <- @tables do
8869
table_name = table_name(table)
8970
:ets.delete_all_objects(table_name)
9071
end
9172

92-
if project_dir != nil do
93-
{us, _} =
94-
:timer.tc(fn ->
95-
for table <- @tables do
96-
init_table(table, project_dir)
97-
end
98-
end)
99-
100-
Logger.info("Loaded DETS databases in #{div(us, 1000)}ms")
101-
end
102-
10373
{:noreply, %{state | project_dir: project_dir}}
10474
end
10575

@@ -113,22 +83,8 @@ defmodule ElixirLS.LanguageServer.Tracer do
11383
{:noreply, state}
11484
end
11585

116-
def handle_cast(:save, %{project_dir: project_dir} = state) do
117-
for table <- @tables do
118-
table_name = table_name(table)
119-
120-
sync(table_name)
121-
end
122-
123-
write_manifest(project_dir)
124-
125-
{:noreply, state}
126-
end
127-
12886
@impl true
12987
def terminate(reason, state) do
130-
maybe_close_tables(state)
131-
13288
case reason do
13389
:normal ->
13490
:ok
@@ -168,112 +124,6 @@ defmodule ElixirLS.LanguageServer.Tracer do
168124
end
169125
end
170126

171-
defp maybe_close_tables(%{project_dir: nil}), do: :ok
172-
173-
defp maybe_close_tables(_state) do
174-
for table <- @tables do
175-
close_table(table)
176-
end
177-
178-
:ok
179-
end
180-
181-
defp dets_path(project_dir, table) do
182-
Path.join([project_dir, ".elixir_ls", "#{table}.dets"])
183-
end
184-
185-
def init_table(table, project_dir) do
186-
table_name = table_name(table)
187-
path = dets_path(project_dir, table)
188-
189-
opts = [file: path |> String.to_charlist(), auto_save: 60_000, repair: true]
190-
191-
:ok = path |> Path.dirname() |> File.mkdir_p()
192-
193-
case :dets.open_file(table_name, opts) do
194-
{:ok, _} ->
195-
:ok
196-
197-
{:error, {:needs_repair, _} = reason} ->
198-
Logger.warning("Unable to open DETS #{path}: #{inspect(reason)}")
199-
File.rm_rf!(path)
200-
201-
{:ok, _} = :dets.open_file(table_name, opts)
202-
203-
{:error, {:repair_failed, _} = reason} ->
204-
Logger.warning("Unable to open DETS #{path}: #{inspect(reason)}")
205-
File.rm_rf!(path)
206-
207-
{:ok, _} = :dets.open_file(table_name, opts)
208-
209-
{:error, {:cannot_repair, _} = reason} ->
210-
Logger.warning("Unable to open DETS #{path}: #{inspect(reason)}")
211-
File.rm_rf!(path)
212-
213-
{:ok, _} = :dets.open_file(table_name, opts)
214-
215-
{:error, {:not_a_dets_file, _} = reason} ->
216-
Logger.warning("Unable to open DETS #{path}: #{inspect(reason)}")
217-
File.rm_rf!(path)
218-
219-
{:ok, _} = :dets.open_file(table_name, opts)
220-
221-
{:error, {:format_8_no_longer_supported, _} = reason} ->
222-
Logger.warning("Unable to open DETS #{path}: #{inspect(reason)}")
223-
File.rm_rf!(path)
224-
225-
{:ok, _} = :dets.open_file(table_name, opts)
226-
end
227-
228-
case :dets.to_ets(table_name, table_name) do
229-
^table_name ->
230-
:ok
231-
232-
{:error, reason} ->
233-
Logger.warning("Unable to read DETS #{path}: #{inspect(reason)}")
234-
File.rm_rf!(path)
235-
236-
{:ok, _} = :dets.open_file(table_name, opts)
237-
^table_name = :dets.to_ets(table_name, table_name)
238-
end
239-
catch
240-
kind, payload ->
241-
{payload, stacktrace} = Exception.blame(kind, payload, __STACKTRACE__)
242-
error_msg = Exception.format(kind, payload, stacktrace)
243-
244-
Logger.error(
245-
"Unable to init tracer table #{table} in directory #{project_dir}: #{error_msg}"
246-
)
247-
248-
JsonRpc.show_message(
249-
:error,
250-
"Unable to init tracer tables in #{project_dir}"
251-
)
252-
253-
JsonRpc.telemetry(
254-
"lsp_server_error",
255-
%{
256-
"elixir_ls.lsp_process" => inspect(__MODULE__),
257-
"elixir_ls.lsp_server_error" => error_msg
258-
},
259-
%{}
260-
)
261-
262-
unless :persistent_term.get(:language_server_test_mode, false) do
263-
Process.sleep(2000)
264-
System.halt(1)
265-
else
266-
IO.warn("Unable to init tracer table #{table} in directory #{project_dir}: #{error_msg}")
267-
end
268-
end
269-
270-
def close_table(table) do
271-
table_name = table_name(table)
272-
sync(table_name)
273-
274-
:ok = :dets.close(table_name)
275-
end
276-
277127
defp modules_by_file_matchspec(file, return) do
278128
[
279129
{{:"$1", :"$2"},
@@ -434,11 +284,6 @@ defmodule ElixirLS.LanguageServer.Tracer do
434284
end
435285
end
436286

437-
defp sync(table_name) do
438-
:ok = :dets.from_ets(table_name, table_name)
439-
:ok = :dets.sync(table_name)
440-
end
441-
442287
defp in_project_sources?(path) do
443288
project_dir = get_project_dir()
444289

@@ -486,37 +331,4 @@ defmodule ElixirLS.LanguageServer.Tracer do
486331
:ets.safe_fixtable(table, false)
487332
end
488333
end
489-
490-
defp manifest_path(project_dir) do
491-
Path.join([project_dir, ".elixir_ls", "tracer_db.manifest"])
492-
end
493-
494-
def write_manifest(project_dir) do
495-
path = manifest_path(project_dir)
496-
File.rm_rf!(path)
497-
498-
File.write!(path, "#{@version}", [:write])
499-
end
500-
501-
def read_manifest(project_dir) do
502-
with {:ok, text} <- File.read(manifest_path(project_dir)),
503-
{version, ""} <- Integer.parse(text) do
504-
version
505-
else
506-
other ->
507-
IO.warn("Manifest: #{inspect(other)}")
508-
nil
509-
end
510-
end
511-
512-
def manifest_version_current?(project_dir) do
513-
read_manifest(project_dir) == @version
514-
end
515-
516-
def clean_dets(project_dir) do
517-
for path <-
518-
Path.join([SourceFile.Path.escape_for_wildcard(project_dir), ".elixir_ls/*.dets"])
519-
|> Path.wildcard(),
520-
do: File.rm_rf!(path)
521-
end
522334
end

apps/language_server/test/providers/references_test.exs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ defmodule ElixirLS.LanguageServer.Providers.ReferencesTest do
1010
require ElixirLS.Test.TextLoc
1111

1212
setup_all context do
13-
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/calls.dets"))
1413
{:ok, pid} = Tracer.start_link([])
1514
project_path = FixtureHelpers.get_path("")
16-
:persistent_term.put(:language_server_project_dir, project_path)
17-
Tracer.notify_settings_stored()
15+
16+
Tracer.notify_settings_stored(project_path)
1817

1918
compiler_options = Code.compiler_options()
2019
Build.set_compiler_options(ignore_module_conflict: true)

apps/language_server/test/tracer_test.exs

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,23 @@ defmodule ElixirLS.LanguageServer.TracerTest do
44
alias ElixirLS.LanguageServer.Test.FixtureHelpers
55

66
setup context do
7-
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/tracer_db.manifest"))
8-
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/calls.dets"))
9-
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/modules.dets"))
107
{:ok, _pid} = start_supervised(Tracer)
118

129
{:ok, context}
1310
end
1411

1512
test "set project dir" do
1613
project_path = FixtureHelpers.get_path("")
17-
:persistent_term.put(:language_server_project_dir, project_path)
1814

19-
Tracer.notify_settings_stored()
15+
Tracer.notify_settings_stored(project_path)
2016

2117
assert GenServer.call(Tracer, :get_project_dir) == project_path
2218
end
2319

24-
test "saves DETS" do
25-
project_path = FixtureHelpers.get_path("")
26-
:persistent_term.put(:language_server_project_dir, project_path)
27-
Tracer.notify_settings_stored()
28-
29-
Tracer.save()
30-
GenServer.call(Tracer, :get_project_dir)
31-
32-
assert File.exists?(FixtureHelpers.get_path(".elixir_ls/calls.dets"))
33-
assert File.exists?(FixtureHelpers.get_path(".elixir_ls/modules.dets"))
34-
end
35-
36-
test "skips save if project dir not set" do
37-
Tracer.save()
38-
GenServer.call(Tracer, :get_project_dir)
39-
end
40-
4120
describe "call trace" do
4221
setup context do
4322
project_path = FixtureHelpers.get_path("")
44-
:persistent_term.put(:language_server_project_dir, project_path)
45-
Tracer.notify_settings_stored()
23+
Tracer.notify_settings_stored(project_path)
4624
GenServer.call(Tracer, :get_project_dir)
4725

4826
{:ok, context}
@@ -153,18 +131,4 @@ defmodule ElixirLS.LanguageServer.TracerTest do
153131
assert [] == sorted_calls()
154132
end
155133
end
156-
157-
describe "manifest" do
158-
test "return nil when not found" do
159-
project_path = FixtureHelpers.get_path("")
160-
assert nil == Tracer.read_manifest(project_path)
161-
end
162-
163-
test "reads manifest" do
164-
project_path = FixtureHelpers.get_path("")
165-
Tracer.write_manifest(project_path)
166-
167-
assert 3 == Tracer.read_manifest(project_path)
168-
end
169-
end
170134
end

0 commit comments

Comments
 (0)