@@ -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