4
4
% %
5
5
% % It spawns a pool of workers as big as online schedulers. When starting a new user, as the user is
6
6
% % identified by ID, a worker will be chosen for this user based on its ID
7
- % % (see `gen_sup_from_userid /1').
7
+ % % (see `get_sup_from_user_id /1').
8
8
% %
9
9
% % The currently running number of users is stored in an atomic that all workers update and the
10
10
% % controller can read.
17
17
18
18
% % API
19
19
-export ([handle_up_user /3 , handle_down_user /2 , count_no_of_users /0 ]).
20
- -export ([start_children /3 , stop_child /2 , stop_children /2 , terminate_all_children /0 ]).
20
+ -export ([start_children /4 , stop_child /2 , stop_children /2 , terminate_all_children /0 ]).
21
21
-export ([distribute /2 , get_all_children /0 ]).
22
22
23
23
-type count () :: non_neg_integer ().
42
42
start_link () ->
43
43
Ret = supervisor :start_link ({local , ? MODULE }, ? MODULE , no_args ),
44
44
UserSups = supervisor :which_children (? MODULE ),
45
- IndexedSupsUnsorted = [ {Pid , N } || {{amoc_users_worker_sup , N }, Pid , _ , _ } <- UserSups ,
46
- is_integer (N ), is_pid (Pid )],
45
+ IndexedSupsUnsorted = [ {Pid , N } || {{amoc_users_worker_sup , N }, Pid , _ , _ } <- UserSups ],
47
46
IndexedSups = lists :keysort (2 , IndexedSupsUnsorted ),
48
47
UserSupPidsTuple = list_to_tuple ([ Pid || {Pid , _ } <- IndexedSups ]),
49
48
SupCount = tuple_size (UserSupPidsTuple ),
@@ -72,6 +71,7 @@ init(no_args) ->
72
71
Strategy = #{strategy => one_for_one , intensity => 0 },
73
72
{ok , {Strategy , Specs }}.
74
73
74
+ % % We start from 2 to simplify user_count atomics management.
75
75
indexes () ->
76
76
lists :seq (2 , erlang :system_info (schedulers_online ) + 1 ).
77
77
@@ -104,7 +104,7 @@ handle_down_user(SupNum, Pid) when SupNum > 1 ->
104
104
stop_child (Pid , Force ) ->
105
105
case ets :lookup (? TABLE , Pid ) of
106
106
[Object ] ->
107
- Sup = gen_sup_from_userid (Object ),
107
+ Sup = get_sup_from_user_id (Object ),
108
108
amoc_users_worker_sup :stop_children (Sup , [Pid ], Force );
109
109
_ ->
110
110
ok
@@ -113,11 +113,11 @@ stop_child(Pid, Force) ->
113
113
% % Group all children based on ID to their respective worker supervisor and cast a request with each
114
114
% % group at once. This way we reduce the number of casts to each worker to always one, instead of
115
115
% % depending on the number of users.
116
- -spec start_children (amoc :scenario (), { amoc_scenario :user_id (), amoc_scenario :user_id ()} , any ()) ->
116
+ -spec start_children (amoc :scenario (), amoc_scenario :user_id (), amoc_scenario :user_id (), any ()) ->
117
117
ok .
118
- start_children (Scenario , { StartId , EndId } , ScenarioState ) ->
118
+ start_children (Scenario , StartId , EndId , ScenarioState ) ->
119
119
UserIds = lists :seq (StartId , EndId ),
120
- Assignments = maps :groups_from_list (fun gen_sup_from_userid /1 , UserIds ),
120
+ Assignments = maps :groups_from_list (fun get_sup_from_user_id /1 , UserIds ),
121
121
CastFun = fun (Sup , Users ) ->
122
122
amoc_users_worker_sup :start_children (Sup , Scenario , Users , ScenarioState )
123
123
end ,
@@ -147,7 +147,7 @@ terminate_all_children() ->
147
147
148
148
-spec stop_children_assignments ([{pid (), amoc_scenario :user_id ()}], boolean ()) -> ok .
149
149
stop_children_assignments (Users , Force ) ->
150
- Assignments = maps :groups_from_list (fun gen_sup_from_userid /1 , fun get_pid /1 , Users ),
150
+ Assignments = maps :groups_from_list (fun get_sup_from_user_id /1 , fun get_pid /1 , Users ),
151
151
CastFun = fun (Sup , Assignment ) ->
152
152
amoc_users_worker_sup :stop_children (Sup , Assignment , Force )
153
153
end ,
@@ -163,10 +163,10 @@ do_terminate_all_my_children('$end_of_table') ->
163
163
ok .
164
164
165
165
% % Helpers
166
- -spec gen_sup_from_userid ({pid (), amoc_scenario :user_id ()} | amoc_scenario :user_id ()) -> pid ().
167
- gen_sup_from_userid ({_Pid , Id }) ->
168
- gen_sup_from_userid (Id );
169
- gen_sup_from_userid (Id ) ->
166
+ -spec get_sup_from_user_id ({pid (), amoc_scenario :user_id ()} | amoc_scenario :user_id ()) -> pid ().
167
+ get_sup_from_user_id ({_Pid , Id }) ->
168
+ get_sup_from_user_id (Id );
169
+ get_sup_from_user_id (Id ) ->
170
170
# storage {sups = Supervisors , sups_count = SupCount } = persistent_term :get (? MODULE ),
171
171
Index = erlang :phash2 (Id , SupCount ) + 1 ,
172
172
element (Index , Supervisors ).
0 commit comments