@@ -277,6 +277,7 @@ handle_call({init, Overall}, _From,
277
277
tx_fun = TxFun ,
278
278
initial_childspecs = ChildSpecs }) ->
279
279
process_flag (trap_exit , true ),
280
+ LockId = mirrored_supervisor_locks :lock (Group ),
280
281
ok = pg :join (Group , Overall ),
281
282
rabbit_log :debug (" Mirrored supervisor: initializing, overall supervisor ~p joined group ~p " , [Overall , Group ]),
282
283
Rest = pg :get_members (Group ) -- [Overall ],
@@ -295,8 +296,9 @@ handle_call({init, Overall}, _From,
295
296
Delegate = delegate (Overall ),
296
297
erlang :monitor (process , Delegate ),
297
298
State1 = State # state {overall = Overall , delegate = Delegate },
298
- case errors ([maybe_start (Group , TxFun , Overall , Delegate , S )
299
- || S <- ChildSpecs ]) of
299
+ Results = [maybe_start (Group , TxFun , Overall , Delegate , S ) || S <- ChildSpecs ],
300
+ mirrored_supervisor_locks :unlock (LockId ),
301
+ case errors (Results ) of
300
302
[] -> {reply , ok , State1 };
301
303
Errors -> {stop , {shutdown , Errors }, State1 }
302
304
end ;
@@ -306,21 +308,24 @@ handle_call({start_child, ChildSpec}, _From,
306
308
delegate = Delegate ,
307
309
group = Group ,
308
310
tx_fun = TxFun }) ->
311
+ LockId = mirrored_supervisor_locks :lock (Group ),
309
312
rabbit_log :debug (" Mirrored supervisor: asked to consider starting a child, group: ~p " , [Group ]),
310
- {reply , case maybe_start (Group , TxFun , Overall , Delegate , ChildSpec ) of
311
- already_in_mnesia ->
312
- rabbit_log :debug (" Mirrored supervisor: maybe_start for group ~p ,"
313
- " overall ~p returned 'record already present'" , [Group , Overall ]),
314
- {error , already_present };
315
- {already_in_mnesia , Pid } ->
316
- rabbit_log :debug (" Mirrored supervisor: maybe_start for group ~p ,"
317
- " overall ~p returned 'already running: ~p '" , [Group , Overall , Pid ]),
318
- {error , {already_started , Pid }};
319
- Else ->
320
- rabbit_log :debug (" Mirrored supervisor: maybe_start for group ~p ,"
321
- " overall ~p returned ~p " , [Group , Overall , Else ]),
322
- Else
323
- end , State };
313
+ Result = case maybe_start (Group , TxFun , Overall , Delegate , ChildSpec ) of
314
+ already_in_mnesia ->
315
+ rabbit_log :debug (" Mirrored supervisor: maybe_start for group ~p ,"
316
+ " overall ~p returned 'record already present'" , [Group , Overall ]),
317
+ {error , already_present };
318
+ {already_in_mnesia , Pid } ->
319
+ rabbit_log :debug (" Mirrored supervisor: maybe_start for group ~p ,"
320
+ " overall ~p returned 'already running: ~p '" , [Group , Overall , Pid ]),
321
+ {error , {already_started , Pid }};
322
+ Else ->
323
+ rabbit_log :debug (" Mirrored supervisor: maybe_start for group ~p ,"
324
+ " overall ~p returned ~p " , [Group , Overall , Else ]),
325
+ Else
326
+ end ,
327
+ mirrored_supervisor_locks :unlock (LockId ),
328
+ {reply , Result , State };
324
329
325
330
handle_call ({delete_child , Id }, _From , State = # state {delegate = Delegate ,
326
331
group = Group ,
@@ -457,11 +462,9 @@ delete(Group, Id) ->
457
462
ok = mnesia :delete ({? TABLE , {Group , Id }}).
458
463
459
464
start (Delegate , ChildSpec ) ->
460
- rabbit_log :debug (" Mirrored supervisor: asked to start with delegate: ~p , child spec: ~p " , [Delegate , ChildSpec ]),
461
465
apply (? SUPERVISOR , start_child , [Delegate , ChildSpec ]).
462
466
463
467
stop (Group , TxFun , Delegate , Id ) ->
464
- rabbit_log :debug (" Mirrored supervisor: asked to stop, group: ~p , child ID: ~p " , [Group , Id ]),
465
468
try TxFun (fun () -> check_stop (Group , Delegate , Id ) end ) of
466
469
deleted -> apply (? SUPERVISOR , delete_child , [Delegate , Id ]);
467
470
running -> {error , running }
@@ -470,8 +473,6 @@ stop(Group, TxFun, Delegate, Id) ->
470
473
end .
471
474
472
475
check_stop (Group , Delegate , Id ) ->
473
- rabbit_log :debug (" Mirrored supervisor: checking if child ~p in group ~p should be stopped: ~p " ,
474
- [Id , Group , child (Delegate , Id )]),
475
476
case child (Delegate , Id ) of
476
477
undefined -> delete (Group , Id ),
477
478
deleted ;
0 commit comments