Skip to content

Commit c6bca39

Browse files
committed
Flush if all users are gone for document
1 parent 27fe839 commit c6bca39

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

lib/markdoc/doc_server.ex

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ defmodule Markdoc.DocServer do
174174
@impl true
175175
def handle_cast({:leave, channel_pid}, state) do
176176
new_users = MapSet.delete(state.users, channel_pid)
177-
new_state = %{state | users: new_users}
177+
base_state = %{state | users: new_users, idle_flush_timer: cancel_timer(state.idle_flush_timer)}
178178

179179
Logger.debug("User left document",
180180
event: :user_left,
@@ -185,14 +185,17 @@ defmodule Markdoc.DocServer do
185185
# Start cleanup timer if no users remain
186186
new_state =
187187
if MapSet.size(new_users) == 0 do
188+
flushed_state = maybe_flush(base_state, :idle_flush)
188189
timer_ref = Process.send_after(self(), :cleanup_timeout, @cleanup_timeout)
190+
189191
Logger.info("Document is now idle",
190192
event: :document_idle,
191193
cleanup_timeout_ms: @cleanup_timeout
192194
)
193-
%{new_state | cleanup_timer: timer_ref}
195+
196+
%{flushed_state | cleanup_timer: timer_ref}
194197
else
195-
new_state
198+
base_state
196199
end
197200

198201
{:noreply, new_state}
@@ -325,12 +328,16 @@ defmodule Markdoc.DocServer do
325328
# Start cleanup timer if no users remain
326329
new_state =
327330
if MapSet.size(new_users) == 0 do
331+
base_state = %{state | users: new_users, idle_flush_timer: cancel_timer(state.idle_flush_timer)}
332+
flushed_state = maybe_flush(base_state, :idle_flush)
328333
timer_ref = Process.send_after(self(), :cleanup_timeout, @cleanup_timeout)
334+
329335
Logger.info("Document is now idle",
330336
event: :document_idle,
331337
cleanup_timeout_ms: @cleanup_timeout
332338
)
333-
%{state | users: new_users, cleanup_timer: timer_ref}
339+
340+
%{flushed_state | cleanup_timer: timer_ref}
334341
else
335342
%{state | users: new_users}
336343
end
@@ -400,6 +407,12 @@ defmodule Markdoc.DocServer do
400407
Process.send_after(self(), :idle_flush, Markdoc.Storage.idle_flush_ms())
401408
end
402409

410+
defp cancel_timer(nil), do: nil
411+
defp cancel_timer(ref) do
412+
Process.cancel_timer(ref)
413+
nil
414+
end
415+
403416
defp trigger_snapshot_request(users, doc_id) do
404417
case users |> MapSet.to_list() |> Enum.take_random(1) do
405418
[pid] ->

0 commit comments

Comments
 (0)