Skip to content

Commit 2879e00

Browse files
committed
fix(reindex): open temporary document when file not in store after rename
After a file rename, the new file URI may not be open in Document.Store when reindexing is triggered. This caused "not_open" errors and the index was never updated, breaking references and go-to-definition for renamed modules. Add ensure_open/1 to temporarily open the file from disk if needed.
1 parent 10afb29 commit 2879e00

File tree

4 files changed

+31
-4
lines changed

4 files changed

+31
-4
lines changed

apps/engine/lib/engine/code_mod/rename.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ defmodule Engine.CodeMod.Rename do
5151

5252
defp set_rename_progress(document_changes_list, client_name) do
5353
# Progress tracking is optional - if the infrastructure isn't running
54-
# (e.g., in tests), we just skip it
54+
# (e.g., in tests), we just skip it silently
5555
try do
5656
do_set_rename_progress(document_changes_list, client_name)
5757
rescue

apps/engine/lib/engine/commands/reindex.ex

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ defmodule Engine.Commands.Reindex do
5454
end
5555

5656
defp entries_for_uri(uri) do
57-
with {:ok, %Document{} = document, %Analysis{} = analysis} <-
58-
Document.Store.fetch(uri, :analysis),
57+
with {:ok, %Document{} = document, %Analysis{} = analysis} <- ensure_open(uri),
5958
{:ok, entries} <- Indexer.Quoted.index_with_cleanup(analysis) do
6059
{:ok, document.path, entries}
6160
else
@@ -64,6 +63,20 @@ defmodule Engine.Commands.Reindex do
6463
error
6564
end
6665
end
66+
67+
defp ensure_open(uri) do
68+
case Document.Store.fetch(uri, :analysis) do
69+
{:ok, %Document{} = document, analysis} ->
70+
{:ok, document, analysis}
71+
72+
{:error, :not_open} ->
73+
# Sometimes, some operations are received long after the reindex is triggered,
74+
# such as new files after a batch rename
75+
with {:ok, _} <- Document.Store.open_temporary(uri) do
76+
Document.Store.fetch(uri, :analysis)
77+
end
78+
end
79+
end
6780
end
6881

6982
@moduledoc """

apps/engine/lib/engine/commands/rename.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ defmodule Engine.Commands.Rename do
145145
on_update_progress,
146146
on_complete
147147
) do
148+
Logger.info(
149+
"Starting rename tracking: #{map_size(uri_to_expected_operation)} operations, " <>
150+
"#{length(paths_to_reindex)} to reindex, #{length(paths_to_delete)} to delete"
151+
)
152+
148153
state =
149154
State.new(
150155
uri_to_expected_operation,

apps/expert/lib/expert/engine_api.ex

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,18 @@ defmodule Expert.EngineApi do
171171
172172
This should be called when files are changed or saved during a rename operation.
173173
The message is used to track which file operations have been completed.
174+
175+
This function is intentionally fire-and-forget - failures don't affect
176+
the main document change/save flow.
174177
"""
175178
def maybe_update_rename_progress(%Project{} = project, message) do
176-
call(project, Engine, :maybe_update_rename_progress, [message])
179+
try do
180+
call(project, Engine, :maybe_update_rename_progress, [message])
181+
rescue
182+
_ -> {:error, :not_in_rename_progress}
183+
catch
184+
:exit, _ -> {:error, :not_in_rename_progress}
185+
end
177186
end
178187

179188
defdelegate stop(project), to: EngineNode

0 commit comments

Comments
 (0)