Skip to content

Commit c285d34

Browse files
committed
Make SLC closer to main
1 parent 40f8c66 commit c285d34

1 file changed

Lines changed: 22 additions & 34 deletions

File tree

packages/sync-service/lib/electric/replication/shape_log_collector.ex

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,20 @@ defmodule Electric.Replication.ShapeLogCollector do
274274
|> Enum.reduce(
275275
{state.partitions, state.event_router, state.dependency_layers, 0},
276276
fn {shape_handle, shape_id, shape}, {partitions, event_router, layers, count} = acc ->
277-
case dependency_ids(state.stack_id, shape) do
278-
{:ok, dependency_ids} ->
279-
restore_shape(
280-
{shape_handle, shape_id, shape, dependency_ids},
281-
{partitions, event_router, layers, count}
282-
)
283-
277+
# Check dependencies first - if a parent shape failed to restore,
278+
# we should skip this shape (and its children will also be skipped)
279+
with {:ok, dependency_ids} <- dependency_ids(state.stack_id, shape),
280+
{:ok, layers} <-
281+
DependencyLayers.add_dependency(layers, dependency_ids, shape_id) do
282+
partitions = restore_partitions_for_shape(partitions, shape_id, shape)
283+
284+
{
285+
partitions,
286+
EventRouter.add_shape(event_router, shape_id, shape),
287+
layers,
288+
count + 1
289+
}
290+
else
284291
# A dependency has no id mapping in ShapeStatus, e.g. it's
285292
# mid-removal. Skip this shape.
286293
:error ->
@@ -289,6 +296,14 @@ defmodule Electric.Replication.ShapeLogCollector do
289296
shape_handle: shape_handle
290297
)
291298

299+
acc
300+
301+
{:error, {:missing_dependencies, missing_deps}} ->
302+
Logger.warning(
303+
"Skipping shape during restore: missing dependencies #{inspect(MapSet.to_list(missing_deps))}",
304+
shape_handle: shape_handle
305+
)
306+
292307
acc
293308
end
294309
end
@@ -310,33 +325,6 @@ defmodule Electric.Replication.ShapeLogCollector do
310325
)
311326
end
312327

313-
defp restore_shape(
314-
{shape_handle, shape_id, shape, dependency_ids},
315-
{partitions, event_router, layers, count}
316-
) do
317-
# Check dependencies first - if a parent shape failed to restore,
318-
# we should skip this shape (and its children will also be skipped)
319-
case DependencyLayers.add_dependency(layers, dependency_ids, shape_id) do
320-
{:ok, layers} ->
321-
partitions = restore_partitions_for_shape(partitions, shape_id, shape)
322-
323-
{
324-
partitions,
325-
EventRouter.add_shape(event_router, shape_id, shape),
326-
layers,
327-
count + 1
328-
}
329-
330-
{:error, {:missing_dependencies, missing_deps}} ->
331-
Logger.warning(
332-
"Skipping shape during restore: missing dependencies #{inspect(MapSet.to_list(missing_deps))}",
333-
shape_handle: shape_handle
334-
)
335-
336-
{partitions, event_router, layers, count}
337-
end
338-
end
339-
340328
# Restoring a shape requires introspecting its root table, which can fail
341329
# while the database connection pool is still coming up (or the database is
342330
# otherwise unhealthy) — exactly the situation we're likely to be in when

0 commit comments

Comments
 (0)