Skip to content

Commit a60a7d8

Browse files
committed
Fix mistakes in handle_down_worker for exercise 23.3
1 parent f0b6d00 commit a60a7d8

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

‎chapter_23/exercise_3/src/prime_tester_load_balancer.erl‎

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222

2323
-define(SERVER, ?MODULE).
2424

25-
-record(state,{limit=0,
26-
free_pids=[],
25+
-record(state,{free_pids=[],
2726
jobs=#{},
2827
queue=queue:new()}).
2928

@@ -128,16 +127,24 @@ code_change(_OldVsn, State, _Extra) ->
128127
%%% Internal functions
129128
%%%===================================================================
130129

131-
handle_down_worker(Pid, State=#state{limit=Limit, jobs=Pids, queue=Queue}) ->
132-
io:format("got worker down"),
130+
handle_down_worker(Pid, State=#state{free_pids=FreePids, jobs=Jobs, queue=Queue}) ->
131+
io:format("Got worker down. Sending error back to caller~n"),
132+
% Send error back to the caller
133+
{From, Number} =maps:get(Pid, Jobs),
134+
gen_server:reply(From,{error,{failed_to_check, Number}}),
135+
136+
% Start a new worker in its place
137+
{ok, NewPid} =supervisor:start_child(prime_tester_worker_sup, []),
138+
_Ref=erlang:monitor(process, NewPid),
139+
133140
casequeue:out(Queue) of
134141
{{value,{From, Number}}, NewQueue} ->
135-
{ok, Pid} =supervisor:start_child(prime_tester_worker_sup, [Number]),
136-
NewPid=erlang:monitor(process, Pid),
137-
NewPids=gb_sets:insert(NewPid, maps:remove(Pid,Pids)),
138-
gen_server:reply(From,{ok, Pid}),
139-
{noreply, State#state{jobs=NewPids, queue=NewQueue}};
142+
% Start the new job
143+
ok=prime_tester_worker:is_prime(NewPid, Number),
144+
NewJobs=maps:put(NewPid, {From, Number}, maps:remove(Pid,Jobs)),
145+
146+
{noreply, State#state{jobs=NewJobs, queue=NewQueue}};
140147
{empty, _} ->
141148
% If nothing in the queue continue as before
142-
{noreply, State#state{limit=Limit+1, jobs=gb_sets:delete(Pid, Pids)}}
149+
{noreply, State#state{free_pids=[NewPid|FreePids], jobs=maps:remove(Pid, Jobs)}}
143150
end.

0 commit comments

Comments
(0)