@@ -41,16 +41,18 @@ start_child({VHost, ShovelName} = Name, Def) ->
41
41
LockId = rabbit_shovel_locks :lock (Name ),
42
42
cleanup_specs (),
43
43
rabbit_log_shovel :debug (" Starting a mirrored supervisor named '~ts ' in virtual host '~ts '" , [ShovelName , VHost ]),
44
- Result = case mirrored_supervisor :start_child (
44
+ case child_exists (Name )
45
+ orelse mirrored_supervisor :start_child (
45
46
? SUPERVISOR ,
46
47
{id (Name ), {rabbit_shovel_dyn_worker_sup , start_link , [Name , obfuscated_uris_parameters (Def )]},
47
48
transient , ? WORKER_WAIT , worker , [rabbit_shovel_dyn_worker_sup ]}) of
49
+ true -> ok ;
48
50
{ok , _Pid } -> ok ;
49
51
{error , {already_started , _Pid }} -> ok
50
52
end ,
51
53
% % release the lock if we managed to acquire one
52
54
rabbit_shovel_locks :unlock (LockId ),
53
- Result .
55
+ ok .
54
56
55
57
obfuscated_uris_parameters (Def ) when is_map (Def ) ->
56
58
to_map (rabbit_shovel_parameters :obfuscate_uris_in_definition (to_list (Def )));
@@ -70,8 +72,18 @@ stop_child({VHost, ShovelName} = Name) ->
70
72
case get ({shovel_worker_autodelete , Name }) of
71
73
true -> ok ; % % [1]
72
74
_ ->
73
- ok = mirrored_supervisor :terminate_child (? SUPERVISOR , id (Name )),
74
- ok = mirrored_supervisor :delete_child (? SUPERVISOR , id (Name )),
75
+ case mirrored_supervisor :terminate_child (? SUPERVISOR , id (Name )) of
76
+ ok ->
77
+ ok = mirrored_supervisor :delete_child (? SUPERVISOR , id (Name ));
78
+ {error , not_found } ->
79
+ % % try older format, pre 3.13.0 and 3.12.8. See rabbitmq/rabbitmq-server#9894.
80
+ case mirrored_supervisor :terminate_child (? SUPERVISOR , old_id (Name )) of
81
+ ok ->
82
+ ok = mirrored_supervisor :delete_child (? SUPERVISOR , old_id (Name ));
83
+ {error , not_found } ->
84
+ ok
85
+ end
86
+ end ,
75
87
rabbit_shovel_status :remove (Name )
76
88
end ,
77
89
rabbit_shovel_locks :unlock (LockId ),
@@ -88,23 +100,26 @@ stop_child({VHost, ShovelName} = Name) ->
88
100
cleanup_specs () ->
89
101
Children = mirrored_supervisor :which_children (? SUPERVISOR ),
90
102
91
- % % older format, pre 3.13.0 and 3.12.8. See rabbitmq/rabbitmq-server#9894
92
- OldStyleSpecsSet = sets :from_list ([element (1 , S ) || S <- Children ]),
93
- NewStyleSpecsSet = sets :from_list ([element (2 , element (1 , S )) || S <- Children ]),
94
- ParamsSet = sets :from_list ([ {proplists :get_value (vhost , S ), proplists :get_value (name , S )}
95
- || S <- rabbit_runtime_parameters :list_component (<<" shovel" >>) ]),
96
- F = fun (Name , ok ) ->
103
+ SupIdSet = sets :from_list ([element (1 , S ) || S <- Children ]),
104
+ ParamsSet = sets :from_list (
105
+ lists :flatmap (
106
+ fun (S ) ->
107
+ Name = {proplists :get_value (vhost , S ), proplists :get_value (name , S )},
108
+ % % Supervisor Id format was different pre 3.13.0 and 3.12.8.
109
+ % % Try both formats to cover the transitionary mixed version cluster period.
110
+ [id (Name ), old_id (Name )]
111
+ end ,
112
+ rabbit_runtime_parameters :list_component (<<" shovel" >>))),
113
+ F = fun (SupId , ok ) ->
97
114
try
98
- _ = mirrored_supervisor :delete_child (? SUPERVISOR , id ( Name ) )
115
+ _ = mirrored_supervisor :delete_child (? SUPERVISOR , SupId )
99
116
catch _ :_ :_Stacktrace ->
100
117
ok
101
118
end ,
102
119
ok
103
120
end ,
104
- % % Try both formats to cover the transitionary mixed version cluster period.
105
- AllSpecs = sets :union (NewStyleSpecsSet , OldStyleSpecsSet ),
106
121
% % Delete any supervisor children that do not have their respective runtime parameters in the database.
107
- SetToCleanUp = sets :subtract (AllSpecs , ParamsSet ),
122
+ SetToCleanUp = sets :subtract (SupIdSet , ParamsSet ),
108
123
ok = sets :fold (F , ok , SetToCleanUp ).
109
124
110
125
% %----------------------------------------------------------------------------
@@ -113,7 +128,8 @@ init([]) ->
113
128
{ok , {{one_for_one , 3 , 10 }, []}}.
114
129
115
130
id ({V , S } = Name ) ->
116
- {[V , S ], Name };
131
+ {[V , S ], Name }.
132
+
117
133
% % older format, pre 3.13.0 and 3.12.8. See rabbitmq/rabbitmq-server#9894
118
- id ( Other ) ->
119
- Other .
134
+ old_id ({ _V , _S } = Name ) ->
135
+ Name .
0 commit comments